FPS Arms Rigging, Adding IK and Solving Common Rigging Issues In Blender

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.

Step 01: Let’s Rig Our FPS Arms

Let’s begin by adding a bone to our scene. Ensure that you’re in object mode while doing so.

Lazy Loaded Image

While the armature/bone is selected, I’ll switch to edit mode and place the bone at the center of my mesh.

Lazy Loaded Image

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’.

Lazy Loaded Image

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.

Lazy Loaded Image

Ensure that you do not create new bones in object mode.

    Bone hierarchy should be like so:

  • Root (Already created.)
  • Bicep
  • Forearm
  • Palm

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.

Lazy Loaded Image

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:

Lazy Loaded Image

Then press “W” and subdivide:

Lazy Loaded Image

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:

Lazy Loaded Image

Lazy Loaded Image

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):

Lazy Loaded Image

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:

Lazy Loaded Image

Change the orientation

Lazy Loaded Image

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:

Lazy Loaded Image

Lastly, we’ll select the palm bone, press Control + P, and choose the option ‘Keep Offset’.

Lazy Loaded Image

Now, if you switch to Pose Mode and select the Palm bone, the finger bones should follow the palm bone:

Lazy Loaded Image

Now we can start naming our bones, so we can mirror them to the other side of the mesh.

    Bone & Name Hierarchy Reference:

  • Armature > Root Bone > Bicep.R > Forearm.R > Palm. R > Pinky1.R, Ring1.R, Middle1.R, Index1.R, Thumb1.R
  • Following fingers can be named as: Pinky2.R, Pinky3.R — Ring2.R, Ring3.R — You get the picture.
Lazy Loaded Image

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:

Lazy Loaded Image

Step 02: Adding IK (Inverse Kinematics) — Theory

(Optional Read): What is IK? Why do we need it?

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.

Step 02.1: Adding IK — In Action

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:

Lazy Loaded Image

Lazy Loaded Image

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!:

Lazy Loaded Image

Your advertisement can be placed here for $200 permanently. Suggested resolutions: 1800x663 or 1400x1400. Contact us.

Lazy Loaded Image

Increasing the length of newly created IK bone

While this bone is still selected, I’ll name it as IK.ArmTarget.R:

Lazy Loaded Image

And this one here should be renamed as IK.ArmPole.R:

Lazy Loaded Image

At this point your armature hierarchy should be looking like this:

Lazy Loaded Image

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:

Lazy Loaded Image

Then we’re going to add IK constraint:

Lazy Loaded Image

As ‘Target’ and ‘Pole Target’, we’re going to select our “Armature”, and as bones, we’re going to select these IK bones:

Lazy Loaded Image

After this, we might encounter the following problem:

Lazy Loaded Image

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.

Lazy Loaded Image

Now, if you grab the IK.ArmTarget bone, you should be able to move the attached bones like so:

Lazy Loaded Image

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:

Lazy Loaded Image

Step 03: Mirroring the Bones to the Other Side

Switch to edit mode, select all your bones, press “W” to bring up the ‘Armature Context’ menu, and choose the “Symmetrize” option.:

Lazy Loaded Image

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.

Lazy Loaded Image

Selecting the Bicep Bones

Lazy Loaded Image

Lastly, Selecting The Root Bone

Lazy Loaded Image

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:

Lazy Loaded Image

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”.

Step 03: Assigning The Armature To The Mesh

  • Select the mesh first.
  • Then the armature.
  • Ctrl P > With Automatic Weights
Lazy Loaded Image

Now, when you enter pose mode, the mesh should move with the armature.

Most Common Rigging Issues In Blender

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:

  • Either there is something wrong with the mesh itself (such as very bad topology or non-manifold geometry), in which case you need to fix your geometry; there is no way around it. Your mesh should have clearly defined inside and outside surfaces, and properly calculated normals. It shouldn’t contain any holes or missing faces. If the interior part of the mesh leaks into the exterior part of the mesh, that is also considered a non-manifold object.
  • Blender can not calculate the automatic weight distribution properly.

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:

Lazy Loaded Image

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:

(Optional Read) — A few additions that I think could be helpful if you’re going to use your armature in UE.

  • If you are working on an FPS game project, you can place the camera in Blender where the root bone is. I usually set the type of camera as ‘Perspective’ (found under ‘Data’ settings of the camera, underneath the ‘Lens’ options, which are at the very top), set the ‘Lens Unit’ to ‘Field of View’, and set the value to 90 degrees (UE’s camera’s FOV value is set to 90 by default). Of course, these settings are not strict and may be completely different depending on how you want to set up your game, but they should give you a rough idea of how your animation will look through the UE camera.
  • In this project, I was animating a side gun and the FPS hands together. A tip to fasten your workflow: If you are working on a similar project, you do not need to animate every single part of the gun by hand. You can select a part of the gun that will move with the rest of the gun, go to the Bone Constraints tab (Available in Pose Mode), and set this bone as ‘Child Of’ to the Gun Armature. Then, as the target bone, select the ‘rest_of_the_gun’ bone or whatever bone is appropriate in your case. You do not need to apply this modifier when you are done with it. When you export your animation from Blender and import it into Unreal, Blender will take care of everything, and the animation will work just as it does in Blender, in Unreal. You can apply the same logic to different bones (Such as arm bones, etc.) as well.