diff options
author | fabriceci <fabricecipolla@gmail.com> | 2021-11-21 23:06:50 +0100 |
---|---|---|
committer | fabriceci <fabricecipolla@gmail.com> | 2021-11-22 13:36:51 +0100 |
commit | a86d73ef3bfa0374e7a08a49ff8267cae00808c3 (patch) | |
tree | 18ae14d2b4ab847df506d273b104390a1c89eeb5 /scene | |
parent | ed02b8af59fceb48798c857306335fe0f7ff6a8a (diff) |
Fix body stuck in some 3d advanced scenario
Diffstat (limited to 'scene')
-rw-r--r-- | scene/3d/physics_body_3d.cpp | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/scene/3d/physics_body_3d.cpp b/scene/3d/physics_body_3d.cpp index 5cb7f431e3..b731e0a2da 100644 --- a/scene/3d/physics_body_3d.cpp +++ b/scene/3d/physics_body_3d.cpp @@ -1584,6 +1584,7 @@ void CharacterBody3D::_set_collision_direction(const PhysicsServer3D::MotionResu Vector3 prev_wall_normal = wall_normal; int wall_collision_count = 0; Vector3 combined_wall_normal; + Vector3 tmp_wall_col; // Avoid duplicate on average calculation. for (int i = p_result.collision_count - 1; i >= 0; i--) { const PhysicsServer3D::MotionCollision &collision = p_result.collisions[i]; @@ -1630,8 +1631,11 @@ void CharacterBody3D::_set_collision_direction(const PhysicsServer3D::MotionResu } // Collect normal for calculating average. - combined_wall_normal += collision.normal; - wall_collision_count++; + if (!collision.normal.is_equal_approx(tmp_wall_col)) { + tmp_wall_col = collision.normal; + combined_wall_normal += collision.normal; + wall_collision_count++; + } } if (r_state.wall) { |