Auto Rig Pro: Hand Ik with Child Of constraint Bug

Auto Rig Pro Bug Report

Bug: bone arm.r unable to move or rotate when c_hand_ik.r (has a child of arm.l) and c_hand_ik.l (has a child of arm.r)

Steps:

  1. In pose mode, select c_hand_ik.l and add bone constraint “Child of”
  2. Select Target rig, choose the character rig.
  3. Select Bone, and choose arm.r bone
  4. Set c_trag influence to 0 and set the new Child Of constraint to 1
  5. In pose mode, select c_hand_ik.r and add bone constraint “Child of”
  6. Select Target rig, choose the character rig.
  7. Select Bone, and choose arm.l bone
  8. Set c_trag influence to 0 and set the new Child Of constraint to 1

Result:

  1. arm.r is unable to move or follow the c_hand_ik.r movement
  2. forearm.r becomes stretchy
  3. Elbow is pinned to the controller c_stretch_arm.r
  4. Result is the same if both hand ik have Child Of constraint with Empty objects (that is parented to the arm bones)

VIDEO: https://youtu.be/V3nmv3UvVd4
BLEND FILE:: https://drive.google.com/file/d/1jvqEhlw0vS-FLrlL55tFvqqIMN7zle16/view?usp=sharing

Any Idea how I can fix this?

Reply by the creator of Auto Rig Pro

This is actually a tricky situation. Adding such constraints leads to a cyclic dependency, here is what the Blender console is printing:

Dependency cycle detected:
OBrig/arm_ik.r/BONE_DONE() depends on
OBrig/arm_ik.r/BONE_READY() via ‘Ready → Done’
OBrig/arm_ik.r/BONE_CONSTRAINTS() via ‘Constraints → Ready’
OBrig/arm_ik_nostr.r/BONE_DONE() via ‘Copy Transforms’
OBrig/arm_ik_nostr.r/POSE_IK_SOLVER() via ‘IK Chain Result’
OBrig/c_hand_ik.r/BONE_DONE() via ‘IK’
OBrig/c_hand_ik.r/BONE_READY() via ‘Ready → Done’
OBrig/c_hand_ik.r/BONE_CONSTRAINTS() via ‘Constraints → Ready’
OBrig/arm.l/BONE_DONE() via ‘Child Of’
OBrig/arm.l/BONE_READY() via ‘Ready → Done’
OBrig/arm.l/BONE_CONSTRAINTS() via ‘Constraints → Ready’
OBrig/arm_ik.l/BONE_DONE() via ‘Copy Rotation’
OBrig/arm_ik.l/POSE_IK_SOLVER() via ‘IK Chain Result’
OBrig/c_hand_ik.l/BONE_DONE() via ‘IK’
OBrig/c_hand_ik.l/BONE_READY() via ‘Ready → Done’
OBrig/c_hand_ik.l/BONE_CONSTRAINTS() via ‘Constraints → Ready’
OBrig/arm.r/BONE_DONE() via ‘Child Of’
OBrig/arm.r/BONE_READY() via ‘Ready → Done’
OBrig/arm.r/BONE_CONSTRAINTS() via ‘Constraints → Ready’
OBrig/arm_ik.r/BONE_DONE() via ‘Copy Rotation’
Detected 4 dependency cycles

It’s a little farfetched, but this means that some bones depends on each other, and thus cant’ be evaluated properly:

c_hand_ik.l depends on arm.r, while arm.r depends on c_hand_ik.r, while c_hand_ik.r depends on arm.l, while arm.l depends on c_hand_ik.l

You can see the loop issue, c_hand_ik.l depends on itself**.**

Then such a setup is unfortunately not possible, it leads to issues.

Instead I would recommend to parent both c_hand_ik.l/.r to the same object/bone, out of the arm hierarchy, to solve this problem.

So in conclusion, you will just have to set this up differently.

1 Like