Simlpified version (without using Eumin):
Open a VR template (without starter content)
In project setting, set Default RHI to DirectX 11 (prevent crash of this project) → Restart
Create new asset folder, import hand models and animation:
Import animation setting: Skeleton QK_Custom..., untick import mesh
if can’t import anim, in animation length, Set Range and set frame Import Range from 0 to 5 on import window
For AORM texture with RGB in material, connect as AO by Red, R by Green, M by Blue:
To create left and right hand input command:
Project Setting → Input → Binding
click + icon next to Action mapping twice to add 2 new mappings:
Rename as R, L thumb ANIM, choose oculus touch A and B, then X and Y
Assign hand mesh, controller and anim to VR pawn:
Open the VR pawn, Viewport → make HMD mesh invisible
Select Motion Control Right, add component: Skeletal Mesh (rename as RightHand)
choose QK hand in Details of Mesh:
Set the location, rotation and scale at following reading (fit the real life hand grab position)
Repeat the same steps for left hand controller, except the transform data change to below
Go to both MotionController Left and Right, Visualization, untick Display Device Model (to hide controller in VR view)
Create animation BP:
R click on QK hand mesh, create → Anim BP, rename as BP_HandAmin, open it
In VR template → BP, R click , BP, Enumeration, rename as Enum_HandAmin, open it
click +add Enumerator 5 times, rename them as open, grip, pointing, thumbup, objecthold,
also name enum desctiption as Enum For Hand Pose Animation
Create another Enummeration, rename as Enum_ObjectType, add 5 times also and name as below:
Go to Hand BP for state machine:
Add following 2 variables:
Create a state machine name as HandAnimations, open it
→ in Entry, add state, name as Open → open it
drag QK open anim and collect:
back to HandAnimations, add new state name as Grip, repeat the same anim drag step
double click the transition icon between Open and Grip state:
Drag Handstate variable in graph,type == to get Equal (Enum) node
connect as follow:
then copy 1st two nodes, open reverse transition from Grip to Open, paste the copied nodes in reverse transition. change grip to open:
Add Thumbsup State, repeat the same steps in their transitions:
From grip to thumbsup transition:
From Thumbsup reverse to grip transtion:
For Pointing state:
After Thumbsup and pointing set, drag pointing state back to grip:
Open its transition, set as follow:
Create the Reverse from grip to pointing:
Drag Open to Pointing:
Drag Open to thumbsup:
Reverse:
So the basic animation setup becomes:
From Open state, add Object State, open it and drag Anim QK Grip:
Open it transition, put objecthold this time:
reverse its transtition:
To add Anim in VR pawn:
Go to VR pawn, viewport, select LeftHand mesh on Component → Change Anim Class and mode:
Repeat the same on RighHand
Go to Evnet Graph → Event Begin node, set BP as follow: Rename set node (from promote variable) as LeftHandAnim, name category as HandAnimations
Repeat the same on Right Hand,
Command as VR hand Animation Setup, connect back to begin play Branch:
Set different Boolean to let Anim BP determine which anim state to set the hand into when we press specific button:
Keep in event graph, add variable (Boolean), name as RightGripAnim, category choose HandAnimations
Duplicate it, rename as RightPointAnim
Duplicate again, reaname as RightThumbAnim
Repeat the same as LeftGrip...
Go to the most bottom blank space in event graph, create nodes as follow by dragging and Set the boolean above :
Go to InputAction TriggerLeft/Right nodes (default there), drag Point Boolean in them:
Go to InputAction Grab Left nodes (also default there), place Grab boolean in between:
Repeat the same on Right node
Go to BP HandAnim, event graph
Duplicate (except first 4 nodes: event begin, get player pawn, cast to VR pawn, Sequence) all the nodes for right hand:
Connect new nodes from sequence node and cast to VR pawn node as follow:
Tips: to replace from left to right nodes faster, create reroute node (double click on the line) after each anim, type right node needed, and then connect to the reroute nodes directly, delete the left node afterward
The final nodes are like this: