|
@@ -249,26 +249,6 @@ void FabrikInverseKinematic::make_goal(Task *p_task, const Transform3D &p_invers
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static Vector3 get_bone_axis_forward_vector(Skeleton3D *skeleton, int p_bone) {
|
|
|
- // If it is a child/leaf bone...
|
|
|
- if (skeleton->get_bone_parent(p_bone) > 0) {
|
|
|
- return skeleton->get_bone_rest(p_bone).origin.normalized();
|
|
|
- }
|
|
|
- // If it has children...
|
|
|
- Vector<int> child_bones = skeleton->get_bone_children(p_bone);
|
|
|
- if (child_bones.size() == 0) {
|
|
|
- WARN_PRINT_ONCE("Cannot calculate forward direction for bone " + itos(p_bone));
|
|
|
- WARN_PRINT_ONCE("Assuming direction of (0, 1, 0) for bone");
|
|
|
- return Vector3(0, 1, 0);
|
|
|
- }
|
|
|
- Vector3 combined_child_dir = Vector3(0, 0, 0);
|
|
|
- for (int i = 0; i < child_bones.size(); i++) {
|
|
|
- combined_child_dir += skeleton->get_bone_rest(child_bones[i]).origin.normalized();
|
|
|
- }
|
|
|
- combined_child_dir = combined_child_dir / child_bones.size();
|
|
|
- return combined_child_dir.normalized();
|
|
|
-}
|
|
|
-
|
|
|
void FabrikInverseKinematic::solve(Task *p_task, real_t blending_delta, bool override_tip_basis, bool p_use_magnet, const Vector3 &p_magnet_position) {
|
|
|
if (blending_delta <= 0.01f) {
|
|
|
// Before skipping, make sure we undo the global pose overrides
|
|
@@ -307,7 +287,7 @@ void FabrikInverseKinematic::solve(Task *p_task, real_t blending_delta, bool ove
|
|
|
new_bone_pose.origin = ci->current_pos;
|
|
|
|
|
|
if (!ci->children.is_empty()) {
|
|
|
- Vector3 forward_vector = get_bone_axis_forward_vector(p_task->skeleton, ci->bone);
|
|
|
+ Vector3 forward_vector = (ci->children[0].initial_transform.origin - ci->initial_transform.origin).normalized();
|
|
|
// Rotate the bone towards the next bone in the chain:
|
|
|
new_bone_pose.basis.rotate_to_align(forward_vector, new_bone_pose.origin.direction_to(ci->children[0].current_pos));
|
|
|
|