ViewMatrix不需要LWJGL中的Up Vector,TargetVector和Pos Vector

时间:2017-06-23 08:56:19

标签: opengl lwjgl

我在LWJGL3.0中创建Camera时遇到问题。当我在c ++中使用opengl时,需要创建一个像这样定义的Camera类。

class Camera
{
public:
    // Camera Attributes
    glm::vec3 Position;
    glm::vec3 Front;
    glm::vec3 Up;
    glm::vec3 Right;
    glm::vec3 WorldUp;
    // Eular Angles
    float Yaw;
    float Pitch;
    // Camera options

相机有三个矢量,Up,Target和Pos来定义它。它仍有Yaw和Pitch可以向任何方向旋转。众所周知,viewmatrix可以像这样计算:

private void genVieMatrix() {
        // calculate direction
        Vector3f cameraDirection = Vector3f.sub(mEyeTarget, mEyePos, null);
        cameraDirection.normalise();
        // calculate right axis
        Vector3f cameraRight = Vector3f.cross(cameraDirection, mEyeUp, null);
        cameraRight.normalise();
        Vector3f up = Vector3f.cross(cameraRight, cameraDirection, null);
        up.normalise();
        // lookat
        Matrix4f matrix = new Matrix4f();
        matrix.setIdentity();
        matrix.m00 = cameraRight.x;
        matrix.m01 = up.x;
        matrix.m02 = -cameraDirection.x;

        matrix.m10 = cameraRight.y;
        matrix.m11 = up.y;
        matrix.m12 = -cameraDirection.y;

        matrix.m20 = cameraRight.z;
        matrix.m21 = up.z;
        matrix.m22 = -cameraDirection.z;

        matrix.translate(new Vector3f(-mEyePos.x, -mEyePos.y, -mEyePos.z));
    } 

但是当我尝试在LWJGL 3.0中使用视图矩阵时,我发现创建视图矩阵的最常用方法如下:

Matrix4f viewMatrix = new Matrix4f();
Matrix4f.translate(camerapos, viewMatrix, viewMatrix);

当改变相机的旋转时,它们只是旋转矩阵。创建视图矩阵怎么这么简单?

所以我尝试使用三个向量,up,target和pos,在LWJGL演示中创建视图矩阵,将其替换为原始的。然后我发现没有显示任何东西。

我的代码:

private ShaderProgram mProgram;
    private Shader mVertexShader;
    private Shader mFragmentShader;

    private VertexArrayObject VAO;
    private VertexBufferObject VBO;
    //private VertexBufferObject EBO;

    private Cube mCubeData;

    private Camera mCamera;

    private Vector3f eyePos = new Vector3f(0.0f, 0.0f, 0.0f);
    private Vector3f eyeUp = new Vector3f(0.0f, 1.0f, 0.0f);
    private Vector3f eyeTarget = new Vector3f(0.0f, 0.0f, -5.0f);

    private Texture mTexture;

    private FloatBuffer projectMatrix;

    private FloatBuffer mViewMatrix;

    private Matrix4f mModelMatrix;

    public SkyBoxProgram() {

    }

    private void compileShaders() {
        mVertexShader = Shader.loadShader(GL_VERTEX_SHADER, VERTEX_SHADER_PATH);
        mFragmentShader = Shader.loadShader(GL_FRAGMENT_SHADER, FRAGMENT_SHADER_PATH);
        mProgram = new ShaderProgram();
        mProgram.attachShader(mVertexShader);
        mProgram.attachShader(mFragmentShader);
        mProgram.bindFragmentDataLocation(0, "out_colour");
        mProgram.link();

    }

    private void prepareData() {
        mCubeData = new Cube(0.4f);
        mCamera = new Camera(eyePos, eyeUp, eyeTarget);
        Matrix4f matrix4f = mCamera.getViewMatrix();//GeneralSetting.getViewMatrix(new Vector3f(0, 0, -10f));
        mViewMatrix = BufferUtils.createFloatBuffer(16);
        matrix4f.store(mViewMatrix);
        //mViewMatrix = GeneralSetting.getViewMatrix(new Vector3f(-1f, 0, -1f));


        matrix4f = GeneralSetting.createProjectionMatrix();
        projectMatrix = BufferUtils.createFloatBuffer(16);//GeneralSetting.getProjectionMatrix(60f, 1.33f, 0.1f, 10f);
        matrix4f.store(projectMatrix);
        projectMatrix.flip();

        mModelMatrix = new Matrix4f();
        mModelMatrix.setIdentity();

        VAO = new VertexArrayObject();
        VBO = new VertexBufferObject();
        VAO.bind();
        VBO.bindBuffer(GL_ARRAY_BUFFER);
        VBO.bufferFloatData(GL_ARRAY_BUFFER, mCubeData.getPosDataBuffer(), GL_STATIC_DRAW);

        mProgram.enableAttribLocation(0);
        mProgram.vertexAttribPointer(0, 3, GL_FLOAT, false, 3 * 4, 0);
        VAO.unbind();

    }

    private void prepareTexture() {
        mTexture = Texture.loadImageFromFile(IMAGE_PATH, GL_TEXTURE_2D, GL_RGBA);
    }

    private void _delete() {
        mVertexShader.delete();
        mFragmentShader.delete();
        mProgram.delete();
        VAO.delete();
        VBO.delete();
        //EBO.delete();
    }

    private void _render() {
        mProgram.use();
        VAO.bind();
        VBO.bindBuffer(GL_ARRAY_BUFFER);

        mModelMatrix.translate(new Vector3f(0.0f, 0.0f, 0.0f));
        mProgram.setUniformMatrix4f(mProgram.getAttributeLocation("modelMatrix"), mModelMatrix);
        mProgram.setUniformMatrix4f(mProgram.getAttributeLocation("viewMatrix"), mViewMatrix);

        mProgram.setUniformMatrix4f(mProgram.getAttributeLocation("projectionMatrix"), projectMatrix);

        glDrawArrays(GL_TRIANGLES, 0, 3);

        VAO.unbind();
    }

    public void init() {
        compileShaders();
        prepareData();
        prepareTexture();
    }

    public void render() {
        _render();
    }

    public void cleanUp() {
        _delete();
    }

}

代码中使用的一些对象,如ProgramShader,Shader,VertexArrayObject等,只是简单的打包类,表示在opengl中使用相应对象的一般方法。 着色器很简单,因此只有顶点着色器:

gl_Position = projectionMatrix * viewMatrix * vec4(position, 1.0);

当我这样做时,我发现了一些不寻常的东西。 在第二种方式中,原始相机位置是vector3f(0.0f,0.0f,-10.0f),顶点位置' z值为-2.0f。

在复杂方法(首先解释)中,向上矢量是vector3f(0.0f,1.0f,0.0f),相机目标pos是vector3f(0.0f,0.0f,-10.0f),相机pos是vector3f(0.0F)。

复杂的方法没有显示,我真的不知道为什么。

0 个答案:

没有答案