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!
c++
bullet-physics
Azer
sumber
sumber
Jawaban:
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:
Jika Anda juga ingin menonaktifkan rotasi di sekitar sumbu tertentu, Anda menggunakan prosedur yang sama, tetapi menggunakan
setAngularFactor
fungsi.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.
sumber
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:
Anda dapat membaca lebih lanjut tentang callback tick tick simulasi di sini .
sumber