From cff2ab046a06a3884c3a075925c8a7ae92b5ce3c Mon Sep 17 00:00:00 2001 From: DavidWyand-GG Date: Sun, 9 Feb 2014 18:10:53 -0500 Subject: [PATCH] Bullet physics applyImpulse() fix Bullet physics requires a local origin be passed into it's applyImpulse() rather than a world origin. --- Engine/source/T3D/physics/bullet/btBody.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Engine/source/T3D/physics/bullet/btBody.cpp b/Engine/source/T3D/physics/bullet/btBody.cpp index 0c37de0c5..77c3b8115 100644 --- a/Engine/source/T3D/physics/bullet/btBody.cpp +++ b/Engine/source/T3D/physics/bullet/btBody.cpp @@ -335,16 +335,22 @@ void BtBody::applyImpulse( const Point3F &origin, const Point3F &force ) AssertFatal( mActor, "BtBody::applyImpulse - The actor is null!" ); AssertFatal( isDynamic(), "BtBody::applyImpulse - This call is only for dynamics!" ); + // Convert the world position to local + MatrixF trans = btCast( mActor->getCenterOfMassTransform() ); + trans.inverse(); + Point3F localOrigin( origin ); + trans.mulP( localOrigin ); + if ( mCenterOfMass ) { - Point3F relOrigin( origin ); + Point3F relOrigin( localOrigin ); mCenterOfMass->mulP( relOrigin ); Point3F relForce( force ); mCenterOfMass->mulV( relForce ); mActor->applyImpulse( btCast( relForce ), btCast( relOrigin ) ); } else - mActor->applyImpulse( btCast( force ), btCast( origin ) ); + mActor->applyImpulse( btCast( force ), btCast( localOrigin ) ); if ( !mActor->isActive() ) mActor->activate();