mirror of
https://github.com/godotengine/godot
synced 2024-09-05 11:18:27 +00:00
Expose local center of mass in physics servers
Center of mass in body's local space is more useful than the transformed one in some cases, like drawing its position for debug. It's especially useful to get the generated local center of mass when in auto mode (by default). Physics Server BODY_PARAM_CENTER_OF_MASS: Now always returns the local center of mass, instead of setting a local center of mass and getting a transformed one. This causes compatibility breaking, but it makes more sense for the parameter to be consistent between getter and setter. Direct Body State: There are now two properties, because both of them can be useful in different situations. center_of_mass: relative position in global coordinates (same as before) center_of_mass_local: position in local coordinates
This commit is contained in:
parent
25bea73544
commit
fc8c766ef9
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue