สำหรับ bullet 2.87 ดูเหมือนว่าวิธีการที่เหมาะสมคือการติ๊กติ๊กที่ปรับปรุงอัตราการจำลองสถานการณ์ภายใน (อาจเป็น 100 Hz จำนวนมาก) และ setWorldTransform () บนเนื้อจลนศาสตร์จะทำการอัปเดตตำแหน่งได้อย่างราบรื่น:
ส่วนนี้อยู่ในคู่มือ:
// set the rigid body as kinematic
rigid_body->setCollisionFlags(
rigid_body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
rigid_body->setActivationState(DISABLE_DEACTIVATION);
...
ส่วนนี้ยากกว่าที่จะเข้าใจ:
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);
นี่เป็นเอกสารที่มีประโยชน์ใน btRigidBody.h https://github.com/bulletphysics/bullet3/blob/master/src/BulletDynamics/Dynamics/btRigidBody.h :
/// - C) วัตถุ Kinematic ซึ่งเป็นวัตถุที่ไม่มีมวล แต่ผู้ใช้สามารถเคลื่อนย้ายวัตถุเหล่านั้นได้ มีการโต้ตอบทางเดียวและ Bullet จะคำนวณความเร็วตามการประทับเวลาและการแปลงโลกก่อนหน้าและปัจจุบัน
setLinearVelocity () ไม่สามารถใช้ได้กับวัตถุจลน์ศาสตร์ (อาจเคยเป็นรุ่นก่อนหน้านี้หรือไม่) แต่โลกพลวัตจะเข้าใจ setWorldTransform () และการเรียกใช้ getLinearVelocity () บนวัตถุจลศาสตร์นั้นจะคืนค่าความเร็วที่กำหนดในการเรียกกลับเห็บ
https://github.com/bulletphysics/bullet3/issues/1204 - โปสเตอร์ปัญหามีความคิดที่ถูกต้อง แต่การตอบกลับไม่เป็นประโยชน์