Madde 2.87 için, doğru yöntem, dahili simülasyon güncelleme hızında (muhtemelen 100 Hz'lik birçok) güncellenen bir kene geri çağrısına sahip olmak ve kinematik gövdelerdeki setWorldTransform () konumunu sorunsuz bir şekilde güncellemek gibi görünüyor:
Bu bölüm kılavuzdadır:
// set the rigid body as kinematic
rigid_body->setCollisionFlags(
rigid_body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
rigid_body->setActivationState(DISABLE_DEACTIVATION);
...
Bu kısmı anlamak daha zordu:
void externalTickCallback(btDynamicsWorld *world, btScalar timeStep)
{
// get object passed into user data point
Foo* foo = static_cast<Foo*>(world->getWorldUserInfo());
... loop through all the rigid bodies, maybe foo has them
{
if (rigid_body->getCollisionFlags() & btCollisionObject::CF_KINEMATIC_OBJECT)
{
btVector3 kinematic_linear_vel = ... // get velocity from somewhere
btTransform trans;
rigid_body->getMotionState()->getWorldTransform(trans);
trans.setOrigin(trans.getOrigin() + kinematic_linear_vel * time_step);
// TODO support angular velocity
rigid_body_->getMotionState()->setWorldTransform(trans);
}
}
}
...
my_dynamics_world->setInternalTickCallback(tickCallback, static_cast<void*>(this), true);
Bu, btRigidBody.h https://github.com/bulletphysics/bullet3/blob/master/src/BulletDynamics/Dynamics/btRigidBody.h içindeki yararlı belgelerdi :
/// - C) Kinematik nesneler, bunlar kütlesiz nesnelerdir, ancak kullanıcı bunları hareket ettirebilir. Tek yönlü etkileşim vardır ve Bullet, zamana, önceki ve mevcut dünya dönüşümüne göre bir hız hesaplar.
setLinearVelocity (), kinematik nesneler için çalışmaz (belki daha önceki sürümlerde kullanılmıştı?). Ancak dinamik dünya setWorldTransform () 'ı anlayacak ve kinematik nesnede getLinearVelocity ()' e yapılan çağrılar, kene geri çağrısında ayarlanan hızı döndürecektir (bu hızlar dâhili keneden keneye değişecekse muhtemelen bir ortalama döndürür).
https://github.com/bulletphysics/bullet3/issues/1204 - Sorun posterinin doğru fikri var, ancak yanıt yardımcı olmadı.