Kuarter dan rotasi di sekitar poros dunia

11

Penafian: Saya seorang programmer game profesional, dan menggunakan angka empat kali hampir setiap hari, tetapi mereka mendekati ilmu hitam. Saya relatif di rumah dengan matematika tetapi angka imajiner selalu membingungkan saya. Saya cenderung memperlakukan quats sebagai berguna dan akhirnya membalikkan perkalian lebih dari sekali. Saya mencoba untuk beralasan tentang mereka seperti saya lakukan dengan matriks dengan keberhasilan terbatas.

Bagaimanapun....

Yang membuat saya bingung, adalah sebagai berikut. Ketika saya ingin memutar objek di sekitar itu poros lokal saya kalikan rotasinya dengan angka empat yang mewakili rotasi yang ingin saya terapkan. Oleh karena itu, ini adalah rotasi di ruang lokal.

Sekarang jika saya ingin memutarnya di sekitar poros di ruang dunia, alasan saya adalah: Ambil rotasi di ruang dunia sebagai angka empat. Lipat gandakan rotasi objek saya dengan angka empat ini. Ini akan membawa rotasi dunia saya di ruang lokal. Lipat gandakan rotasi saya dengan angka empat baru ini. yaitu: newRot = oldRot * (invers oldRot * worldRot)

Namun, yang perlu saya lakukan adalah newRot = oldRot * (inverse oldRot * worldRot) * oldRot.

Mengapa saya, setelah mengalikan dengan quat terbalik masih perlu mengalikan dengan quat saya sendiri sebelum menerapkannya? Saya tahu pasti ada alasan yang sah dan sempurna, tetapi saya tidak bisa mencari jalan keluar darinya dan itu membuat saya frustrasi. Saya mencoba berbagai faqs dan yang lainnya, tetapi sebagian besar masuk ke dalam matematika, membuatnya kurang jelas bagi saya.

Adakah yang bisa menjelaskan hal ini kepada saya seperti saya berusia 5 tahun?

Kaj
sumber
Bukankah ini sedikit mirip dengan terjemahan matriks dan roatations (mis. Anda perlu memindahkan objek Anda ke tengah, memutar dan kemudian kembali ketika Anda ingin memutar item di sekitarnya sendiri: Minv_transl * Mrot * Mtransl)
Valmond
I try to reason about them like I would with matrices- maka Anda berada di jalur yang benar. Jika Anda memahami cara memutar sumbu objek dan sumbu dunia menggunakan matriks, Anda dapat melakukan hal yang sama menggunakan angka empat. Urutan perkalian adalah sama untuk keduanya, matriks dan angka empat.
Maik Semder

Jawaban:

11

Kuota bersifat asosiatif:

Anda menyebutkan bahwa solusi Anda adalah:

newRot = oldRot * (inverse oldRot * worldRot) * oldRot

yang sama dengan:

newRot = oldRot * inverse oldRot * worldRot * oldRot

yang sama dengan:

newRot = identity * worldRot * oldRot
newRot = worldRot * oldRot

yang sebenarnya membawa Anda kembali ke apa yang sebenarnya terjadi:

localTransformed = oldRot * rot
worldTransformed = rot * oldRot

Urutan aplikasi berubah, itu saja. Kembali ke matriks, ketika Anda menerapkan matriks objek ke matriks transformasi dan menyimpannya sebagai matriks objek baru Anda, itulah transformasi ruang lokal Anda. Ketika Anda menerapkan matriks transformasi ke objek matriks dan menyimpannya, itulah Anda transformasi dunia. Ini semua tentang urutan aplikasi dan tidak lebih.

Richard Fabian
sumber
1
+1 untuk bagian pertama, bagian kedua agak menyesatkan. Jika Anda hanya akan menggunakan 'busuk' dalam sampel kode terakhir, alih-alih 'localRot' dan 'worldRot', contohnya menjadi lebih jelas. Kalau tidak, itu menyiratkan bahwa membusuk itu sendiri bagaimanapun berbeda . Tetapi perbedaannya hanya terletak pada urutan multiplikasi, seperti yang Anda tunjukkan, bukan pada angka empat yang berbeda ('localRot' dan 'worldRot'). 'localTransformed' dan 'worldTransformed' akan lebih baik sebagai: 'rotatedAroundLocalAxis' dan 'rotatedAroundWorldAxis'. Itu sendiri akan menjelaskan persamaan dan membuat paragraf terakhir menjadi usang, yang memiliki beberapa kekurangan.
Maik Semder
Kelemahan pada paragraf terakhir: perbedaan antara matriks dan transformasi (keduanya sama di sini dan dapat dipertukarkan, jadi lebih baik menggunakan matriks adil untuk mencegah kebingungan) dan istilah "transformasi ruang lokal" dan "transformasi dunia": akan lebih benar untuk mengatakan, persamaan pertama memberi Anda 'matriks lokal-ke-dunia' setelah diputar di sekitar sumbu lokal objek, yang kedua memberi Anda 'matriks lokal-ke-dunia' setelah diputar di sekitar poros dunia. Dalam kedua kasus tersebut, yang Anda dapatkan hanyalah 'matriks lokal-ke-dunia'. Namun, bagian pertama memiliki +1 saya untuk analisis.
Maik Semder
+1 @Maik mungkin Anda bisa menulis jawaban terpisah untuk membuat perbedaan antara rotasi dan masalah urutan perkalian menjadi lebih jelas? Terima kasih atas komentarnya!
Max Dohme
Ah, sekarang masuk akal. Saya tidak tahu (aduh, itu pasti ada di FAQ) bahwa perkalian angka empat itu asosiatif, jadi memang rotasi dan kebalikannya membatalkan satu sama lain, memberi saya wawasan yang saya butuhkan, satu memiliki rotasi lokal di kanan dan satu di kiri yang pada dasarnya mengatakan 'terapkan rotasi di ruang induk' atau 'terapkan rotasi di ruang lokal' .... tidak ada bedanya dengan matriks. Cukup mendasar begitu Anda melihatnya! Terima kasih!
Kaj