Mengapa urutan penskalaan dan penerjemahan penting untuk matriks model?

Saya bermain-main dengan membuat matriks model, dan menyadari bahwa urutan operasi untuk penskalaan dan penerjemahan itu penting. Saya menggunakan Qt untuk matriks saya dan menggunakan QMatrix4x4 dan menggunakan openGL (tetapi ini harusnya agnostik perpustakaan dan platform, dan terkait dengan matematika). Hasil dari memperkecil suatu model dan kemudian menerjemahkannya hanya berfungsi seperti yang diharapkan, seperti itu.

    QMatrix4x4 model;
    model.translate(some_vec3d);
    model.scale(some_vec3d);

Saya mendapat kesan bahwa secara matematis, karena skala muncul pada matriks 3x3 pertama dan translasi hanya mempengaruhi kolom terakhir matriks (kolom ke-4), maka urutannya independen. Ketika saya melihat matriks, saya memahami bahwa urutan itu penting, tetapi saya tidak mengerti alasannya.


person dev_nut    schedule 06.11.2018    source sumber


Jawaban (1)


Mempertimbangkan:

  • Titik puncak dalam model Anda p
  • Matriks skala S
  • Matriks translasi T dengan vektor perpindahan t

Titik transformasi diperoleh dari penerapan:

Translation first: 
     S * T * p = S * (p + t) 
               = S * p + S * t
                         ----- <---
Scaling first:
     T * S * p = S * p + t
                         -     <---

Perbedaannya digambarkan dalam perkalian matriks:

Translation first:

   | Sx 0  0  0 |   | 1 0 0 Tx |     | Sx 0  0  Sx * Tx |
   | 0  Sy 0  0 | * | 0 1 0 Ty |  =  | 0  Sy 0  Sy * Ty |
   | 0  0  Sz 0 |   | 0 0 1 Tz |     | 0  0  Sz Sz * Tz |
   | 0  0  0  1 |   | 0 0 0 1  |     | 0  0  0     1    |

Scaling first:

   | 1 0 0 Tx |   | Sx 0  0  0 |     | Sx 0  0  Tx |
   | 0 1 0 Ty | * | 0  Sy 0  0 |  =  | 0  Sy 0  Ty |
   | 0 0 1 Tz |   | 0  0  Sz 0 |     | 0  0  Sz Tz |
   | 0 0 0 1  |   | 0  0  0  1 |     | 0  0  0  1  |
person meowgoesthedog    schedule 06.11.2018
comment
Ini adalah ilustrasi yang bagus. Terima kasih! Dan kode yang saya tampilkan berfungsi karena diterapkan di kolom-mayor, sehingga operasinya dibalik, bukan di baris-mayor seperti yang Anda tunjukkan? Itu adalah penskalaan, diikuti dengan penerjemahan, adalah cara kerjanya. - person dev_nut; 06.11.2018
comment
@dev_nut oh oke, saya tidak tahu konvensi matriks apa yang digunakan Qt tetapi OpenGL menggunakan baris-utama (dengan Y dan Z ditukar). Itu tergantung pada bagaimana Qt mengimplementasikan fungsi terjemahan dan penskalaan; beberapa perpustakaan menerapkan transformasi secara terbalik. - person meowgoesthedog; 06.11.2018
comment
Bahkan glm Anda harus melakukan operasi secara terbalik. Saya yakin openGL adalah kolom utama - opengl.org/archives/resources/ faq/technical/transformations.htm. Tapi, matematikanya semua sama. Anda hanya perlu menyadari urutan yang diharapkan oleh perpustakaan dasar yang Anda gunakan, yaitu qt atau glm atau apa pun. - person dev_nut; 06.11.2018
comment
@dev_nut ups maaf kesalahannya; Intinya adalah, persamaan matriksnya adalah invarian konvensi, dan persamaan tersebut menunjukkan bahwa jika Anda menerapkan penskalaan kedua, terjemahannya sendiri juga akan diskalakan, sedangkan kebalikannya tidak berlaku. - person meowgoesthedog; 06.11.2018