Bagaimana cara menghitung matriks rotasi 3x3 dari 2 vektor arah?

10

Saya punya 2 vektor arah, untuk sumbu X dan sumbu Y objek. Bagaimana cara menghitung matriks rotasi objek menggunakan ini?

Kilat
sumber

Jawaban:

17

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.

Trevor Powell
sumber
Terima kasih banyak! Saya akan melakukan ini dan memberi tahu Anda hasil saya.
TheFlash
Terima kasih atas jawaban yang sangat membantu! Namun saya ingin tahu: bukankah vektor X selalu elemen 0, 1, dan 2 terlepas dari matriks yang menjadi baris-atau kolom-utama? 0, 3, dan 6 akan menyiratkan mengakses kolom pertama dari matriks baris-utama, atau sebaliknya.
fbrereto
1
1 untuk setidaknya menegaskan () bahwa kedua vektor tidak sama, tetapi saya pikir Anda juga harus meminta mereka bukan vektor nol.
hans_meine
1
Perhatikan bahwa ini tidak memperhitungkan kasus di mana Xadalah -Y.
Rafał Cieślak