Browse Source

Merge pull request #49185 from DrRevert/inertia_nan_fix

GodotPhysics: Avoid NaNs when calculating inertias for bodies without mass/area
Rémi Verschelde 4 years ago
parent
commit
da23f99123
1 changed files with 14 additions and 9 deletions
  1. 14 9
      servers/physics_3d/body_3d_sw.cpp

+ 14 - 9
servers/physics_3d/body_3d_sw.cpp

@@ -65,16 +65,18 @@ void Body3DSW::update_inertias() {
 			// We have to recompute the center of mass.
 			// We have to recompute the center of mass.
 			center_of_mass_local.zero();
 			center_of_mass_local.zero();
 
 
-			for (int i = 0; i < get_shape_count(); i++) {
-				real_t area = get_shape_area(i);
+			if (total_area != 0.0) {
+				for (int i = 0; i < get_shape_count(); i++) {
+					real_t area = get_shape_area(i);
 
 
-				real_t mass = area * this->mass / total_area;
+					real_t mass = area * this->mass / total_area;
 
 
-				// NOTE: we assume that the shape origin is also its center of mass.
-				center_of_mass_local += mass * get_shape_transform(i).origin;
-			}
+					// NOTE: we assume that the shape origin is also its center of mass.
+					center_of_mass_local += mass * get_shape_transform(i).origin;
+				}
 
 
-			center_of_mass_local /= mass;
+				center_of_mass_local /= mass;
+			}
 
 
 			// Recompute the inertia tensor.
 			// Recompute the inertia tensor.
 			Basis inertia_tensor;
 			Basis inertia_tensor;
@@ -86,12 +88,15 @@ void Body3DSW::update_inertias() {
 					continue;
 					continue;
 				}
 				}
 
 
+				real_t area = get_shape_area(i);
+				if (area == 0.0) {
+					continue;
+				}
+
 				inertia_set = true;
 				inertia_set = true;
 
 
 				const Shape3DSW *shape = get_shape(i);
 				const Shape3DSW *shape = get_shape(i);
 
 
-				real_t area = get_shape_area(i);
-
 				real_t mass = area * this->mass / total_area;
 				real_t mass = area * this->mass / total_area;
 
 
 				Basis shape_inertia_tensor = shape->get_moment_of_inertia(mass).to_diagonal_matrix();
 				Basis shape_inertia_tensor = shape->get_moment_of_inertia(mass).to_diagonal_matrix();