Bisakah saya menggunakan angka empat untuk mengendalikan helikopter?

9

Saya mencoba membuat helikopter yang disederhanakan (untuk saat ini, ini adalah kubus) simulasi dalam 3D dan saya mengalami beberapa masalah dengan rotasi. Helikopter dapat berputar di sepanjang tiga sumbu:

  • putar sendiri menggunakan baling-baling belakang: rotasi sumbu y
  • miringkan kiri dan kanan ke kiri atau kanan: rotasi sumbu z
  • miringkan ke atas dan ke bawah untuk maju atau mundur: rotasi sumbu x

Saya harus dapat mengontrol setiap sumbu secara individual. Sejauh ini saya sudah mencoba menggunakan sudut euler, tetapi apa pun urutan rotasi yang saya gunakan, baik saya berlari ke kunci gimbal atau beberapa sumbu "beralih tempat".

Sepertinya saya perlu menggunakan angka empat, tetapi saya tidak tahu bagaimana mengontrol setiap sumbu individu, karena angka empat menggunakan arah dan sudut. Haruskah saya membuat tiga angka empat dan mengalikannya? Bukankah saya akan berakhir dengan masalah yang sama?

Yang aneh adalah, jika saya menggunakan jari saya untuk mewakili tiga sumbu helikopter saya (jempol ke atas = y, indeks = z, tengah = x), saya sepertinya tidak mengalami masalah tersebut. Mengapa?

subb
sumber
Jika Anda memiliki akses ke grafik adegan, alternatif yang mungkin adalah memiliki wadah bersarang untuk setiap sumbu yang kemudian Anda putar secara individual.
bummzack
@bummzack, ya, saya sudah memikirkan hal ini. Namun, bukankah itu sama dengan menggabungkan tiga matriks rotasi dalam urutan tertentu?
subb
Anda benar @ Subb, cobalah untuk tidak menyimpan rotasi untuk setiap sumbu secara terpisah, itu akan memiliki masalah yang sama dengan Euler Angles, tidak peduli apa yang Anda gunakan untuk itu, juga Matriks dan Kuarter akan menderita Gimbal Lock.
Maik Semder
@Maik Semder, lalu bagaimana saya bisa memberikan kontrol ke pitch / yaw / roll helikopter saya?
subb 06
@ Subb @ Flip dan pada dasarnya jawaban saya memberi tahu Anda cara melakukannya.
Maik Semder

Jawaban:

4

Anda harus dapat menggunakan matriks atau angka empat untuk menyimpan orientasi helikopter Anda saat ini. Masalah yang Anda hadapi adalah bagaimana Anda menerapkan perubahan pada pitch / yaw / roll ke helikopter.

Saya pikir Anda ingin menerapkan pitch / yaw / roll ke helikopter di ruang lokal setiap frame. Anda dapat melakukan ini dengan mengambil perubahan dalam pitch / yaw / roll untuk frame itu dan membangun matriks rotasi (Anda dapat melakukan ini dengan sudut euler). Kemudian Anda memutar orientasi helikopter sebelumnya dengan matriks ini (dengan orientasi sebelumnya direpresentasikan sebagai matriks atau angka empat). Ini akan memberi Anda orientasi untuk bingkai baru.

Mewakili orientasi helikopter sebagai angka empat memiliki keuntungan bahwa interpolasi antar angka empat lebih mudah daripada interpolasi antar matriks. Jadi jika di masa depan Anda memiliki orientasi saat ini dan Anda ingin mengetahui rotasi per-frame yang akan membawa Anda ke orientasi baru pada waktu yang diinginkan, representasi angka empat mungkin lebih ramah bagi Anda.

Balik
sumber
Begitulah cara saya melakukannya, terapkan pembaruan inkremental ke matriks yang mewakili transformasi dunia -> lokal. Ingatlah untuk menormalkan matriks, setelah beberapa ratus frame itu akan menunjukkan artefak pembulatan jika Anda tidak.
Patrick Hughes
Juga, untuk menjawab pertanyaan terakhir tentang mengapa masalah kunci gimbal tidak terlihat menggunakan tangan Anda untuk mewakili sumbu x / y / z, itu karena Anda mungkin menerapkan nilai pitch, yaw, dan roll ke bingkai lokal tangan referensi. Membangun matriks rotasi dengan sudut euler dimulai dengan memutar di sekitar dunia x, kemudian oleh y yang dihasilkan, dan kemudian oleh z yang dihasilkan (urutan aktual x / y / z dapat berbeda dalam urutan). Coba terapkan rotasi dengan cara ini dan Anda mungkin mulai melihat bagaimana kunci gimbal muncul.
Balik
3

Pada dasarnya Anda dapat menggunakan setiap representasi rotasi lainnya, tetapi Euler Angles. Matriks, Kuarter bahkan Axis Angles akan melakukan apa yang Anda inginkan.

Should I create three quaternions and multiply them together? Wouldn't I end up with the same problems?

Anda benar, Anda akan berakhir dengan masalah yang sama. Kuncinya adalah menyimpan orientasi saat ini (matriks, angka empat) objek Anda dan hanya menerapkan delta saat mengubah orientasi.

Saat Anda ingin memutar 10 derajat di sekitar Anda, cukup buat delta matriks / angka empat untuk itu dan poskan kalikan dengan orientasi Anda saat ini (jika Anda menggunakan pos perkalian untuk matriks). Jika Anda mengalikannya dengan sebaliknya, itu akan memutar sistem di sekitar sumbu y dunia daripada di sekitar sumbu y objek.

Saya menemukan sumber ini sangat berguna, ia juga dilengkapi dengan kode sumber dan menjelaskan teorinya dengan sangat baik.

Maik Semder
sumber
-1

Masalahnya saya pikir Anda mungkin akan melihat perbedaan dalam rotasi sumbu dan vektor kecepatan (dan juga bahwa Anda kehilangan arah). Ketika helikopter miring ke depan untuk bergerak maju, tenaga penggerak bilah helikopter mendorong udara ke bawah dan ke belakang pada sudut tegak lurus terhadap apa yang Anda beri label sumbu X.

Anda memiliki tingkat kebebasan keempat yang Anda lewatkan: kecepatan bilah mengontrol volume udara yang didorong, yang juga mengontrol jumlah daya angkat yang dihasilkan helikopter.

Namun demikian, "miring ke kiri dan ke kanan" dan "miring ke atas dan ke bawah" umumnya mengendalikan helikopter di pesawat tertentu. Dengan kata lain, helikopter tidak boleh terbang ke bawah ketika miring ke depan, ke belakang, atau ke samping - tetapi jumlah lift mungkin harus berubah dan kecepatan akan dikendalikan oleh sisi "berlawanan" dari segitiga siku-siku yang dibentuk oleh menghubungkan helikopter ke tanah dengan garis lurus ke bawah (gravitasi), dan sisi miring (angkat). Itu akan memberi Anda vektor kecepatan untuk digunakan.

Anda harus dapat menggunakan angka empat untuk melakukan ini, tetapi jangan mendasarkan nilai angka empat Anda pada kemiringan helikopter itu sendiri - coba gunakan kekuatan gerak yang dihasilkan oleh helikopter.

rampok
sumber
Itu tidak benar-benar menjawab pertanyaan itu. Hanya menambahkan lebih banyak makanan untuk dipikirkan.
bummzack
Saat ini, saya menggunakan rotasi helikopter untuk mengubah vektor gaya angkat, yang mengarah ke atas di ruang helikopter. Apakah maksud Anda saya harus melakukan yang sebaliknya, yaitu memodifikasi vektor secara langsung dan kemudian memutar helikopter sebagai akibatnya?
subb
Saya pikir Anda harus melakukan keduanya, apa yang Anda lakukan sekarang, lalu buat perubahan HASIL dalam rotasi ke helikopter berdasarkan normal dari pisau. Yaitu Anda memiliki 2 rotasi; satu diterapkan pada bilah dan yang kedua mewakili rotasi helikopter yang sebenarnya. Jelas semua disimpan di Kuarter.
decaviatedcaviar