简体   繁体   中英

3D Camera class not working like it should

Can someone tell me why my camera class isn't working correctly? I set the position vector to (0,0,-10) and the look at vector to (0,0,0) but when I draw something on (0,0,0) it isn't there. I'm very new to vector math and matrix stuff, so I'm betting it's LookThrough() where the problem is.

import org.lwjgl.opengl.GL11;
import org.lwjgl.util.vector.Matrix3f;
import org.lwjgl.util.vector.Vector3f;

public class Camera {
     //3d vector to store the camera's position in
    Vector3f position = null;
    Vector3f lookAt = null;
    //the rotation around the Y axis of the camera
    float yaw = 0;

    //the rotation around the X axis of the camera
    float pitch = 0;

    //the rotation around the Z axis of the camera
    float roll = 0;

    public Camera(float x, float y, float z)
    {
        //instantiate position Vector3f to the x y z params.
        position = new Vector3f(x, y, z);
        lookAt = new Vector3f();
    }

    public void lookThrough()
    {
        Matrix3f m = new Matrix3f();



        Vector3f out = new Vector3f();
        Vector3f.sub(position, lookAt, out);
        out.normalise();
        //set forward vector
        m.m00 = out.x;
        m.m01 = out.y;
        m.m02 = out.z;

        //set right vector
        m.m10 = 1;
        m.m11 = 0;
        m.m12 = 0;

        //set up vector
        m.m20 = 0;
        m.m21 = 1;
        m.m22 = 0;

        yaw = (float) -(Math.tan(m.m10/m.m00));
        pitch = (float) -(Math.tan((-m.m20)/(Math.sqrt(Math.pow(m.m21, 2) + Math.pow(m.m22, 2)))));
        roll = (float) -(Math.tan(m.m21/m.m22));

        //roatate the pitch around the X axis
        GL11.glRotatef(pitch, 1.0f, 0.0f, 0.0f);
        //roatate the yaw around the Y axis
        GL11.glRotatef(yaw, 0.0f, 1.0f, 0.0f);
        //roatate the yaw around the Y axis
        GL11.glRotatef(roll, 0.0f, 0.0f, 1.0f);
        //translate to the position vector's location
        GL11.glTranslatef(position.x, position.y, position.z);
    }
}

There are a couple of things about your class that I would highlight:

1) You are fixing your 'right' and 'up' vectors, leaving only one degree of rotational freedom. As the camera re-orients in 3D space these will need to change. As it stands, your calculation for pitch always evaluates to 0, while your calculation to roll always evaluates to tan(1/0).

2) Though I'm not familiar with Java, you appear to be using the calculation (position - lookAt) to derive your forward vector. Ought it not be the reverse? The forward vector points away from the viewer's position.

3) Again - not familiar with java - but calling pow() to do a single multiplication is likely overkill.

1 & 2 could be the cause of your woes. Ultimately I would suggest taking a look at gluLookAt - assuming the GLU library is available in Java. If it is not, then look at the source code for gluLookAt (one variant is available here ).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM