Saya membaca buku "Learning Modern 3D Graphics Programming" online oleh Jason L. McKesson
Sampai sekarang, saya siap dengan masalah kunci gimbal dan bagaimana menyelesaikannya menggunakan angka empat.
Namun di sini, di halaman Quaternions .
Sebagian dari masalahnya adalah bahwa kami mencoba untuk menyimpan orientasi sebagai serangkaian 3 rotasi aksial terakumulasi. Orientasi adalah orientasi, bukan rotasi. Dan orientasi tentu saja bukan serangkaian rotasi. Jadi kita perlu memperlakukan orientasi kapal sebagai orientasi, sebagai kuantitas tertentu.
Saya kira ini adalah tempat pertama saya mulai bingung, alasannya adalah karena saya tidak melihat perbedaan dramatis antara orientasi dan rotasi. Saya juga tidak mengerti mengapa orientasi tidak dapat diwakili oleh serangkaian rotasi ...
Juga:
Pikiran pertama menuju tujuan ini adalah untuk menjaga orientasi sebagai matriks. Ketika tiba saatnya untuk mengubah orientasi, kita cukup menerapkan transformasi ke matriks ini, menyimpan hasilnya sebagai orientasi saat ini yang baru.
Ini berarti bahwa setiap yaw, pitch, dan roll yang diterapkan pada orientasi saat ini akan relatif terhadap orientasi saat ini. Itulah tepatnya yang kita butuhkan. Jika pengguna menerapkan yaw positif, Anda ingin yaw memutarnya relatif ke tempat mereka menunjuk saat ini, bukan relatif terhadap beberapa sistem koordinat tetap.
Konsepnya, saya mengerti, namun saya tidak mengerti bagaimana jika akumulasi transformasi matriks adalah solusi untuk masalah ini, bagaimana kode yang diberikan pada halaman sebelumnya bukan hanya itu.
Berikut kodenya:
void display()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutil::MatrixStack currMatrix;
currMatrix.Translate(glm::vec3(0.0f, 0.0f, -200.0f));
currMatrix.RotateX(g_angles.fAngleX);
DrawGimbal(currMatrix, GIMBAL_X_AXIS, glm::vec4(0.4f, 0.4f, 1.0f, 1.0f));
currMatrix.RotateY(g_angles.fAngleY);
DrawGimbal(currMatrix, GIMBAL_Y_AXIS, glm::vec4(0.0f, 1.0f, 0.0f, 1.0f));
currMatrix.RotateZ(g_angles.fAngleZ);
DrawGimbal(currMatrix, GIMBAL_Z_AXIS, glm::vec4(1.0f, 0.3f, 0.3f, 1.0f));
glUseProgram(theProgram);
currMatrix.Scale(3.0, 3.0, 3.0);
currMatrix.RotateX(-90);
//Set the base color for this object.
glUniform4f(baseColorUnif, 1.0, 1.0, 1.0, 1.0);
glUniformMatrix4fv(modelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(currMatrix.Top()));
g_pObject->Render("tint");
glUseProgram(0);
glutSwapBuffers();
}
Menurut pemahaman saya, bukan apa yang dia lakukan (memodifikasi matriks pada tumpukan) dianggap mengakumulasi matriks, karena penulis menggabungkan semua transformasi rotasi individu menjadi satu matriks yang disimpan di bagian atas tumpukan.
Pemahaman saya tentang matriks adalah bahwa mereka digunakan untuk mengambil titik yang relatif terhadap asal (katakanlah ... model), dan membuatnya relatif terhadap asal lain (kamera). Saya cukup yakin ini adalah definisi yang aman, namun saya merasa ada sesuatu yang hilang yang menghalangi saya untuk memahami masalah kunci gimbal ini.
Satu hal yang tidak masuk akal bagi saya adalah: Jika sebuah matriks menentukan perbedaan relatif antara dua "ruang," bagaimana bisa rotasi di sekitar sumbu Y untuk, katakanlah, roll, tidak menempatkan titik dalam "ruang roll "yang kemudian dapat ditransformasikan sekali lagi sehubungan dengan gulungan ini ... Dengan kata lain tidak boleh ada transformasi lebih lanjut ke titik ini sehubungan dengan" ruang gulungan "baru ini dan karenanya tidak memiliki rotasi relatif terhadap yang sebelumnya" ruang model "yang menyebabkan kunci gimbal.
Itu sebabnya kunci gimbal terjadi kan? Itu karena kita memutar objek di sekitar set X, Y, dan sumbu Z daripada memutar objek di sekitar itu sendiri, sumbu relatif . Atau saya salah?
Karena tampaknya kode yang saya tautkan ini bukan merupakan akumulasi transformasi matriks, tolong beri contoh solusi menggunakan metode ini.
Jadi dalam ringkasan:
- Apa perbedaan antara rotasi dan orientasi?
- Mengapa kode terkait bukan contoh dari akumulasi transformasi matriks?
- Apa tujuan sebenarnya dari suatu matriks, jika saya salah?
- Bagaimana solusi untuk masalah kunci gimbal dapat diimplementasikan menggunakan akumulasi transformasi matriks?
- Juga, sebagai bonus: Mengapa transformasi setelah rotasi masih relatif terhadap "ruang model?"
- Bonus lain: Apakah saya salah dengan asumsi bahwa setelah transformasi, transformasi lebih lanjut akan terjadi relatif terhadap arus?
Juga, jika tidak tersirat, saya menggunakan OpenGL, GLSL, C ++, dan GLM, jadi contoh dan penjelasan dalam hal ini sangat dihargai, jika tidak perlu.
Semakin detail semakin baik!
Terima kasih sebelumnya.
sumber
Akumulasi matriks sebenarnya dapat memecahkan kunci Gimbal. Dengan mengakumulasi rotasi, Anda menambahkan gimbal, memungkinkan rotasi sembarang. Diagram yang disediakan ktodisco menunjukkan kunci gimbal di diagram kiri. Matriks untuk orientasi ini dapat didefinisikan sebagai:
Karena rotasi gimbal y, gimbal X dan Z sekarang terkunci, jadi kami kehilangan satu derajat gerakan. Pada titik ini kita tidak memiliki menguap (lokal y, global z) menggunakan ketiga gimbal ini. Tetapi dengan menambahkan gimbal lain, saya dapat memutar secara lokal di sekitar y:
Untuk setiap roll, pitch, dan yaw baru, tambahkan saja gimbal lain, AKUMULASI mereka menjadi satu matriks. Jadi setiap kali rotasi lokal lain diperlukan, rotasi dibuat dan dikalikan dengan matriks akumulasi. Seperti yang disebutkan dalam bab ini, masih ada masalah, tetapi kunci gimbal bukan salah satunya.
sumber