Setting Up Head IK
To test out UE4’s IK system, we will create a basic head IK system that allows the in-game character to position its head bone at the player’s in-world head location as well as bend its torso to match. Note that this works only if a player is standing still and not walking around the room, because the player’s torso is not tracked.
Before starting, create a new project based on the Third Person Template with no starter content. This allows you to use the player model that comes with that template to test your IK Blueprints.
To know if your IK system is working, it would be nice to see what your in-game character looks like while playing in VR. To do this, you can create a simple mirror Material and render Texture:
Create two new folders in the Content Browser, the first named Materials and the second named Textures.
Inside the Textures folder, add a new Render Target called MirrorRenderTarget (Add New → Materials & Textures → Render Target).
Set both Size X and Size Y to 512 (see Figure 7.3).
Inside the Materials folder, create a new blank Material called MirrorMat.
Open this Material and set its Shading Model to Unlit.
From the Content Browser, drag the MirrorRenderTarget into your MirrorMat.
Create a new TextureCoordinate node (U + click the graph) and set its UTiling to –1.
Pass this TextureCoordinate into the UVs input of your TextureSample (see Figure 7.4). This flips your Mirror Texture to make it more mirrorlike.
Figure 7.4 Mirror Material
Save and close this Material. Head back to the main engine window.
From the Modes tab, search and drag in a SceneCapture2D Actor, setting its Location to (X = –650.0, Y = 390.0, Z = 260.0) and Rotation to (Pitch = 0.0, Yaw = –180.0, Roll = 0.0). This positions it in front of the player.
Set this SceneCapture2D’s Texture Target to the MirrorRenderTarget Texture. This puts whatever this camera captures into this Texture.
From the Modes panel again, drag in a basic Cube and set its Location to (X = –640.0, Y = 390.0, Z = 260.0) and Scale to (X = 0.01, Y = 2.0, Z = 2.0); see Figure 7.5.
Figure 7.5 Scene capture and mirror mesh
Apply the MirrorMat to the Cube’s Material Element 0.
Figure 7.3 Mirror Render Target
Before the IK is set up, you need a Pawn to hold the Components you reference in the Animation Blueprint:
Create a new folder in the Content Browser named Blueprints.
Inside the Blueprints folder, create a new Animation Blueprint (Add New → Animation→ Animation Blueprint), then select the UE4_Mannequin_Skeleton option in the Animation Blueprint creation dialog (see Figure 7.6). This will hold all the IK logic that will be used later.
Figure 7.6 Animation Blueprint creation
Name this Animation Blueprint IKAnimBP.
Inside the Blueprints folder again, create a new Pawn named IKPawn.
Open this new Pawn and add three new Components: a SkeletalMesh, Camera, and Scene.
Name the Scene Component CameraRoot and attach the Camera to it.
Set the Camera to be at 170 Z height and 10 units forward in the X-axis (see Figure 7.7). This will affect the height of the Camera for testing with a monitor; however, because the Camera’s position is reset to its root component when a VR game is launched, the Camera will be in the appropriate position for VR.
Figure 7.7 IKPawn simple Camera setup
Rotate the SkeletalMesh –90 on the Z-axis. This ensures that the mesh faces down the X-axis.
Set the SkeletalMesh’s Skeletal Mesh property to the SK_Mannequin from the Third Person Template.
Set the SkeletalMesh’s Anim Class to IKAnimBP.
Head IK Animation Blueprint
To apply the IK to the skeleton of the template character, you will use the FABRIK system because there are more than two bones from the head to the pelvis in this skeleton. Although you can chain two-bone IK nodes to get a similar effect, this can be a pain; the FABRIK node will work well for the head IK.
Open the IKAnimBP Animation Blueprint and create a new variable named HeadWorldTransform of type Transform.
Set the HeadWorldTransform’s default Location value to 160 units in the Z-axis and the default Rotation to 90 degrees in the Z-axis. This ensures that the head faces forward in preview windows.
Drag off of the TryGetPawnOwner node in the Event Graph and cast to the newly created IKPawn.
Drag off of the As IKPawn blue output pin of the cast and get the Camera Component from the Pawn.
Create a setter for the HeadWorldTransform variable and attach it to the Cast Succeeded pin of CastToIKPawn.
Drag off of the Camera Component getter and call GetWorldTransform, passing in the output to the setter for HeadWorldTransform (see Figure 7.8). You are using world space transforms in this example because they are easier to work with.
Figure 7.8 Animation Blueprint: head transform setup
Head into the Anim Graph and create a new PlayThirdPersonIdle node.
Create a new FABRIK node and connect the HeadWorldTransform variable to the Effector Transform input pin.
Select the FABRIK node and set the Effector Transform Space to World Space. This is because the Camera transform you are using is in world space.
Set the Tip Bone to “head” and the Root Bone to “spine_01” (see Figure 7.9). The FABRIK node will handle IK on all the bones between the two you just selected.
Figure 7.9 Animation Blueprint: simple head IK
Drag the output of the PlayThirdPersonIdle animation into the input of the FABRIK node. UE4 will automatically convert from Local to Component space for you.
Drag from the output of the FABRIK node into the input of the FinalAnimationPose node. Again, UE4 will automatically transform the coordinates for you. After this step the IK will work; however, it will not account for the rotation of the headset.
A quick note before the head rotation is added: In Figure 7.10, notice that the head bone’s forward axis (red) is facing up, which means that you need to take this into account when setting this bone’s rotation. Create a new Transform (Modify) Bone node in the Anim Graph.
Figure 7.10 UE4 default skeleton head rotation
Set the transform node’s Bone to Modify attribute to “head.”
Set the Rotation Mode to Replace Existing and the Rotation Space to World Space (see Figure 7.11).
Figure 7.11 Animation Blueprint: head bone rotation
Create a new CombineRotators node, passing in the value (Pitch = 90.0, Yaw = –90.0, Roll = 0.0) in the first input pin to account for the initial bone rotation.
Create a variable getter for the HeadWorldTransform variable and pass its rotation to the CombineRotators by splitting its output pin, then passing in the blue Rotation pin as the second argument (see Figure 7.11).
Connect the output of CombineRotators to the Rotation pin of Transform (Modify) Bone.
Connect the Transform (Modify) Bone between the FABRIK and ComponentToLocal node.
Now that the Pawn and Animation Blueprint are complete, test out your IK by deleting the default Pawn that is in the Third Person Example Map and dragging in your custom IKPawn. Then, set Auto Possess Player to Player 0 (this allows you to use this Pawn in your level without having a game mode set up) and hit Play. If you are using an Oculus Rift, tracking will default to Eye Level, so you may need to set the tracking level origin to Floor (see Chapter 2, “Head Mounted Display Setup”).