Saya telah berhasil mengintegrasikan perpustakaan Bullet Physics ke sistem entitas / komponen saya. Entitas dapat saling bertabrakan. Sekarang saya harus memungkinkan mereka untuk bertabrakan dengan medan, yang terbatas dan seperti kubus (pikirkan InfiniMiner atau tiruannya Minecraft ). Saya hanya mulai menggunakan perpustakaan Bullet Physics kemarin, jadi mungkin saya kehilangan sesuatu yang jelas.
Sejauh ini saya telah memperluas RigidBody
kelas untuk menimpa checkCollisionWith(CollisionObject co)
fungsi. Saat ini hanya pemeriksaan asal sederhana, tidak menggunakan bentuk lainnya. Saya akan mengulanginya nanti. Untuk saat ini terlihat seperti ini:
@Override
public boolean checkCollideWith(CollisionObject co) {
Transform t = new Transform();
co.getWorldTransform(t);
if(COLONY.SolidAtPoint(t.origin.x, t.origin.y,t.origin.z)){
return true;
}
return false;
}
Ini berfungsi dengan baik, sejauh mendeteksi ketika tabrakan terjadi. Namun, ini tidak menangani respons tabrakan. Tampaknya respons tumbukan default adalah memindahkan objek bertabrakan di luar bentuk masing-masing, mungkin AABBs mereka.
Saat ini bentuk medan hanyalah kotak seukuran dunia. Ini berarti entitas yang bertabrakan dengan medan hanya menembak ke luar kotak ukuran dunia. Jadi jelas bahwa saya harus memodifikasi respons tumbukan atau saya perlu membuat bentuk yang sesuai langsung dengan bentuk medan. Jadi opsi mana yang terbaik dan bagaimana cara mengimplementasikannya? Mungkin ada opsi yang tidak saya pikirkan?
Perlu dicatat bahwa medannya dinamis dan sering dimodifikasi oleh pemain.
sumber
Saya mengalami beberapa masalah dengan strategi yang diterapkan dalam jawaban saya yang lain. Titik kontak kadang-kadang akan bertahan, itu agak berantakan untuk melakukan bentuk selain kubus dan kadang-kadang akan memungkinkan benda untuk menyelinap melalui medan.
Jadi, alih-alih memodifikasi atau mengganti kelas Bullet mana pun, ada opsi alternatif menggunakan objek tabrakan Bullet bawaan yang akan mewakili medan. Itu
BvhTriangleMeshShape
( doc ) adalah dibangun dalam bentuk yang diwakili oleh mesh segitiga.Mesh ini dapat dihasilkan pada saat yang sama dengan mesh untuk memvisualisasikan dunia. Ini berarti bahwa objek fisika dapat mencocokkan objek yang diberikan dengan tepat.
Saya membuat
RigidBody
untuk setiap potongan di medan saya. Bentuk tubuh itu diatur keBvhTriangleMeshShape
. Ketika medan diubah, pada saat yang sama saya membangun kembali representasi visual bongkahan, saya juga membangun kembali bentuk fisika. Kemudian, ketika tiba saatnya untuk buffer bentuk visual, saya juga menukar bentuk fisika seperti:Ini memastikan bahwa tubuh dikeluarkan dengan benar, membersihkan titik kontak. Kemudian bentuknya diubah dan ditambahkan kembali.
Untuk menghasilkan
BvhTriangleMeshShape
setiap chunk harus mempertahankanTriangleIndexVertexArray
( doc ). Ini pada dasarnya adalah buffer dua byte. Satu dengan posisi simpul segitiga dan yang lainnya dengan indeks untuk membangun segitiga itu. Array vertex ini harus dipertahankan sebagaiBvhTriangleMeshShape
tidak membuat salinan data.Menggunakan semua yang dibangun di kelas fisika Bullet kemungkinan lebih cepat daripada apa pun yang bisa saya tulis, dan memang berjalan sangat cepat. Saya belum melihat adanya perlambatan setelah menerapkan strategi baru ini.
sumber
Saya tidak terbiasa dengan Fisika Peluru, tapi saya sudah menggunakan ODE. Di sana, setelah tes tabrakan ya atau tidak, ada tes tabrakan bentuk-bentuk yang lebih rinci yang menghasilkan satu set titik kontak.
Dalam kasus Anda, dunia Anda adalah kumpulan kotak, sehingga Anda bisa melakukan ini:
Ini bukan mendefinisikan ulang respons tabrakan ; ini adalah lapisan sebelumnya. Respon tumbukan ditentukan sepenuhnya oleh titik kontak yang dihitung dari tumbukan.
Seperti yang saya katakan, saya tidak akrab dengan Bullet Physics, jadi saya tidak tahu apakah arsitekturnya sesuai dengan ini.
sumber