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:
// in player input handling:
if (axis == AXIS_X) object.angleX += dir;
else if (axis == AXIS_Y) object.angleY += dir;
else if (axis == AXIS_Z) object.angleZ += dir;
// in physics update and/or draw code:
matrix = eulerAnglesToMatrix(object.angleX, object.angleY, object.angleZ);
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:
- putar objek sebanyak x derajat di sekitar sumbu X;
- memutar objek dengan derajat y di sekitar sumbu Y;
- memutar objek dengan - x derajat di sekitar sumbu X;
- memutar objek dengan derajat - y di sekitar sumbu Y.
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:
// in player input handling:
if (axis == AXIS_X) object.orientation *= eulerAnglesToMatrix(dir, 0, 0);
else if (axis == AXIS_Y) object.orientation *= eulerAnglesToMatrix(0, dir, 0);
else if (axis == AXIS_Z) object.orientation *= eulerAnglesToMatrix(0, 0, dir);
// in physics update and/or draw code:
matrix = object.orientation; // already in matrix form!
(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.)