Perhitungan Tensor Inersia


10

Sedikit pertanyaan yang rumit dan panjang yang, saya akui, saya belum cukup mengerti sehingga saya akan mencoba dan menjelaskan sebaik mungkin.

Versi Pendek: Apakah ada rumus c ++ / Physx umum di luar sana untuk menghitung tensor inersia berdasarkan bentuk objek?

Versi Panjang: Untuk fisika kita, kita perlu menentukan tensor inersia x, y dan z. Saat ini cara kita melakukannya cukup banyak hanya berdasarkan rasio massa. Jadi jika sebuah objek panjang pada sumbu X dan tipis pada Y dan Z, dan massanya adalah 10.000, kita akan mengatur Z dan Y menjadi 7000 dan X hingga 3000. (Ini tidak tepat, tetapi hanya untuk memberikan ide)

Ini bekerja relatif baik tetapi masalah terbesar kami adalah ketika ada ketidakstabilan bersama di suatu tempat, kami harus terus menebak pada tensor sampai kami menemukan yang terbaik. Ini bisa menjadi sangat memakan waktu jika kita memiliki simulasi fisika yang sangat besar dan satu dari 20+ sambungan menyebabkan semua yang lain kehilangan stabilitas.

Apa yang saya kerjakan adalah fungsi yang akan mengambil kotak pembatas objek dan mudah-mudahan menghitung tensor yang relatif akurat. Saya telah mengambil beberapa matematika dari http://en.wikipedia.org/wiki/List_of_moment_of_inertia_tensors dan membuat fungsi yang pada dasarnya berfungsi seperti berikut untuk rotasi serupa di bawah ini.

Berbentuk kubus padat lebar w, tinggi h, kedalaman d, dan massa m masukkan deskripsi gambar di sini

Atau jika rotasi berakhir, seperti ini:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Jadi, ini sepertinya memberi saya hasil yang mirip dengan cara kami melakukannya, tapi saya tidak ingin beralih ke cara ini tanpa memastikan bahwa itu akan berfungsi untuk penggunaan umum. Di bawah ini adalah kode untuk fungsi saya berdasarkan gambar pertama dengan kubus dan poros tengah.

NxVec3 CalculateInertiaTensor( VisBoundingBox_cl boundingBox, float m )
{
    float width = boundingBox.GetSizeX();
    float height = boundingBox.GetSizeZ();
    float depth = boundingBox.GetSizeY();

    float xTensor = 0.083f * m*(height*height + depth*depth);
    float yTensor = 0.083f * m*(width*width + depth*depth);
    float zTensor = 0.083f * m*(width*width + height*height);

    return NxVec3(xTensor, yTensor, zTensor);
}

Saya tidak dapat menjamin bahwa ini adalah cara yang tepat untuk melakukannya (karena cara yang paling akurat adalah dengan menggunakan bentuk aktual alih-alih kotak pembatas) dan saya tidak terlalu terbiasa dengan tensor inersia dan matematika tetapi tampaknya mengembalikan angka cukup mirip dengan apa yang kami gunakan. Adakah yang tahu kalau ada cara yang lebih baik untuk melakukan ini?


3
Jika Anda dapat menguraikan objek menjadi tetrahedra maka Anda harus dapat menggunakan linearitas tensor bersama dengan rumus dasar untuk momen inersia tetrahedron (Anda dapat menemukan ini dengan Wolfram Alpha, misalnya) untuk menghitung yang tepat tensor. Kekhawatiran saya dengan metode kotak pembatas adalah bahwa itu benar-benar tergantung pada berapa banyak BB Anda mengisi objek; bayangkan perbedaan antara ellipsoid yang gemuk dan pegas heliks yang ramping, misalnya.
Steven Stadnicki

Terima kasih atas masukannya. Dan Anda benar, masalah utama saya muncul ketika ada, katakanlah, objek berbentuk 'A', BB akan membuat tensor kembali secara tidak benar. Saya akan memeriksa info Anda, terima kasih!
Mungoid

Sama-sama - jika Anda ingin saya menyempurnakan ini secara lebih rinci, saya harus dapat membangun jawaban yang tepat darinya, tetapi itu sudah cukup untuk membantu Anda memulai.
Steven Stadnicki

Jika Anda mau, itu akan luar biasa! Saya telah mencoba untuk mencari tahu ini untuk sementara waktu tetapi saya masih sedikit pemula di daerah ini sehingga saya akhirnya membuat diri saya semakin bingung = -)
Mungoid

Jawaban:


7

Saya akan menyarankan bahwa ini adalah masalah yang sulit karena formulasi biasa yang didasarkan pada penggunaan Green's Teorem untuk mengubah integral volume menjadi integral permukaan tidak berlaku, dan Anda benar-benar harus memberikan dekomposisi tetrahedral pada gambar Anda - tetapi ternyata bahwa itu tidak benar. Selama bentuk Anda memiliki kerapatan yang seragam (yang merupakan perkiraan yang sudah Anda buat, mungkin, dan yang masuk akal untuk sebagian besar keadaan) maka volume integral dapat disederhanakan ke permukaan integral, dan yang terakhir disederhanakan lebih jauh. Lebih baik lagi, tampaknya ada algoritma dan kode yang cukup tampan di internet untuk melakukan ini; lihat di http://www.cs.berkeley.edu/~jfc/mirtich/massProps.html, Halaman Brian Mirtich menjelaskan algoritmanya untuk menghitung momen dan pusat massa. Ini harus mencakup hampir semua kebutuhan Anda di bagian depan ini. Perhatikan bahwa ini adalah sesuatu yang ingin Anda lakukan satu kali, baik sebagai alat untuk ekspor bentuk atau pada waktu impor, tetapi bukan sesuatu yang harus Anda lakukan setiap bingkai; hanya menyimpan tensor inersia tentang pusat massa bersama dengan sisa info bentuk, dan jika Anda perlu menemukan tensor untuk momen inersia tentang beberapa sumbu lain maka Anda dapat menggunakan teorema standar untuk menurunkannya.

Mudah-mudahan ini harus mencakup apa yang Anda butuhkan - jika ada lagi yang bisa saya coba bantu, beri tahu saya!


4

Saya belum pernah melakukan ini sendiri, tetapi jika saya harus menulis solusi cepat untuk jerat arbitrer saya mungkin akan menghasilkan titik massa yang cukup di dalam objek untuk memperkirakannya dan menghitung tensor inersia dari itu.

Poin bisa dihasilkan secara seragam di dalam kotak pembatas bentuk dan kemudian membuang yang berada di luar bentuk sebenarnya. Ini akan mengurangi masalah menjadi hanya memeriksa apakah suatu titik berada di dalam bentuk.


0

Untuk sebagian besar aplikasi game (yaitu "meledakkan barang") hanya menggunakan persamaan untuk persegi panjang yang diberikan di atas mungkin cukup baik. Asalkan objek sejajar sumbu, bukan diagonal melintasi kotak pembatas, yang seharusnya berfungsi. Beberapa mesin fisika gim, seperti ODE, hanya menggunakan istilah pada diagonal utama dari tensor inersia. Untuk itu, objek Anda harus setidaknya sejajar sumbu untuk bekerja dengan benar.

Saya menggunakan algoritma Mirtich di Falling Bodies kembali pada tahun 1997. Ini bekerja dengan baik, tetapi Anda harus memiliki geometri bersih - sebuah mesh non-berpotongan self-berpotongan yang benar secara topologis. Jika ada lubang, perhitungan inersia akan menghasilkan hasil yang benar-benar palsu. Saya hanya menggunakan geometri cembung, jadi saya menjalankan QHull pertama untuk mendapatkan lambung cembung untuk keperluan tabrakan, kemudian menghitung inersia dari itu.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.