Fix collision detection for degenerate capsules

In GodotCapsuleShape3D::get_supports and
GodotCapsuleShape2D::get_supports, return a point instead of an edge of
length zero in case the capsule degenerates to a sphere or circle.
This commit is contained in:
Ricardo Buring 2022-12-06 13:12:05 +01:00
parent a8a88194a5
commit 29ab86aa7d
2 changed files with 8 additions and 12 deletions

View file

@ -369,8 +369,9 @@ void GodotCapsuleShape2D::get_supports(const Vector2 &p_normal, Vector2 *r_suppo
Vector2 n = p_normal;
real_t d = n.y;
real_t h = height * 0.5 - radius; // half-height of the rectangle part
if (Math::abs(d) < (1.0 - _SEGMENT_IS_VALID_SUPPORT_THRESHOLD)) {
if (h > 0 && Math::abs(d) < (1.0 - _SEGMENT_IS_VALID_SUPPORT_THRESHOLD)) {
// make it flat
n.y = 0.0;
n.normalize();
@ -378,13 +379,10 @@ void GodotCapsuleShape2D::get_supports(const Vector2 &p_normal, Vector2 *r_suppo
r_amount = 2;
r_supports[0] = n;
r_supports[0].y += height * 0.5 - radius;
r_supports[0].y += h;
r_supports[1] = n;
r_supports[1].y -= height * 0.5 - radius;
r_supports[1].y -= h;
} else {
real_t h = height * 0.5 - radius;
n *= radius;
n.y += (d > 0) ? h : -h;
r_amount = 1;

View file

@ -521,8 +521,9 @@ void GodotCapsuleShape3D::get_supports(const Vector3 &p_normal, int p_max, Vecto
Vector3 n = p_normal;
real_t d = n.y;
real_t h = height * 0.5 - radius; // half-height of the cylinder part
if (Math::abs(d) < edge_support_threshold) {
if (h > 0 && Math::abs(d) < edge_support_threshold) {
// make it flat
n.y = 0.0;
n.normalize();
@ -531,13 +532,10 @@ void GodotCapsuleShape3D::get_supports(const Vector3 &p_normal, int p_max, Vecto
r_amount = 2;
r_type = FEATURE_EDGE;
r_supports[0] = n;
r_supports[0].y += height * 0.5 - radius;
r_supports[0].y += h;
r_supports[1] = n;
r_supports[1].y -= height * 0.5 - radius;
r_supports[1].y -= h;
} else {
real_t h = height * 0.5 - radius;
n *= radius;
n.y += (d > 0) ? h : -h;
r_amount = 1;