OpenGL 3 (LWJGL) LookAt Matrix Confusion

Ich lerne OpenGL 3 mit LWJGL. Ich habe versucht, ein Äquivalent zu implementierengluLookAt(), und obwohl es funktioniert, bin ich etwas verwirrt, warum.

Ich gebe zu, nur diesen Code aus verschiedenen Quellen im Web zu kopieren, aber nach langem Lernen denke ich, dass ich die Mathematik dahinter verstehe und verstehe, was LWJGL tut.

Allerdings ist die "richtige"gluLookAt Der Code hat sich in meiner Anwendung falsch verhalten, da die Kamera scheinbar in die falsche Richtung gedreht hat. Ich habe es nur geschafft, meinen Code zum Laufen zu bringen, indem ich die orthonormalen Vektoren transponiert habeforward, side, undup (Ich hoffe, ich verwende die richtige Terminologie!), was ich ziemlich sicher bin, ist falsch ...

private static final Vector3f forward = new Vector3f();
private static final Vector3f side = new Vector3f();
private static final Vector3f up = new Vector3f();
private static final Vector3f eye = new Vector3f();

public static Matrix4f lookAt(float eyeX, float eyeY, float eyeZ, 
                              float centerX, float centerY, float centerZ, 
                              float upX, float upY, float upZ) {
    forward.set(centerX - eyeX, centerY - eyeY, centerZ - eyeZ);
    forward.normalise();

    up.set(upX, upY, upZ);

    Vector3f.cross(forward, up, side);
    side.normalise();

    Vector3f.cross(side, forward, up);
    up.normalise();

    Matrix4f matrix = new Matrix4f();
    matrix.m00 = side.x;
    matrix.m01 = side.y;
    matrix.m02 = side.z;

    matrix.m10 = up.x;
    matrix.m11 = up.y;
    matrix.m12 = up.z;

    matrix.m20 = -forward.x;
    matrix.m21 = -forward.y;
    matrix.m22 = -forward.z;

    matrix.transpose(); // <------ My dumb hack

    eye.set(-eyeX, -eyeY, -eyeZ);
    matrix.translate(eye);

    return matrix;
}

Ich denke nicht, dass ich die Transponierung machen sollte, aber ohne geht es nicht. ich setzetranspose() weil ich nicht die Mühe hatte, alle Matrixzellenpositionen zu wiederholen, übrigens!

Nach meinem Verständnis sollte die Form der lookAt-Matrix wie folgt aussehen

[ side.x  up.x  fwd.x  0 ] [ 1  0  0  -eye.x ]
[ side.y  up.y  fwd.y  0 ] [ 0  1  0  -eye.y ]
[ side.z  up.z  fwd.z  0 ] [ 0  0  1  -eye.z ]
[      0     0      0  1 ] [ 0  0  0       1 ]

Und ich denke, dass die LWJGLMatrix4f Klasse repräsentiert Matrixzellen alsm<col><row>. Dastranslate(Vector3f) Methode führt Folgendes aus

public static Matrix4f translate(Vector3f vec, Matrix4f src, Matrix4f dest) {
  ...
    dest.m30 += src.m00 * vec.x + src.m10 * vec.y + src.m20 * vec.z;
    dest.m31 += src.m01 * vec.x + src.m11 * vec.y + src.m21 * vec.z;
    dest.m32 += src.m02 * vec.x + src.m12 * vec.y + src.m22 * vec.z;
    dest.m33 += src.m03 * vec.x + src.m13 * vec.y + src.m23 * vec.z;
  ...
}

Ich bin also sehr verwirrt, welchen Teil davon ich vermasselt habe. Ist es mein Verständnis der LookAt-Matrix, der Spalten- / Zeilenmehrheit (ist das ein Wort ?!) vonMatrix4f, oder etwas anderes? Ist der Rest meines Codes gerade kaputt? Ist es tatsächlich richtig und ich mache mir nur zu viele Sorgen? Bin ich nur ein Idiot?

Vielen Dank.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage