Jawaban:
Ide dasarnya adalah menggunakan produk silang untuk menghasilkan sumbu ortogonal ekstra dari matriks rotasi Anda, berdasarkan pada sumbu yang sudah Anda miliki.
Matrix3x3 MakeMatrix( Vector3 X, Vector3 Y )
{
// make sure that we actually have two unique vectors.
assert( X != Y );
Matrix3x3 M;
M.X = normalise( X );
M.Z = normalise( cross_product(X,Y) );
M.Y = normalise( cross_product(M.Z,X) );
return M;
}
Perhatikan bahwa di atas tidak membuat asumsi tentang vektor X dan Y (selain dari mereka tidak identik), dan melakukan banyak matematika tambahan yang mungkin tidak harus dilakukan dalam situasi Anda.
Sebagai contoh, dalam kode ini saya melakukan cross-produk kedua untuk memastikan matriks kita mendapatkan sumbu Y ortogonal, alih-alih mempercayai secara membabi buta bahwa sumbu input X dan Y tepatnya terpisah 90 derajat. Jika dalam situasi Anda, Anda yakin bahwa sumbu input Anda benar-benar ortogonal satu sama lain, maka Anda dapat melewati produk silang kedua, dan cukup menetapkan vektor input Y secara langsung, alih-alih menghitung ulang.
Perhatikan bahwa saya berasumsi bahwa representasi matriks Anda memiliki anggota vektor 'X, Y, Z' yang dapat diakses. Beberapa implementasi hanya mengekspos array sembilan float sebagai gantinya, dalam hal ini vektor 'X' akan berupa elemen 0, 1, dan 2, atau 0, 3, dan 6, tergantung pada apakah matriksnya adalah baris-utama atau kolom- utama. Dalam situasi (menjengkelkan) ini, saya biasanya menemukan bahwa lebih mudah untuk hanya mencoba kedua cara dan melihat mana yang berfungsi, daripada mencari melalui dokumentasi untuk mencoba mencari tahu pemesanan mana yang menggunakan implementasi matriks Anda. :)
Terakhir, perhatikan bahwa tergantung pada kemampuan sistem koordinat 3D Anda, Anda mungkin perlu mengalikan MZ dengan negatif, untuk menghasilkan matriks rotasi legal untuk mesin 3D Anda.
X
adalah -Y
.