In today’s tutorial, we will discuss how to rig FPS arms, control certain parts of our rig through Inverse Kinematics (IK), and resolve the most common rigging issues in Blender. The methods demonstrated here apply to both low and high poly arms, so the polygon count of your mesh doesn’t really matter.
Note: If you are tired of watching video tutorials and would like to see more text-based tutorials like this one from me, you can support me on Patreon so I can dedicate more time to creating them.
Let’s begin by adding a bone to our scene. Ensure that you’re in object mode while doing so.
While the armature/bone is selected, I’ll switch to edit mode and place the bone at the center of my mesh.
This is optional, but I prefer to scale down this bone a little bit so it’s not so huge and doesn’t take up the whole screen. The next thing I’m going to do is rename this bone, making it easier to select through the outliner when I need it in the future. Since this is our master bone that will be controlling every bone in this armature, I’ll name it ‘Arms_Root’.
I’m planning to use this rig in UE, and simply naming it as ‘Root’ sometimes causes problems in Unreal Engine
While we are still in edit mode (we’re in edit mode of the armature), I’ll start adding more bones and placing them around my FPS arms.
Ensure that you do not create new bones in object mode.
Bone hierarchy should be like so:
At this point, I simply duplicate the root bone (Shift + D) and, as I’ve indicated, place it around my FPS arm starting from the biceps. Once I’ve correctly positioned the new bone around my bicep, I select the circle handle facing the elbow and extrude it by pressing E, placing it from the elbow to the wrist. I’ll repeat the same action to create a bone for the palm this time.
When we have our root, bicep, forearm, and palm bones, I’ll select only the palm bone, duplicate it by pressing (Shift + D), and start placing these new bones around each finger.
Your end result should be looking like this.
Something to pay attention to here is that the starting point of each finger bone should be a little bit inside the palm, specifically where the knuckles (palm knuckles, to be very specific) are apparent. If you move your fingers in real life, you’ll notice that our fingers do not move independently from where they are attached to our palms. That’s why we’re placing these bones accordingly.
If you’re planning to animate high poly FPS arms, having only one bone for each finger won’t suffice. We need additional bones in the fingers to control them smoothly. To add these new bones, we can start by selecting each bone individually:
Then press “W” and subdivide:
As you can see in the next image, at the bottom left part of the screen, there’s an option bar that appears, allowing you to input a number as a value to tell Blender how many times you want to subdivide these selected bones. In most cases, subdividing 2 times is enough for high-poly FPS arms:
Now we’ll need to re-place these newly created bones to achieve the most precise results when animating them. The placement of the thumb bones should resemble the following: (Doesn’t need to be 100% precise):
The crucial aspect here is that the beginning section of the second bones in the fingers should be positioned beneath the finger knuckles. To manipulate these bones in the desired direction with minimal difficulty, we can adjust the orientation to ‘Normal’, select the tip of the bone we intend to move, press ‘G’, and lock the movement to the ‘Y’ axis:
Change the orientation
Reference for how knuckle bones should look.
Now, the next thing we’ll do is ensure that the parent of the finger bones is the palm bone, so when we move the palm bone, the finger bones will follow. To do this, firstly, we’ll select the starting bone of every finger bone as shown in the next image:
Lastly, we’ll select the palm bone, press Control + P, and choose the option ‘Keep Offset’.
Now, if you switch to Pose Mode and select the Palm bone, the finger bones should follow the palm bone:
Now we can start naming our bones, so we can mirror them to the other side of the mesh.
Bone & Name Hierarchy Reference:
Bone & Name Hierarchy Reference — As mentioned, do not forget to properly name all finger bones, not only the first one out of three! (Example: Thumb1.R > Thumb2.R > Thumb3.R)
The reason why I add ‘R’ (Stands for “right”) is, because I’ve created the bones for the right arm of my mesh. In Blender, there’s a tool called ‘symmetrize’, which allows you to copy the bones to the other side (in this case, the left side) if you name them as I did in this tutorial. That’s how we’re going to copy the bones to the other side.
The last thing before we copy the bones to the other side is to move this bone a little bit backward, so it will be easier to animate later on:
Inverse Kinematics (IK) is a method used in computer graphics, robotics, and animation to determine the positions and orientations of interconnected parts of a system based on the desired position of the end effector, such as a hand or a foot.
In plain English, we can think of our arm as a chain of segments (upper arm, forearm, hand). When we move our hand to a specific spot, inverse kinematics calculates the angles at our elbow and shoulder necessary to reach that spot. It’s like figuring out how to position all the joints in a chain so that the endpoint of the chain (like your hand) lands where you want it to be. This is particularly useful in animation because it allows animators to focus on the end result they want (like moving a character’s hand to touch something) without having to manually adjust each joint along the way.
Let’s start by creating our IK bones first. I’ll select my elbow bone, press “E” to extrude, then press “Alt + P” to clear its parent. After that, I’ll move it a little bit backwards so it’s easier to grab later:
We’ll do the same thing for the palm bone.
However, the difference here is that we’ll duplicate it (Shift + D), but we won’t change its location. Since leaving it in the same place as the palm bone could make it harder to grab this specific bone later on, we can increase its length a little bit. Don’t forget to clear the parent of this IK bone either!:
Your advertisement can be placed here for $200 permanently. Suggested resolutions: 1800x663 or 1400x1400. Contact us.
Increasing the length of newly created IK bone
While this bone is still selected, I’ll name it as IK.ArmTarget.R:
And this one here should be renamed as IK.ArmPole.R:
At this point your armature hierarchy should be looking like this:
Now, if we switch to “Pose Mode” and move our IK bones around, we’ll see that they do not affect anything. To make them functional, first, we’re going to select the Forearm bone, then go to the “Constraints” tab:
Then we’re going to add IK constraint:
As ‘Target’ and ‘Pole Target’, we’re going to select our “Armature”, and as bones, we’re going to select these IK bones:
After this, we might encounter the following problem:
To correct this, we can adjust our IK constraint by modifying the “Chain Length” value.
This value should be incremented based on the number of bones until we reach the bone with the IK constraint. (We need to include the bone with the IK constraint when counting.) In this case, there are two: Bicep.R and Forearm.R (IK Constraint Bone), so we’ll set it to two.
The pole angle should generally be set to -90, but in some cases, it can also be set to 90.
Now, if you grab the IK.ArmTarget bone, you should be able to move the attached bones like so:
If you want your fingers to follow the palm bone (which in most cases you’ll do, as it generates more realistic results when animating), we can select our Palm bone and add a “Damped Track” constraint in the “Bone Constraints” section.
As target, we’ll assign our “Armature” to it. The bone value should be set to IK.TargetArm.R.
Set “Head to Tail” value to 1.
As the last thing, we’ll select the IK.ArmTarget.R, go to the ‘Bone’ properties tab and uncheck the “Deform” option. We’ll uncheck this option for the root bone and IK.ArmPole.R too:
Switch to edit mode, select all your bones, press “W” to bring up the ‘Armature Context’ menu, and choose the “Symmetrize” option.:
Now, everything should be working as expected except for the Root Bone. To fix that, first, we’ll select the Bicep Bones, and lastly the root bone. Then, press “Control + P” and select the “Keep Offset” option.
Selecting the Bicep Bones
Lastly, Selecting The Root Bone
Ctrl + P > Keep Offset
Now, we’ll select the IK targets & poles first, then the root bone as last, and press “Control + P” and select the “Keep Offset” option to run the same operation on them.
Now you should be able to move everything, including the IK bones with the root bone:
As the final step, rename the armature to something else because the name “armature” occasionally causes issues in Unreal. I have chosen to name it “Human_FPS_Arms”.
Now, when you enter pose mode, the mesh should move with the armature.
This tutorial ended up being longer than I expected. Therefore, I’ve decided not to do a deep dive here but rather discuss the two most common issues that bring up the error message “Heat Weighting: Failed to find a solution for one or more bones.
Later on, I plan to write a more comprehensive guide on the methods we can use to solve such issues if these two methods do not help. However, most of the time, we encounter such errors for two reasons:
Now, let’s address the second issue. After encountering the error message ‘Heat Weighting: Failed to find a solution for one or more bones’, if you switch to weight painting mode, you might notice that the weights have been distributed incorrectly:
You can try to repaint the surface properly so that everything is painted correctly, but this method almost never works since the calculation made by Blender was wrong in the first place.
For some reason, sometimes Blender cannot calculate the weights properly even though your mesh is properly sized or at real-life scale. So what you can do in this situation is, selecting your armature and mesh, scale them up by x100, then set the parent with “With Automated Weights”. After you set the parent, you can scale down the mesh again to its initial scale.
As mentioned, why this happens is, Blender cannot calculate the weight distribution sometimes when the mesh is too small for it. To you, the mesh might appear just fine/in the correct scale but for some reason, it doesn’t work for Blender.
This’ll be all for this tutorial. If you are interested, you can check my following tutorials as well: