Fix changing Rigid Body center of mass offset

#2325 #3247
This commit is contained in:
Wojtek Figat
2025-10-08 22:16:46 +02:00
parent e2fc8a6283
commit 65cf59642c
3 changed files with 5 additions and 6 deletions

View File

@@ -159,9 +159,10 @@ void RigidBody::SetCenterOfMassOffset(const Float3& value)
{
if (value == _centerOfMassOffset)
return;
Float3 delta = value - _centerOfMassOffset;
_centerOfMassOffset = value;
if (_actor)
PhysicsBackend::SetRigidDynamicActorCenterOfMassOffset(_actor, _centerOfMassOffset);
PhysicsBackend::AddRigidDynamicActorCenterOfMassOffset(_actor, delta);
}
void RigidBody::SetConstraints(const RigidbodyConstraints value)
@@ -356,9 +357,7 @@ void RigidBody::OnDebugDrawSelected()
{
const auto collider = Cast<Collider>(child);
if (collider && collider->GetAttachedRigidBody() == this)
{
collider->OnDebugDrawSelf();
}
}
Actor::OnDebugDrawSelected();
@@ -534,7 +533,7 @@ void RigidBody::BeginPlay(SceneBeginData* data)
// Apply the Center Of Mass offset
if (!_centerOfMassOffset.IsZero())
PhysicsBackend::SetRigidDynamicActorCenterOfMassOffset(_actor, _centerOfMassOffset);
PhysicsBackend::AddRigidDynamicActorCenterOfMassOffset(_actor, _centerOfMassOffset);
// Register actor
PhysicsBackend::AddSceneActor(scene, _actor);

View File

@@ -2482,7 +2482,7 @@ Vector3 PhysicsBackend::GetRigidDynamicActorCenterOfMass(void* actor)
return P2C(actorPhysX->getCMassLocalPose().p);
}
void PhysicsBackend::SetRigidDynamicActorCenterOfMassOffset(void* actor, const Float3& value)
void PhysicsBackend::AddRigidDynamicActorCenterOfMassOffset(void* actor, const Float3& value)
{
auto actorPhysX = (PxRigidDynamic*)actor;
auto pose = actorPhysX->getCMassLocalPose();

View File

@@ -164,7 +164,7 @@ public:
static Vector3 GetRigidDynamicActorAngularVelocity(void* actor);
static void SetRigidDynamicActorAngularVelocity(void* actor, const Vector3& value, bool wakeUp);
static Vector3 GetRigidDynamicActorCenterOfMass(void* actor);
static void SetRigidDynamicActorCenterOfMassOffset(void* actor, const Float3& value);
static void AddRigidDynamicActorCenterOfMassOffset(void* actor, const Float3& value);
static bool GetRigidDynamicActorIsSleeping(void* actor);
static void RigidDynamicActorSleep(void* actor);
static void RigidDynamicActorWakeUp(void* actor);