Walaupun saya belum pernah bekerja dengan mesin fisika peluru, saya telah melakukan sesuatu yang sangat mirip pada mesin fisika lain. Cara saya memecahkannya adalah dengan mengatur kecepatan linear tubuh kaku daripada menerjemahkannya secara langsung. Gerakan dan tabrakan kemudian secara otomatis ditangani oleh fase pembaruan mesin fisika.
Dari dokumentasi sepertinya ada btRigidBody::setLinearVelocity
metode yang dapat Anda gunakan. Jadi misalnya, jika Anda tidak ingin terjadi akselerasi, cukup atur kecepatan linier ke nilai yang sesuai setiap kali karakter bergerak, dan atur kembali ke (0,0,0) ketika karakter seharusnya berhenti (yaitu ketika pemain melepaskan kunci).
Adapun nilai yang digunakan, pendekatan yang biasa akan dimulai dengan kecepatan yang diinginkan dari karakter Anda (sebagai float / skalar) dan kemudian kalikan dengan vektor yang dinormalisasi yang menunjuk ke arah yang ingin Anda pindahkan. Dari apa yang saya lihat btVector3
kelas sudah memiliki metode untuk semua ini.
Sebagai alternatif, Anda dapat mempertimbangkan memperlakukan karakter sebagai objek fisika lengkap, dan menangani gerakan menggunakan metode applyForce
atau applyImpulse
. Ini akan menghasilkan akselerasi tubuh, sehingga karakter Anda akan memiliki momentum dan hasilnya mungkin akan terlihat lebih baik dengan cara ini. Tetapi Anda perlu mengambil beberapa langkah tambahan, misalnya, dengan memastikan kecepatan linier tidak pernah melebihi batas tertentu, baik dengan menjepitnya atau bermain-main dengan redaman / gesekan. Jadi akan sedikit lebih sulit untuk mengimplementasikan dan finetune.
Percobaan dengan kedua pendekatan dan kemudian pilih salah satu yang berperilaku paling dekat dengan kebutuhan Anda.
Sebagai catatan, pengalaman saya dengan fisika menggunakan Chimpunk di mesin game 2D, tapi saya cukup yakin konsep ini diterjemahkan menjadi 3D.
Saya berasumsi bahwa karakter Anda adalah tubuh fisika dengan berat dan semacamnya. Cara terbaik untuk melakukan ini adalah melakukan simulasi berjalan yang sangat sederhana. Pikirkan seperti ini: Jika Anda berdiri, kaki Anda memiliki banyak gesekan, jadi Anda tidak hanya meluncur. Saat bergerak, kira-kira sama dengan menghilangkan gesekan itu (karena Anda tidak menahan gerakan dengan kaki) dan menerapkan gaya arah. Saya tidak mengatakan bahwa Anda harus secara individual mensimulasikan setiap kaki yang mendorong ke tanah - tubuh yang kaku adalah yang Anda inginkan.
Di sinilah menjadi sedikit rumit:
Jika Anda menyesuaikan kekuatan dan redaman dengan benar, menerapkan gaya akan selalu memberi Anda hasil yang paling realistis, terutama jika karakter akan mendorong benda-benda. Menerjemahkan akan menjadi cara terburuk untuk melakukannya, karena mesin fisika tidak benar-benar menganggap itu sebagai gerakan. Mengatur kecepatan secara langsung agak lebih baik, tetapi dalam pengalaman saya, hasil terbaik dapat diperoleh dengan menggunakan gaya dan redaman.
Semoga saya menjelaskan ini dengan cukup baik. Jangan ragu untuk bertanya apakah Anda perlu klarifikasi. :)
sumber
Untuk bullet 2.87 tampaknya metode yang tepat adalah memiliki tick callback yang memperbarui pada kecepatan pembaruan simulasi internal (mungkin banyak 100-an Hz), dan setWorldTransform () pada badan kinematik akan dengan lancar memperbarui posisi:
Bagian ini ada di manual:
Bagian ini lebih sulit untuk dipahami:
Ini adalah dokumentasi yang bermanfaat di btRigidBody.h https://github.com/bulletphysics/bullet3/blob/master/src/BulletDynamics/Dynamics/btRigidBody.h :
setLinearVelocity () tidak berfungsi untuk objek kinematik (mungkin dulu di versi sebelumnya?). Tetapi dunia dinamika akan memahami setWorldTransform () dan panggilan untuk getLinearVelocity () pada objek kinematik akan mengembalikan kecepatan yang ditetapkan dalam tick callback (ini mungkin mengembalikan rata-rata jika kecepatan itu berubah dari tick internal ke tick).
https://github.com/bulletphysics/bullet3/issues/1204 - poster masalah memiliki ide yang tepat tetapi responsnya tidak membantu.
sumber