Cara menonaktifkan gerakan sumbu Y di mesin fisika Bullet

11

Saya ingin membuat objek daripada hanya bergerak sepanjang sumbu X dan Z, sambil menjaga sumbu Y dinonaktifkan (seperti gerakan dalam 2D, dan objek tidak akan jatuh).

Saat ini saya menggunakan batasan 6 dof untuk membatasi gerakan pada sumbu Y, tetapi tidak berfungsi:

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);

Terima kasih!

Azer
sumber
Mungkin ini akan membantu: bulletphysics.org/Bullet/phpBB3/… , mungkin juga mengatur batas Bawah / Atas untuk sumbu Y ke 0, bukan 1.
deceleratedcaviar

Jawaban:

20

Cara yang disukai untuk mencapai ini dalam Bullet adalah dengan mengatur faktor linier dan mungkin faktor sudut untuk tubuh yang bersangkutan. Metode ini disajikan sebagai Cuplikan Kode di halaman Bullet Wiki.

Untuk memungkinkan gerakan sepanjang hanya sumbu Y, Anda akan menggunakan sesuatu seperti ini:

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

Jika Anda juga ingin menonaktifkan rotasi di sekitar sumbu tertentu, Anda menggunakan prosedur yang sama, tetapi menggunakan setAngularFactorfungsi.

Dalam contoh video sederhana ini saya telah menggunakan dua panggilan berikut untuk menonaktifkan gerakan di sepanjang sumbu Y dan untuk memungkinkan rotasi di sekitar hanya sumbu Y. Ini secara efektif memaksa tubuh untuk tetap berada di pesawat XZ di mana ia awalnya dibuat.

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

Salah satu cara untuk melakukan ini adalah dengan membuat callback tick fisika. Ini akan disebut setiap kali bullet ticks internal. Dalam panggilan balik ini Anda dapat mengatur kecepatan Y ke 0, secara efektif menonaktifkan gerakan Y. Akan terlihat seperti ini:

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);
} 

Anda dapat membaca lebih lanjut tentang callback tick tick simulasi di sini .

MichaelHouse
sumber
Terima kasih! Ini adalah jawaban yang bagus, karena juga berlaku untuk port java JBullet juga (tidak seperti jawaban lainnya).
joehot200