summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulien Nguyen <julien.nguyen3@gmail.com>2021-04-29 22:56:07 +0200
committerJulien Nguyen <julien.nguyen3@gmail.com>2022-01-06 19:14:55 +0100
commit234637ab79cd37409fc0d8c617e0ced463d1a34b (patch)
tree2338ad2fd7583f1b009094fa4c0d84a9f02b7467
parentdf491d2f1ccbd6efddc4ef2240d4b6e2e6a3e240 (diff)
Fix create physical bone when up vector is collinear to child rest origin
-rw-r--r--editor/plugins/skeleton_3d_editor_plugin.cpp8
1 files changed, 7 insertions, 1 deletions
diff --git a/editor/plugins/skeleton_3d_editor_plugin.cpp b/editor/plugins/skeleton_3d_editor_plugin.cpp
index e1b27cb045..f845d35f77 100644
--- a/editor/plugins/skeleton_3d_editor_plugin.cpp
+++ b/editor/plugins/skeleton_3d_editor_plugin.cpp
@@ -416,8 +416,14 @@ PhysicalBone3D *Skeleton3DEditor::create_physical_bone(int bone_id, int bone_chi
capsule_transform.basis = Basis(Vector3(1, 0, 0), Vector3(0, 0, 1), Vector3(0, -1, 0));
bone_shape->set_transform(capsule_transform);
+ /// Get an up vector not collinear with child rest origin
+ Vector3 up = Vector3(0, 1, 0);
+ if (up.cross(child_rest.origin).is_equal_approx(Vector3())) {
+ up = Vector3(0, 0, 1);
+ }
+
Transform3D body_transform;
- body_transform.basis = Basis::looking_at(child_rest.origin);
+ body_transform.basis = Basis::looking_at(child_rest.origin, up);
body_transform.origin = body_transform.basis.xform(Vector3(0, 0, -half_height));
Transform3D joint_transform;