第一人称相机,转身OPENGL

时间:2015-10-14 12:40:18

标签: c++ opengl camera rotation

我有一个带有Obs和VRP以及向上矢量的透视摄像头。

我想实现转身,像我的场景中的观察者一样。我已经实现了前向和后向,因为它只是向Obs和VRP添加相同数量的z坐标(两者都是vec3)。 当我尝试实现旋转时出现问题, 有没有办法用矩阵产品做到这一点?我试过了:

x = R * cos角度

z = R * sin角

其中R是向量的大小(VRP-Obs),但它不起作用

编辑:我在这里应用视图和投影矩阵:

    void MyGLWidget::projTransform(){
    //fov window, ra window (anchura / altura), near, far
    glm::mat4 Proj = glm::perspective(M_PI/1.3, 1.0, 0.2, 3000.0);
    glUniformMatrix4fv(projLoc,1,GL_FALSE, &Proj[0][0]);
}

void MyGLWidget::viewTransform(){
    //lookAt(OBS,VRP;UP)
    //glm::mat4 View = glm::lookAt(glm::vec3(0,0,10),glm::vec3(0,0,-2), glm::vec3(0,1,0));
    glm::mat4 View = glm::lookAt(glm::vec3(xObs,yObs,zObs),glm::vec3(xVRP,yVRP,zVRP), glm::vec3(0,1,0));
    glUniformMatrix4fv(viewLoc,1,GL_FALSE, &View[0][0]);
}

1 个答案:

答案 0 :(得分:1)

假设Obs是摄像机位置,VRP是观察位置:

r = ||VRP - Obs||

                  r * cos(angle)
VRP_new = Obs + [     0          ]
                  r * sin(angle)

由于您可能希望稍后使用第二个旋转轴,我建议为摄像机设置此参数:位置矢量t和描述围绕x轴和y轴旋转的两个角度[rx,ry]。可以在每个帧中组合它们以获得Obs和VRP,但这不是必需的,因为视图矩阵可以直接从这些参数派生:

V = T(t) * R_y(ry) * R_x(rx),

其中T是平移矩阵,R_x,R_y是旋转矩阵。根据您的记法,视图矩阵可能必须反转。