Browse Source

Merge pull request #54134 from nekomatata/body-center-of-mass-local

Expose local center of mass in physics servers
Camille Mohr-Daurat 3 years ago
parent
commit
c6062cd93e

+ 4 - 1
doc/classes/PhysicsDirectBodyState2D.xml

@@ -150,7 +150,10 @@
 			The body's rotational velocity.
 		</member>
 		<member name="center_of_mass" type="Vector2" setter="" getter="get_center_of_mass">
-			The body's center of mass.
+			The body's center of mass position relative to the body's center in the global coordinate system.
+		</member>
+		<member name="center_of_mass_local" type="Vector2" setter="" getter="get_center_of_mass_local">
+			The body's center of mass position in the body's local coordinate system.
 		</member>
 		<member name="inverse_inertia" type="float" setter="" getter="get_inverse_inertia">
 			The inverse of the inertia of the body.

+ 4 - 1
doc/classes/PhysicsDirectBodyState3D.xml

@@ -159,7 +159,10 @@
 			The body's rotational velocity.
 		</member>
 		<member name="center_of_mass" type="Vector3" setter="" getter="get_center_of_mass">
-			The body's center of mass.
+			The body's center of mass position relative to the body's center in the global coordinate system.
+		</member>
+		<member name="center_of_mass_local" type="Vector3" setter="" getter="get_center_of_mass_local">
+			The body's center of mass position in the body's local coordinate system.
 		</member>
 		<member name="inverse_inertia" type="Vector3" setter="" getter="get_inverse_inertia">
 			The inverse of the inertia of the body.

+ 1 - 1
doc/classes/PhysicsServer2D.xml

@@ -919,7 +919,7 @@
 			Constant to set/get a body's inertia.
 		</constant>
 		<constant name="BODY_PARAM_CENTER_OF_MASS" value="4" enum="BodyParameter">
-			Constant to set/get a body's center of mass.
+			Constant to set/get a body's center of mass position in the body's local coordinate system.
 		</constant>
 		<constant name="BODY_PARAM_GRAVITY_SCALE" value="5" enum="BodyParameter">
 			Constant to set/get a body's gravity multiplier.

+ 1 - 1
doc/classes/PhysicsServer3D.xml

@@ -1287,7 +1287,7 @@
 			Constant to set/get a body's inertia.
 		</constant>
 		<constant name="BODY_PARAM_CENTER_OF_MASS" value="4" enum="BodyParameter">
-			Constant to set/get a body's center of mass.
+			Constant to set/get a body's center of mass position in the body's local coordinate system.
 		</constant>
 		<constant name="BODY_PARAM_GRAVITY_SCALE" value="5" enum="BodyParameter">
 			Constant to set/get a body's gravity multiplier.

+ 1 - 1
servers/physics_2d/godot_body_2d.cpp

@@ -221,7 +221,7 @@ Variant GodotBody2D::get_param(PhysicsServer2D::BodyParameter p_param) const {
 			return inertia;
 		}
 		case PhysicsServer2D::BODY_PARAM_CENTER_OF_MASS: {
-			return center_of_mass;
+			return center_of_mass_local;
 		}
 		case PhysicsServer2D::BODY_PARAM_GRAVITY_SCALE: {
 			return gravity_scale;

+ 1 - 0
servers/physics_2d/godot_body_2d.h

@@ -282,6 +282,7 @@ public:
 	void reset_mass_properties();
 
 	_FORCE_INLINE_ const Vector2 &get_center_of_mass() const { return center_of_mass; }
+	_FORCE_INLINE_ const Vector2 &get_center_of_mass_local() const { return center_of_mass_local; }
 	_FORCE_INLINE_ real_t get_inv_mass() const { return _inv_mass; }
 	_FORCE_INLINE_ real_t get_inv_inertia() const { return _inv_inertia; }
 	_FORCE_INLINE_ real_t get_friction() const { return friction; }

+ 4 - 0
servers/physics_2d/godot_body_direct_state_2d.cpp

@@ -50,6 +50,10 @@ Vector2 GodotPhysicsDirectBodyState2D::get_center_of_mass() const {
 	return body->get_center_of_mass();
 }
 
+Vector2 GodotPhysicsDirectBodyState2D::get_center_of_mass_local() const {
+	return body->get_center_of_mass_local();
+}
+
 real_t GodotPhysicsDirectBodyState2D::get_inverse_mass() const {
 	return body->get_inv_mass();
 }

+ 1 - 0
servers/physics_2d/godot_body_direct_state_2d.h

@@ -46,6 +46,7 @@ public:
 	virtual real_t get_total_linear_damp() const override;
 
 	virtual Vector2 get_center_of_mass() const override;
+	virtual Vector2 get_center_of_mass_local() const override;
 	virtual real_t get_inverse_mass() const override;
 	virtual real_t get_inverse_inertia() const override;
 

+ 1 - 1
servers/physics_3d/godot_body_3d.cpp

@@ -267,7 +267,7 @@ Variant GodotBody3D::get_param(PhysicsServer3D::BodyParameter p_param) const {
 			}
 		} break;
 		case PhysicsServer3D::BODY_PARAM_CENTER_OF_MASS: {
-			return center_of_mass;
+			return center_of_mass_local;
 		} break;
 		case PhysicsServer3D::BODY_PARAM_GRAVITY_SCALE: {
 			return gravity_scale;

+ 1 - 0
servers/physics_3d/godot_body_3d.h

@@ -200,6 +200,7 @@ public:
 
 	_FORCE_INLINE_ Basis get_principal_inertia_axes() const { return principal_inertia_axes; }
 	_FORCE_INLINE_ Vector3 get_center_of_mass() const { return center_of_mass; }
+	_FORCE_INLINE_ Vector3 get_center_of_mass_local() const { return center_of_mass_local; }
 	_FORCE_INLINE_ Vector3 xform_local_to_principal(const Vector3 &p_pos) const { return principal_inertia_axes_local.xform(p_pos - center_of_mass_local); }
 
 	_FORCE_INLINE_ void set_linear_velocity(const Vector3 &p_velocity) { linear_velocity = p_velocity; }

+ 4 - 0
servers/physics_3d/godot_body_direct_state_3d.cpp

@@ -49,6 +49,10 @@ Vector3 GodotPhysicsDirectBodyState3D::get_center_of_mass() const {
 	return body->get_center_of_mass();
 }
 
+Vector3 GodotPhysicsDirectBodyState3D::get_center_of_mass_local() const {
+	return body->get_center_of_mass_local();
+}
+
 Basis GodotPhysicsDirectBodyState3D::get_principal_inertia_axes() const {
 	return body->get_principal_inertia_axes();
 }

+ 1 - 0
servers/physics_3d/godot_body_direct_state_3d.h

@@ -46,6 +46,7 @@ public:
 	virtual real_t get_total_linear_damp() const override;
 
 	virtual Vector3 get_center_of_mass() const override;
+	virtual Vector3 get_center_of_mass_local() const override;
 	virtual Basis get_principal_inertia_axes() const override;
 
 	virtual real_t get_inverse_mass() const override;

+ 2 - 0
servers/physics_server_2d.cpp

@@ -78,6 +78,7 @@ void PhysicsDirectBodyState2D::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("get_total_angular_damp"), &PhysicsDirectBodyState2D::get_total_angular_damp);
 
 	ClassDB::bind_method(D_METHOD("get_center_of_mass"), &PhysicsDirectBodyState2D::get_center_of_mass);
+	ClassDB::bind_method(D_METHOD("get_center_of_mass_local"), &PhysicsDirectBodyState2D::get_center_of_mass_local);
 	ClassDB::bind_method(D_METHOD("get_inverse_mass"), &PhysicsDirectBodyState2D::get_inverse_mass);
 	ClassDB::bind_method(D_METHOD("get_inverse_inertia"), &PhysicsDirectBodyState2D::get_inverse_inertia);
 
@@ -124,6 +125,7 @@ void PhysicsDirectBodyState2D::_bind_methods() {
 	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "total_linear_damp"), "", "get_total_linear_damp");
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "total_gravity"), "", "get_total_gravity");
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "center_of_mass"), "", "get_center_of_mass");
+	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "center_of_mass_local"), "", "get_center_of_mass_local");
 	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "angular_velocity"), "set_angular_velocity", "get_angular_velocity");
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "linear_velocity"), "set_linear_velocity", "get_linear_velocity");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "sleeping"), "set_sleep_state", "is_sleeping");

+ 1 - 0
servers/physics_server_2d.h

@@ -49,6 +49,7 @@ public:
 	virtual real_t get_total_angular_damp() const = 0; // get density of this body space/area
 
 	virtual Vector2 get_center_of_mass() const = 0;
+	virtual Vector2 get_center_of_mass_local() const = 0;
 	virtual real_t get_inverse_mass() const = 0; // get the mass
 	virtual real_t get_inverse_inertia() const = 0; // get density of this body space
 

+ 2 - 0
servers/physics_server_3d.cpp

@@ -77,6 +77,7 @@ void PhysicsDirectBodyState3D::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("get_total_angular_damp"), &PhysicsDirectBodyState3D::get_total_angular_damp);
 
 	ClassDB::bind_method(D_METHOD("get_center_of_mass"), &PhysicsDirectBodyState3D::get_center_of_mass);
+	ClassDB::bind_method(D_METHOD("get_center_of_mass_local"), &PhysicsDirectBodyState3D::get_center_of_mass_local);
 	ClassDB::bind_method(D_METHOD("get_principal_inertia_axes"), &PhysicsDirectBodyState3D::get_principal_inertia_axes);
 
 	ClassDB::bind_method(D_METHOD("get_inverse_mass"), &PhysicsDirectBodyState3D::get_inverse_mass);
@@ -126,6 +127,7 @@ void PhysicsDirectBodyState3D::_bind_methods() {
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "inverse_inertia"), "", "get_inverse_inertia");
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "total_gravity"), "", "get_total_gravity");
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "center_of_mass"), "", "get_center_of_mass");
+	ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "center_of_mass_local"), "", "get_center_of_mass_local");
 	ADD_PROPERTY(PropertyInfo(Variant::BASIS, "principal_inertia_axes"), "", "get_principal_inertia_axes");
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "angular_velocity"), "set_angular_velocity", "get_angular_velocity");
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "linear_velocity"), "set_linear_velocity", "get_linear_velocity");

+ 1 - 0
servers/physics_server_3d.h

@@ -48,6 +48,7 @@ public:
 	virtual real_t get_total_linear_damp() const = 0;
 
 	virtual Vector3 get_center_of_mass() const = 0;
+	virtual Vector3 get_center_of_mass_local() const = 0;
 	virtual Basis get_principal_inertia_axes() const = 0;
 	virtual real_t get_inverse_mass() const = 0; // get the mass
 	virtual Vector3 get_inverse_inertia() const = 0; // get density of this body space