平移和旋转后调整摄像机视图

时间:2013-03-21 19:49:16

标签: opengl matrix camera glm-math

我正试图在一个房间里制作一个“行走相机”的场景。

现在,我看不到任何东西,更不用说轮换和翻译了,我无法弄清楚原因。

请注意,在我使用功能之前,我可以看到所有我想要的,

但是翻译和旋转是错误的,因为我总是根据定义的轴移动,

而不是我应该的相机轴。

这是我现在的代码:

透视并看看 -

mat4 Projection = perspective(45.0f, 1.0f, 0.1f, 100.0f);

vec3 pos = vec3(0.0f, 0.0f, 0.0f);
vec3 target = vec3(0.0f, 0.0f, -99.0f);
vec3 up = vec3(0.0f, 1.0f, 0.0f);

wvp *= Projection;
wvp = lookAt(pos, target, up);

按下某些键后的平移和旋转:

glfwSwapBuffers();
    if(glfwGetKey( 'W' ))
    {
        wvp = translate(wvp, vec3(0,0,0.01));
    }
    if(glfwGetKey( 'S' ))
    {
        wvp = translate(wvp, vec3(0,0,-0.01));
    }
    if(glfwGetKey( 'A' ))
    {
        wvp = rotate(wvp,-1.0f, vec3(0.0f, 1.0f, 0.0f));
    }
    if(glfwGetKey( 'D' ))
    {
        wvp = rotate(wvp,1.0f, vec3(0.0f, 1.0f, 0.0f));
    }

现在定义的顶点:

static const GLfloat vertices[] = {
 //Given square
 0.0f,  0.0f, 2.0f,
 1.0f,  0.0f, 2.0f,
 0.0f,  1.0f, 2.0f,
 1.0f,  1.0f, 2.0f,
}

我连接它们的原因:

static const GLubyte indices[] = {
   0,1,3,
   0,2,3,
}

一些缓冲:

GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);


GLuint indexbuffer;
glGenBuffers(1, &indexbuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexbuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

如何根据需要定义相机并使用平移和旋转来配合相机?

1 个答案:

答案 0 :(得分:1)

你应该更新pos和目标向量(可选择更新),然后构建lookAt Matrix

vec3 pos, target, forward
update() {
    if (key_up)
        pos += forward
    ...
}

render() {
    camMatrix = lookat(pos, target, up)

    mvp = modelMatrix * camMatrix * projMatrix;
    render_geometry
}

forward是向量,表示移动方向。