2017-12-27 20 views
1

Die Funktion glm::translate benötigt 2 Argumente (Matrix M, Vektor V). Bin ich richtig in der Annahme, den folgenden:glm :: translate - baut er Matrix aus einem Vektor?

  1. Es multipliziert den M mit V
  2. macht eine neue Identität Matrix
  3. die Elemente des Vektors in den richtigen Stellen in der Identitätsmatrix setzt
  4. liefert die resultierende Matrix
+2

'glm :: translate' erstellt eine Übersetzungsmatrix, die mit 'V' übersetzt wird. Dann multipliziert es "M" mit der Übersetzungsmatrix und dies ist das Ergebnis. – Rabbid76

+0

@ Rabbid76 Was passiert, wenn Sie die Wahl haben wollen, in welcher Reihenfolge die Matrizen multipliziert werden? Wie der Unterschied zwischen lokaler Übersetzung oder globaler Übersetzung. Erlaubt es diese Funktion nur, sie auf eine bestimmte Art zu multiplizieren? – Zebrafish

Antwort

1

nicht genau, was es tut, ist konzeptionell zwei Dinge:

  1. Es schafft eine 4x4 homogene Übersetzungsmatrix T die die Wirkung der Kompensation jeden Punkt V durch den Vektor hat:

    /1 0 0 Vx \ 
    T = | 0 1 0 Vy | 
        | 0 0 1 Vz | 
        \ 0 0 1 1/
    

    so dass für jeden Punkt p = (px , py, pz, 1) p ' = T * p wird p'ergeben= p + V:

    / 1 0 0 Vx \ /px \ /px * 1 + 1 * Vx \ 
    | 0 1 0 Vy | * | py | = | py * 1 + 1 * Vy | 
    | 0 0 1 Vz |  | pz |  | pz * 1 + 1 * Vz | 
    \ 0 0 1 1/ \ 1/ \  1  /
    
  2. Es post-Multiplikationen T zu M und gibt das Ergebnis: M‘ = M * T

    Dies hat zur Folge, dass die Anwendung M ' zu einem beliebigen Punkt zuerstgiltT, anfd dann gelten, was in M war vor:

    p ' = M' * p = M * T * p = M * (T * p)

Es sei angemerkt, dass das allgemeine Matrixmultiplikationsschema vereinfacht werden kann, wenn man weiß, dass einer der Operanden eine Übersetzungsmatrix ist. Im Fall der Post-mulitplying T, hat dies die gleiche Wirkung des ersten V durch M, transformiert und als Addieren des resultierenden Vektors zu der letzten Spalte des M.

/m00 m01 m02 m03 \ /1 0 0 Vx \ /m00 m01 m02 (m03 + m00 * Vx + m01 * Vy + m02 * Vz) \ 
    | m10 m11 m12 m13 | * | 0 1 0 Vy | = | m10 m11 m12 (m13 + m10 * Vx + m11 * Vy + m12 * Vz) | 
    | m20 m21 m22 m23 |  | 0 0 1 Vz |  | m20 m21 m22 (m23 + m20 * Vx + m21 * Vy + m22 * Vz) | 
    \ m30 m31 m32 m33/ \ 0 0 1 1/ \ m30 m31 m32 (m33 + m30 * Vx + m31 * Vy + m32 * Vz)/

Also nein, es ist nicht eine Identitätsmatrix zurückkehrt, wo die Übersetzung Teil von M * V ersetzt wird, gibt es M‘ wo M * V war hinzugefügt zum Übersetzungsteil.

+0

Durch postmultiplying der Übersetzungsmatrix ergibt sich lokale Übersetzung richtig? Ich habe gerade gelesen, was Sie geschrieben haben über die Vereinfachung der Multiplikation, ich bin daran interessiert für die Optimierung, aber ich habe Sie nicht ganz verstanden. Ich weiß, dass wenn Sie in globalen Koordinaten und nicht lokal übersetzen möchten, können Sie einfach den Übersetzungsvektor zu der entsprechenden Spalte/Zeile hinzufügen, aber wenn Sie lokal übersetzen möchten, ist das Äquivalent einer Post-Multiplikation wie hier getan eine Möglichkeit, es zu optimieren? – Zebrafish

+0

Ich verstehe, was Sie sagen, sehen, als ob die Übersetzungsmatrix hauptsächlich 1 und 0 von der Identität ist, gibt es eine ganze Reihe von Multiplikationen, die Sie überspringen können. Dies ist ein wirklich netter Trick zur Optimierung in meiner Spielengine. – Zebrafish

+1

@ Zebrafisch: Es gibt eine andere Möglichkeit, diese Dinge zu betrachten: Sei T (v) eine Übersetzungsmatrix für den Übersetzungsvektor v und M eine generische Transformationsmatrix. Wenn Sie übersetzen möchten, nachdem M angewendet wurde, können Sie dies zu einer einzigen Matrix T (v) * M zusammenfassen, die nur v zur ganz rechten Spalte von M hinzugefügt wird. Wenn Sie zuerst übersetzen möchten, erhalten Sie M * T (v), das ist das gleiche, als ob Sie zuerst die M-Transformation machen und anschließend durch den ebenfalls transformierten Vektor v '= M * v übersetzen, also M * T (v) = T (M * v) * M, was bedeutet es ist gleich, einfach den Vektor v '= M * v zur Übersetzungsspalte von M zu addieren. – derhass

1

Siehe glm 0.9.8 API Documentation for glm::translate:

glm::translate

GLM_FUNC_DECL tmat4x4<T, P> glm::translate( 
    tmat4x4< T, P > const & m, 
    tvec3< T, P > const & v 
) 

Baut eine Übersetzungs 4 * 4 Matrix, die aus einem Vektor von 3 Komponenten erstellt.

Parameter:

  • mEingangsmatrix durch diese Translationsmatrix multipliziert.
  • v Koordinaten eines Übersetzungsvektors.


Dies bedeutet, dass eine Transformationsmatrix durch den Vektor gebildet wird v

glm::vec3 v; 

glm::mat4 t(
    1.0f, 0.0f, 0.0f, 0.0f, 
    0.0f, 1.0f, 0.0f, 0.0f, 
    0.0f, 0.0f, 1.0f, 0.0f, 
    v.x, v.y, v.z, 1.0f); 

und das Ergebnis ist die Multiplikation der Eingangsmatrix m und die Translationsmatrix t:

glm::mat4 m; 

glm::mat4 result = m * t; 
Verwandte Themen