Search code examples
javac++opengllwjgl

LWJGL: gluLookAt that returns Matrix4f in opengl 3+?


I'm trying to write a little game with third-person-camera and I'm just wondering about gluLookAt function. It works with Opengl 1.1, but I'm using 3.2 one so I need something that can return Matrix4f to me, but I didn't find anything on the Internet except some code in C++ and I found it extremely hard to translate it to the LWJGL (their API's are not the same, no sir). For example, I tried to remake this code (This link) :

// ----------------------------------------------------
// View Matrix
//
// note: it assumes the camera is not tilted,
// i.e. a vertical up vector (remmeber gluLookAt?)
//

void setCamera(float posX, float posY, float posZ,
           float lookAtX, float lookAtY, float lookAtZ) {

float dir[3], right[3], up[3];

up[0] = 0.0f;   up[1] = 1.0f;   up[2] = 0.0f;

dir[0] =  (lookAtX - posX);
dir[1] =  (lookAtY - posY);
dir[2] =  (lookAtZ - posZ);
normalize(dir);

crossProduct(dir,up,right);
normalize(right);

crossProduct(right,dir,up);
normalize(up);

float aux[16];

viewMatrix[0]  = right[0];
viewMatrix[4]  = right[1];
viewMatrix[8]  = right[2];
viewMatrix[12] = 0.0f;

viewMatrix[1]  = up[0];
viewMatrix[5]  = up[1];
viewMatrix[9]  = up[2];
viewMatrix[13] = 0.0f;

viewMatrix[2]  = -dir[0];
viewMatrix[6]  = -dir[1];
viewMatrix[10] = -dir[2];
viewMatrix[14] =  0.0f;

viewMatrix[3]  = 0.0f;
viewMatrix[7]  = 0.0f;
viewMatrix[11] = 0.0f;
viewMatrix[15] = 1.0f;

setTranslationMatrix(aux, -posX, -posY, -posZ);

multMatrix(viewMatrix, aux);
}

I can understand everything until "float aux[16]", then it just gets messy in my mind, especially in the end. Can someone make it clear for me? Maybe someone already made "gluLookAt-clone" or something?

EDIT:

Thank you, Brett, now I must understand how to express that in code). You say that "aux" is a matrix, but we give it only 3 floats, so its better be a vector, BUT if it is a vector, so how do I multiply it with 4x4 ViewMatrix? And I cant find a way to just fill Matrix4f with numbers, there is no methods in lib to do that (most likely that because I'm noob and I can't find it, but hey, I really can't)

FINAL EDIT:

Finally I got it to work. I just wasn't understanding full matrix stuff that was required. Here is final working code, if someone interested(I guess not but whatever)). To deal with it, don't forget to setup projection matrix in the begining.

void setCamera(float posX, float posY, float posZ,
            float lookAtX, float lookAtY, float lookAtZ) {
 Vector3f dir = new Vector3f(lookAtX - posX, lookAtY - posY, lookAtZ - posZ);
 Vector3f up = new Vector3f(0, 1f, 0);
 Vector3f right = new Vector3f();
dir.normalise();

 Vector3f.cross(dir,up,right);
 right.normalise();

 Vector3f.cross(right,dir,up);
 up.normalise();

 Matrix4f aux = new Matrix4f();

 viewMatrix = new Matrix4f();
 viewMatrix.m00 = right.getX();
 viewMatrix.m01  = right.getY();
 viewMatrix.m02 = right.getZ();
 viewMatrix.m03 = 0.0f;

 viewMatrix.m10  = up.getX();
 viewMatrix.m11  = up.getY();
 viewMatrix.m12 = up.getZ();
 viewMatrix.m13 = 0.0f;

 viewMatrix.m20 = -dir.getX();
 viewMatrix.m21  = -dir.getY();
 viewMatrix.m22 = -dir.getZ();
 viewMatrix.m23 =  0.0f;

 viewMatrix.m30  = 0.0f;
 viewMatrix.m31  = 0.0f;
 viewMatrix.m32 = 0.0f;
 viewMatrix.m33 = 1.0f;

//setup aux as a translation matrix by placing positions in the last column
aux.m30 = -posX;
aux.m31 = -posY;
aux.m32 = -posZ;

//multiplication(in fact translation) viewMatrix with aux
 Matrix4f.mul(viewMatrix, aux, viewMatrix);
}

Solution

  • I have a first-person camera class that I use (on OpenGL 3.2) which handles movement: x, y and z positions as well as pitch, yaw and roll. The way that I do this is update positions each cycle and a part of rendering I apply these updates from the camera by creating a new view matrix and sending it as a uniform to my vertex shader.

    Here is the method that accomplishes this:

    @Override
    public void applyTranslations(int uniformLocation) {
        viewMatrix = new Matrix4f();
        Matrix4f.rotate(MatrixUtils.degreesToRadians(pitch), new Vector3f(1, 0, 0), viewMatrix, viewMatrix);
        Matrix4f.rotate(MatrixUtils.degreesToRadians(yaw), new Vector3f(0, 1, 0), viewMatrix, viewMatrix);
        Matrix4f.rotate(MatrixUtils.degreesToRadians(roll), new Vector3f(0, 0, 1), viewMatrix, viewMatrix);
        Matrix4f.translate(new Vector3f(-x, -y, -z), viewMatrix, viewMatrix);
        viewMatrix.store(matrix44Buffer); matrix44Buffer.flip();
        glUniformMatrix4(uniformLocation, false, matrix44Buffer);
    }
    

    Where uniformLocation is the location of my viewMatrix uniform within my shaders.

    Steps are to:

    1. Create a new 4x4 matrix
    2. Apply rotations for x, y and z axes
    3. Apply translation for the x, y and z axes
    4. Send matrix to shaders