diff options
author | Andrea Catania <info@andreacatania.com> | 2020-03-24 09:59:32 +0100 |
---|---|---|
committer | Andrea Catania <info@andreacatania.com> | 2020-03-24 10:06:24 +0100 |
commit | 277696d6c50eba68ca11cf3c0988be0213e5c65d (patch) | |
tree | d0fa53e75fa1339d575d6273cbe15cbd81f9bb73 /scene/animation | |
parent | c450d4d3bbe0733785739efc46c9c0282303e79a (diff) |
Fixed IK rotation issue
Diffstat (limited to 'scene/animation')
-rw-r--r-- | scene/animation/skeleton_ik.cpp | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/scene/animation/skeleton_ik.cpp b/scene/animation/skeleton_ik.cpp index 5cdb38b5c2..5800b41ae6 100644 --- a/scene/animation/skeleton_ik.cpp +++ b/scene/animation/skeleton_ik.cpp @@ -144,8 +144,9 @@ void FabrikInverseKinematic::update_chain(const Skeleton *p_sk, ChainItem *p_cha p_chain_item->initial_transform = p_sk->get_bone_global_pose(p_chain_item->bone); p_chain_item->current_pos = p_chain_item->initial_transform.origin; - for (int i = p_chain_item->children.size() - 1; 0 <= i; --i) { - update_chain(p_sk, &p_chain_item->children.write[i]); + ChainItem *items = p_chain_item->children.ptrw(); + for (int i = 0; i < p_chain_item->children.size(); i += 1) { + update_chain(p_sk, items + i); } } @@ -286,6 +287,8 @@ void FabrikInverseKinematic::solve(Task *p_task, real_t blending_delta, bool ove return; // Skip solving } + p_task->skeleton->clear_bones_global_pose_override(); + make_goal(p_task, p_task->skeleton->get_global_transform().affine_inverse().scaled(p_task->skeleton->get_global_transform().get_basis().get_scale()), blending_delta); update_chain(p_task->skeleton, &p_task->chain.chain_root); |