Cara menggabungkan rotasi dalam 2 sumbu menjadi satu matriks

8

Saya sudah tahu tentang matriks yang harus saya gunakan untuk melakukan rotasi. Jika saya harus memutar di sumbu z dan kemudian di sumbu x, saya akan melakukannya dalam 2 langkah. Pertanyaan saya adalah, apakah mungkin untuk menggabungkan kedua rotasi menjadi satu matriks? Saya akan menghargai tanggapan Anda.

JORGE
sumber

Jawaban:

8

(Jawaban ini pada dasarnya sama dengan Stefan, tetapi saya ingin menambahkan beberapa detail tentang vektor baris dan kolom, dan cara menentukan yang Anda gunakan.)

Ya, ini mungkin, tetapi detailnya bergantung pada apakah Anda mewakili vektor Anda sebagai baris atau kolom.

Vektor kolom

Jika Anda menggunakan vektor kolom , Anda biasanya akan mengubahnya dengan meninggalkan -multiplikasi matriks Anda:

vector = mRotateZ * vector;
vector = mRotateX * vector;

Tentu saja, Anda juga dapat melakukan ini dalam satu langkah:

vector = mRotateX * mRotateZ * vector;

Tetapi perkalian matriks adalah asosiatif, yang berarti tidak masalah perkalian mana yang dilakukan terlebih dahulu:

A * B * C = (A * B) * C = A * (B * C)

Jadi kita bisa menulis

Matrix mRotate = mRotateX * mRotateZ;
vector = mRotate * vector;

Kami sekarang telah membuat matriks tunggal, yang setara dengan putaran pertamaZ dan kedua tentang X. Ini secara umum sepele untuk sejumlah transformasi. Perhatikan bahwa transformasi diterapkan dari kanan ke kiri.

Vektor baris

Jika, di sisi lain, Anda menggunakan vektor baris , Anda biasanya akan ke kanan -multiply matriks Anda:

vector = vector * mRotateZ;
vector = vector * mRotateX;

Sekali lagi, menulisnya dalam satu langkah, kita dapatkan

vector = vector * mRotateZ * mRotateX;

yang dapat ditulis ulang sebagai

Matrix mRotate = mRotateZ * mRotateX;
vector = vector * mRotate;

Perhatikan bahwa dalam kasus ini, transformasi diterapkan dari kiri ke kanan.

Martin Ender
sumber
1
Saya akan sangat hati-hati dengan komentar asosiatif itu mudah disalahpahami
joojaa
@ joojaa Saya tidak tahu apa maksud Anda sebenarnya, tapi saya sudah mencoba menjelaskannya sedikit.
Martin Ender
Sulit bagi orang awam untuk memisahkan antara urutan Anda memperbanyak hal dan urutan di mana unsur-unsur dalam multiplikasi.
joojaa
sehingga mereka tidak mengerti perbedaan antara assiocative dan komutatif. jadi jika Anda berbicara tentang urutan penggandaan, banyak orang mungkin berpikir tentang komutatif
joojaa
6

Ya, cukup gandakan dengan urutan terbalik:

Matrix myrotation = Matrix.CreateRotationX(xrot) * Matrix.CreateRotationZ(zrot);

EDIT. Jawaban saya hanya berlaku jika Anda menggunakan vektor kolom. Silakan lihat jawaban terperinci Martin Büttner.

Stefan Agartsson
sumber
Saya minta maaf tapi saya tidak mengerti. Apa yang sebenarnya Anda maksud dengan "urutan terbalik"?
JORGE
1
Lipat g x dengan z dan bukannya z dengan x;
Stefan Agartsson
1
sebenarnya order sewenang-wenang satu dapat model menggunakan vektor baris dan satu dapat memodelkan vektor kolom Perhitungan menghasilkan hasil yang sama di keduanya tetapi urutan perkalian berubah. Tapi ya ini semacam jawaban yang tepat.
joojaa
Joojaa, terima kasih sudah menjelaskannya! Matriks baris berarti urutan perkalian terbalik, apakah itu benar?
Stefan Agartsson
3

Dari matematika:

Ada homomorfisme 2: 1 dari angka empat unit menjadi SO (3) (kelompok rotasi).

Apa artinya ini (pada dasarnya) adalah:

  1. Setiap orientasi dapat direpresentasikan sebagai angka empat
  2. Kuartal mewakili rotasi tunggal
  3. Penggandaan angka empat menghasilkan angka empat lain (penutupan), dan setara dengan menyusun rotasi.
  4. Oleh karena itu setiap jumlah rotasi dapat direpresentasikan sebagai rotasi tunggal!

Berpikir tentang itu. Mulai dari ruang objek, Anda dapat memutar objek ke orientasi apa pun hanya menggunakan satu putaran.


Saya ingin menunjukkan bahwa memasukkan angka empat bukan hanya matematika acak. Berbeda dengan jawaban lain, pendekatan yang disukai dalam grafis sebenarnya untuk mewakili rotasi sebagai angka empat, karena mereka mengambil lebih sedikit ruang dan lebih cepat untuk digabungkan.

Ada cara mudah Googleable untuk mengkonversi antara matriks rotasi dan angka empat, tergantung yang Anda inginkan. Intinya adalah rotasi adalah angka empat dalam arti matematika, jadi kombinasi keduanya juga merupakan rotasi tunggal.

Imallett
sumber