From e544275500a10cce28427b8d088fb0df0a19fad6 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Tue, 23 Feb 2016 12:07:14 -0800 Subject: [PATCH] Physics: extrapolate kinematic objects as well as dynamic ones. --- libraries/physics/src/EntityMotionState.cpp | 2 +- .../physics/src/ThreadSafeDynamicsWorld.cpp | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/libraries/physics/src/EntityMotionState.cpp b/libraries/physics/src/EntityMotionState.cpp index 8c0dab98db..ff7d550175 100644 --- a/libraries/physics/src/EntityMotionState.cpp +++ b/libraries/physics/src/EntityMotionState.cpp @@ -191,7 +191,7 @@ void EntityMotionState::getWorldTransform(btTransform& worldTrans) const { } // This callback is invoked by the physics simulation at the end of each simulation step... -// iff the corresponding RigidBody is DYNAMIC and has moved. +// iff the corresponding RigidBody is active. void EntityMotionState::setWorldTransform(const btTransform& worldTrans) { if (!_entity) { return; diff --git a/libraries/physics/src/ThreadSafeDynamicsWorld.cpp b/libraries/physics/src/ThreadSafeDynamicsWorld.cpp index b6f3487f1a..17b2b08d4d 100644 --- a/libraries/physics/src/ThreadSafeDynamicsWorld.cpp +++ b/libraries/physics/src/ThreadSafeDynamicsWorld.cpp @@ -96,19 +96,26 @@ void ThreadSafeDynamicsWorld::synchronizeMotionState(btRigidBody* body) { ///@todo: add 'dirty' flag //if (body->getActivationState() != ISLAND_SLEEPING) { + btTransform bodyTransform; + btVector3 bodyLinearVelocity, bodyAngularVelocity; if (body->isKinematicObject()) { ObjectMotionState* objectMotionState = static_cast(body->getMotionState()); if (objectMotionState->hasInternalKinematicChanges()) { objectMotionState->clearInternalKinematicChanges(); - body->getMotionState()->setWorldTransform(body->getWorldTransform()); } - return; + bodyTransform = body->getWorldTransform(); + bodyLinearVelocity = body->getLinearVelocity(); + bodyAngularVelocity = body->getAngularVelocity(); + } else { + bodyTransform = body->getInterpolationWorldTransform(); + bodyLinearVelocity = body->getInterpolationLinearVelocity(); + bodyAngularVelocity = body->getInterpolationAngularVelocity(); } + + // integrate the object foward to cover the time in-between fixed time steps. + btScalar dt = (m_latencyMotionStateInterpolation && m_fixedTimeStep) ? m_localTime - m_fixedTimeStep : m_localTime * body->getHitFraction(); btTransform interpolatedTransform; - btTransformUtil::integrateTransform(body->getInterpolationWorldTransform(), - body->getInterpolationLinearVelocity(),body->getInterpolationAngularVelocity(), - (m_latencyMotionStateInterpolation && m_fixedTimeStep) ? m_localTime - m_fixedTimeStep : m_localTime*body->getHitFraction(), - interpolatedTransform); + btTransformUtil::integrateTransform(bodyTransform, bodyLinearVelocity, bodyAngularVelocity, dt, interpolatedTransform); body->getMotionState()->setWorldTransform(interpolatedTransform); } }