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

Expose local center of mass in physics servers
This commit is contained in:
Camille Mohr-Daurat 2021-11-08 18:44:51 -07:00 committed by GitHub
commit c6062cd93e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 30 additions and 6 deletions

View file

@ -150,7 +150,10 @@
The body's rotational velocity. The body's rotational velocity.
</member> </member>
<member name="center_of_mass" type="Vector2" setter="" getter="get_center_of_mass"> <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>
<member name="inverse_inertia" type="float" setter="" getter="get_inverse_inertia"> <member name="inverse_inertia" type="float" setter="" getter="get_inverse_inertia">
The inverse of the inertia of the body. The inverse of the inertia of the body.

View file

@ -159,7 +159,10 @@
The body's rotational velocity. The body's rotational velocity.
</member> </member>
<member name="center_of_mass" type="Vector3" setter="" getter="get_center_of_mass"> <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>
<member name="inverse_inertia" type="Vector3" setter="" getter="get_inverse_inertia"> <member name="inverse_inertia" type="Vector3" setter="" getter="get_inverse_inertia">
The inverse of the inertia of the body. The inverse of the inertia of the body.

View file

@ -919,7 +919,7 @@
Constant to set/get a body's inertia. Constant to set/get a body's inertia.
</constant> </constant>
<constant name="BODY_PARAM_CENTER_OF_MASS" value="4" enum="BodyParameter"> <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>
<constant name="BODY_PARAM_GRAVITY_SCALE" value="5" enum="BodyParameter"> <constant name="BODY_PARAM_GRAVITY_SCALE" value="5" enum="BodyParameter">
Constant to set/get a body's gravity multiplier. Constant to set/get a body's gravity multiplier.

View file

@ -1287,7 +1287,7 @@
Constant to set/get a body's inertia. Constant to set/get a body's inertia.
</constant> </constant>
<constant name="BODY_PARAM_CENTER_OF_MASS" value="4" enum="BodyParameter"> <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>
<constant name="BODY_PARAM_GRAVITY_SCALE" value="5" enum="BodyParameter"> <constant name="BODY_PARAM_GRAVITY_SCALE" value="5" enum="BodyParameter">
Constant to set/get a body's gravity multiplier. Constant to set/get a body's gravity multiplier.

View file

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

View file

@ -282,6 +282,7 @@ public:
void reset_mass_properties(); 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() 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_mass() const { return _inv_mass; }
_FORCE_INLINE_ real_t get_inv_inertia() const { return _inv_inertia; } _FORCE_INLINE_ real_t get_inv_inertia() const { return _inv_inertia; }
_FORCE_INLINE_ real_t get_friction() const { return friction; } _FORCE_INLINE_ real_t get_friction() const { return friction; }

View file

@ -50,6 +50,10 @@ Vector2 GodotPhysicsDirectBodyState2D::get_center_of_mass() const {
return body->get_center_of_mass(); 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 { real_t GodotPhysicsDirectBodyState2D::get_inverse_mass() const {
return body->get_inv_mass(); return body->get_inv_mass();
} }

View file

@ -46,6 +46,7 @@ public:
virtual real_t get_total_linear_damp() const override; virtual real_t get_total_linear_damp() const override;
virtual Vector2 get_center_of_mass() 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_mass() const override;
virtual real_t get_inverse_inertia() const override; virtual real_t get_inverse_inertia() const override;

View file

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

View file

@ -200,6 +200,7 @@ public:
_FORCE_INLINE_ Basis get_principal_inertia_axes() const { return principal_inertia_axes; } _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() 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_ 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; } _FORCE_INLINE_ void set_linear_velocity(const Vector3 &p_velocity) { linear_velocity = p_velocity; }

View file

@ -49,6 +49,10 @@ Vector3 GodotPhysicsDirectBodyState3D::get_center_of_mass() const {
return body->get_center_of_mass(); 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 { Basis GodotPhysicsDirectBodyState3D::get_principal_inertia_axes() const {
return body->get_principal_inertia_axes(); return body->get_principal_inertia_axes();
} }

View file

@ -46,6 +46,7 @@ public:
virtual real_t get_total_linear_damp() const override; virtual real_t get_total_linear_damp() const override;
virtual Vector3 get_center_of_mass() 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 Basis get_principal_inertia_axes() const override;
virtual real_t get_inverse_mass() const override; virtual real_t get_inverse_mass() const override;

View file

@ -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_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"), &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_mass"), &PhysicsDirectBodyState2D::get_inverse_mass);
ClassDB::bind_method(D_METHOD("get_inverse_inertia"), &PhysicsDirectBodyState2D::get_inverse_inertia); 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::FLOAT, "total_linear_damp"), "", "get_total_linear_damp");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "total_gravity"), "", "get_total_gravity"); 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"), "", "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::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::VECTOR2, "linear_velocity"), "set_linear_velocity", "get_linear_velocity");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "sleeping"), "set_sleep_state", "is_sleeping"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "sleeping"), "set_sleep_state", "is_sleeping");

View file

@ -49,6 +49,7 @@ public:
virtual real_t get_total_angular_damp() const = 0; // get density of this body space/area 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() 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_mass() const = 0; // get the mass
virtual real_t get_inverse_inertia() const = 0; // get density of this body space virtual real_t get_inverse_inertia() const = 0; // get density of this body space

View file

@ -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_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"), &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_principal_inertia_axes"), &PhysicsDirectBodyState3D::get_principal_inertia_axes);
ClassDB::bind_method(D_METHOD("get_inverse_mass"), &PhysicsDirectBodyState3D::get_inverse_mass); 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, "inverse_inertia"), "", "get_inverse_inertia");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "total_gravity"), "", "get_total_gravity"); 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"), "", "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::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, "angular_velocity"), "set_angular_velocity", "get_angular_velocity");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "linear_velocity"), "set_linear_velocity", "get_linear_velocity"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "linear_velocity"), "set_linear_velocity", "get_linear_velocity");

View file

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