Saya memiliki Vector3 yang memiliki sudut euler untuk setiap sumbu.
Biasanya, ketika saya ingin membuat matriks rotasi saya akan menggunakan fungsi seperti D3DXMatrixRotationX melewati sudut masing-masing dari vektor rotasi saya di atas dan mengalikan matriks (ZXY) untuk membuat matriks rotasi keseluruhan yang digunakan untuk membentuk matriks transformasi objek lengkap.
Namun, metode ini akan menghasilkan seperangkat rotasi di ruang objek. Artinya, melewati vektor (90, 0, 90) ke dalam metode saya akan membuat rotasi di ruang dunia secara efektif (90, 90, 0).
Apakah ada cara untuk selalu memastikan setiap komponen vektor rotasi saya menghasilkan rotasi di sekitar sumbu ruang selaras dunia masing-masing?
EDIT:
Ini adalah animasi dari apa yang sedang terjadi - saya ingin cara memutar sumbu biru, bukan merah.
EDIT 2:
Hanya untuk dicatat saya tidak mencari solusi yang melibatkan sudut Euler, tetapi hanya cara di mana saya dapat mewakili transformasi beberapa rotasi di seluruh dunia kapak.
sumber
Jawaban:
Berdasarkan komentar Anda, tampaknya Anda menyimpan orientasi objek sebagai satu set sudut Euler , dan dalam / mengurangi sudut ketika pemain memutar objek. Artinya, Anda memiliki sesuatu seperti kodesemu ini:
Sebagaimana dicatat oleh Charles Beattie , karena rotasi tidak berpindah-pindah, ini tidak akan berfungsi seperti yang diharapkan kecuali pemain memutar objek dalam urutan yang sama di mana
eulerAnglesToMatrix()
berlaku rotasi.Secara khusus, perhatikan urutan rotasi berikut:
Dalam representasi sudut Euler naif, seperti yang diterapkan dalam pseudocode di atas, rotasi ini akan dibatalkan dan objek akan kembali ke orientasi aslinya. Di dunia nyata, ini tidak terjadi - jika Anda tidak percaya, ambil dadu enam sisi atau kubus Rubik, biarkan x = y = 90 °, dan coba sendiri!
Solusinya, seperti yang Anda catat dalam jawaban Anda sendiri , adalah untuk menyimpan orientasi objek sebagai matriks rotasi (atau angka empat), dan memperbarui matriks itu berdasarkan input pengguna. Artinya, alih-alih pseudocode di atas, Anda akan melakukan sesuatu seperti ini:
(Secara teknis, karena setiap matriks rotasi atau angka empat dapat direpresentasikan sebagai sekumpulan sudut Euler, itu adalah mungkin untuk menggunakan mereka untuk menyimpan orientasi objek. Tapi aturan yang benar secara fisik untuk menggabungkan dua rotasi berurutan, masing-masing direpresentasikan sebagai Euler sudut, menjadi satu rotasi agak rumit, dan pada dasarnya sama dengan mengubah rotasi menjadi matriks / angka empat, mengalikannya, dan kemudian mengubah hasilnya kembali ke sudut Euler.)
sumber
Masalah dengan rotasi, adalah bahwa, kebanyakan orang berpikir tentang sudut Euler, karena mudah dipahami.
Namun kebanyakan orang lupa bahwa sudut Euler adalah tiga sudut berurutan . Berarti bahwa rotasi di sekitar sumbu pertama, akan membuat rotasi berikutnya relatif terhadap rotasi asli pertama, maka Anda tidak dapat secara independen memutar vektor di sekitar masing-masing 3 sumbu menggunakan sudut Euler.
Ini secara langsung diterjemahkan menjadi matriks ketika Anda mengalikan dua matriks, Anda dapat menganggap perkalian ini sebagai mentransformasikan satu matriks ke ruang matriks lainnya.
Ini dimaksudkan untuk terjadi dengan 3 rotasi berurutan bahkan ketika menggunakan angka empat.
Saya ingin menekankan fakta bahwa angka empat bukan solusi untuk kunci gimble. Sebenarnya kunci gimble akan selalu terjadi jika Anda mewakili sudut Euler menggunakan angka empat. Masalahnya bukan representasi, masalahnya adalah yang 3 langkah berurutan.
Solusinya?
Solusi untuk memutar vektor sekitar 3 sumbu secara independen adalah dengan menggabungkan menjadi satu sumbu dan satu sudut, dengan cara ini Anda dapat menyingkirkan langkah di mana Anda harus melakukan perkalian berurutan. Ini akan secara efektif diterjemahkan menjadi:
Matriks rotasi saya menunjukkan hasil rotasi di sekitar X dan Y dan Z.
daripada interpretasi Euler tentang
Matriks rotasi saya mewakili rotasi di sekitar X lalu Y lalu Z.
Untuk memperjelas ini saya akan mengutip dari teorema rotasi wikipedia Euler:
Perhatikan bahwa mengalikan 3 matriks akan selalu mewakili 3 rotasi berurutan.
Sekarang inorder untuk menggabungkan rotasi di sekitar 3 sumbu, Anda perlu mendapatkan sumbu tunggal dan sudut tunggal yang mewakili rotasi di sekitar X, Y, Z. Dengan kata lain Anda perlu menggunakan representasi Sumbu / Sudut atau angka empat untuk menyingkirkan rotasi berurutan.
Ini biasanya dilakukan, dengan memulai dengan orientasi awal (orientasi dapat dianggap sebagai sudut sumbu), biasanya direpresentasikan sebagai angka empat atau sudut sumbu, dan kemudian memodifikasi orintasi itu untuk mewakili orientasi tujuan Anda. Misalnya Anda mulai dengan quaterion identitas dan kemudian memutar dengan perbedaan untuk mencapai orientasi tujuan. Dengan cara ini Anda tidak kehilangan derajat kebebasan apa pun.
sumber
Mengubah kombinasi rotasi dari ruang objek ke ruang dunia adalah sepele: Anda hanya perlu membalik urutan penerapan rotasi.
Dalam kasus Anda, alih-alih mengalikan matriks
Z × X × Y
, Anda hanya perlu menghitungY × X × Z
.Alasan untuk ini dapat ditemukan di Wikipedia: konversi antara rotasi intrinsik dan ekstrinsik .
sumber
Z
(ruang objek), lalu 50 derajat di sekitarX
(ruang objek), lalu 45 derajat di sekitarY
(ruang objek). Ini persis sama dengan rotasi 45 derajat di sekitarY
( ruang dunia ), kemudian 50 derajat di sekitarX
( ruang dunia ), kemudian 50 derajat di sekitarZ
( ruang dunia ).Saya akan memberikan solusi saya sebagai jawaban sampai seseorang dapat menjelaskan mengapa ini berhasil.
Setiap render saya membangun kembali angka empat saya menggunakan sudut yang tersimpan dalam vektor rotasi saya dan kemudian menerapkan angka empat pada transformasi akhir saya.
Namun untuk mempertahankannya di seluruh dunia kapak saya harus mempertahankan angka empat di semua bingkai dan hanya memutar objek menggunakan perbedaan sudut, yaitu ..
(Verbose untuk kesesuaian)
Saya pikir dsilva.vinicius sedang mencoba untuk sampai ke titik ini.
sumber
Anda harus menyimpan urutan rotasi.
Simpan matriks rotasi Anda saat ini dan lakukan premultiply setiap rotasi saat mereka datang.
sumber
Selain jawaban @ concept3d Anda dapat menggunakan 3 matriks rotasi ekstrinsik untuk memutar sumbu di koordinat dunia. Mengutip dari Wikipedia :
Jadi yang Anda butuhkan adalah membalikkan urutan rotasi sehubungan dengan apa yang akan Anda lakukan menggunakan rotasi intrinsik (atau ruang lokal). @Syntac meminta rotasi zxy, jadi kita harus melakukan rotasi ekstrinsik yxz untuk mencapai hasil yang sama. Kode di bawah ini:
Matriks menghargai penjelasan di sini .
Kode ini didaktik, tidak optimal, karena Anda bisa menggunakan kembali beberapa matriks D3DXMATRIX.
sumber