Mengubah urutan penggandaan Matriks

21

Saya mengalami kesulitan mencoba mencari urutan perkalian yang benar untuk matriks transformasi akhir. Saya selalu mendapatkan gerakan aneh atau geometri terdistorsi. Model saya saat ini dijelaskan di bawah ini:

Untuk satu node, urutan penggandaan saya adalah:

L = S * R * T

dimana

L = matriks transformasi lokal

S = matriks skala lokal

R = matriks rotasi lokal

T = matriks terjemahan lokal

Untuk transformasi dunia simpul:

W = PW * L

dimana

W = matriks transformasi dunia

PW = matriks transformasi dunia induk

L = matriks transformasi lokal yang dihitung di atas

Saat merender, untuk setiap node saya menghitung matriks:

MV = Inv (C) * NW

dimana

MV = matriks transformasi tampilan model untuk node tertentu

Inv (C) = matriks transformasi kamera terbalik

NW = matriks transformasi dunia simpul yang dihitung di atas.

Akhirnya, di shader saya memiliki transformasi fallowing:

TVP = PRP * MV * VP

dimana

TVP = posisi vertex akhir yang ditransformasikan

PRP = matriks perspektif

MV = matriks transformasi dunia simpul yang dihitung di atas

VP = posisi vertex yang tidak diubah.

Dengan model saat ini, node anak yang memiliki rotasi lokal, memutar aneh ketika mengubah kamera. Di mana saya salah dengan urutan perkalian?

Colin Dumitru
sumber

Jawaban:

37

Setiap kombinasi pesanan S*R*Tmemberikan matriks transformasi yang valid. Namun, cukup umum untuk pertama-tama skala objek, lalu putar, lalu terjemahkan:

L = T * R * S

Jika Anda tidak melakukannya dalam urutan itu, maka penskalaan yang tidak seragam akan dipengaruhi oleh rotasi sebelumnya, membuat objek Anda terlihat miring. Dan rotasi akan dipengaruhi oleh terjemahan, membuat posisi akhir dari objek Anda sangat berbeda dari apa nilai terjemahan akan membuat Anda berharap.

sam hocevar
sumber
Bisakah Anda menjelaskan ini lebih banyak? Dari apa yang saya terbiasa, rotasi tidak dapat dipengaruhi oleh terjemahan karena perbedaan dalam orientasi antara dua frame, terlepas dari posisi. Sebagai gantinya, terjemahan dapat dipengaruhi oleh rotasi yang terjadi sebelumnya, karena terjemahan itu akan diterjemahkan pada sumbu rotasi yang baru ditentukan. Dalam L = TRS, terjemahan terjadi terlebih dahulu, sehingga tidak terpengaruh oleh vektor baru yang dibuat oleh rotasi.
user-2147482637
4
Kebingungan datang dari fakta bahwa Anda berbicara tentang transformasi lokal (di mana bingkai tetap terkait dengan objek), sedangkan transformasi yang dijelaskan di sini terjadi di ruang dunia (di mana hanya ada satu kerangka referensi tetap, dunia). Secara konseptual, cara Anda melihat sesuatu adalah sah, dan itu sama dengan menerapkan transformasi dalam urutan terbalik.
sam hocevar