วิธีปิดการใช้งานการเคลื่อนไหวแกน Y ในเอนจินของกระสุนฟิสิกส์


11

ฉันต้องการสร้างวัตถุมากกว่าเคลื่อนที่ไปตามแกน X และ Z เท่านั้นในขณะที่ปิดการใช้งานแกน Y (มันเหมือนกับการเคลื่อนที่ใน 2D และวัตถุจะไม่ล้มลง)

ขณะนี้ฉันกำลังใช้ข้อ จำกัด 6 dof เพื่อ จำกัด การเคลื่อนไหวในแกน Y แต่มันไม่ทำงาน:

btRigidBody* zeroBody = new btRigidBody(0, NULL, NULL); // Create the body that we attach things to
btRigidBody* robot = mCarChassis->getBulletRigidBody();

btGeneric6DofConstraint* constrict = new btGeneric6DofConstraint(*robot, *zeroBody, btTransform::getIdentity(), btTransform::getIdentity(), false);

constrict->setLinearLowerLimit( btVector3( 1, 1, 1));
constrict->setLinearUpperLimit( btVector3(-1, 1,-1));

constrict->setAngularLowerLimit( btVector3( 1,  1,  1) );
constrict->setAngularUpperLimit( btVector3(-1, -1, -1) );

mBulletWorld->getBulletDynamicsWorld()->addConstraint(constrict);

ขอบคุณ!


บางทีนี่อาจช่วยได้: bulletphysics.org/Bullet/phpBB3/ … , อาจตั้งค่าขีด จำกัด ล่าง / บนสำหรับแกน Y เป็น 0 แทนที่จะเป็น 1
deceleratedcaviar

คำตอบ:


20

วิธีที่ต้องการเพื่อให้บรรลุสิ่งนี้ใน Bullet คือการตั้งค่าปัจจัยเชิงเส้นและอาจเป็นปัจจัยเชิงมุมสำหรับร่างกายที่เป็นปัญหา วิธีนี้นำเสนอเป็นข้อมูลโค้ดที่หน้า Bullet Wiki

ในการอนุญาตให้เคลื่อนไหวตามแกน Y เท่านั้นคุณจะใช้สิ่งนี้:

body->setLinearFactor(btVector3(0,1,0));

หากคุณต้องการปิดการใช้งานการหมุนรอบแกนใด ๆ เพิ่มเติมคุณใช้กระบวนการเดียวกัน แต่ใช้setAngularFactorฟังก์ชันแทน

ในวิดีโอตัวอย่างง่าย ๆ นี้ฉันใช้การเรียกสองครั้งต่อไปนี้เพื่อปิดการเคลื่อนไหวตามแกน Y และเพื่ออนุญาตให้หมุนรอบแกน Y เท่านั้น สิ่งนี้บังคับให้ร่างกายยังคงอยู่ในระนาบ XZ ที่มันถูกสร้างขึ้นในตอนแรก

body->setLinearFactor(btVector3(1,0,1));
body->setAngularFactor(btVector3(0,1,0));

2

วิธีหนึ่งในการทำเช่นนี้คือการสร้างการเรียกกลับเห็บฟิสิกส์ สิ่งนี้จะถูกเรียกทุกครั้งที่มีสัญลักษณ์แสดงหัวข้อย่อยภายใน ในการโทรกลับนี้คุณสามารถตั้งค่าความเร็ว Y เป็น 0 เพื่อปิดการใช้งานการเคลื่อนไหว Y ได้อย่างมีประสิทธิภาพ มันจะมีลักษณะเช่นนี้:

void myTickCallback(const btDynamicsWorld *world, btScalar timeStep) {
    //robotBody is the btRigidBody you want to constrain the movement of
    btVector3 velocity = robotBody->getLinearVelocity();
    robotBody->setLinearVelocity(velocity.x, 0, velocity.z);
} 

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการจำลองการเรียกกลับเห็บที่นี่


ขอขอบคุณ! นี่เป็นคำตอบที่ยอดเยี่ยมเนื่องจากมันใช้กับพอร์ต java ของ JBullet เช่นกัน (ต่างจากคำตอบอื่น ๆ )
joehot200
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.