第一人称相机,旋转OPENGL

first person camera, turning around OPENGL

本文关键字:OPENGL 旋转 相机 第一人称      更新时间:2023-10-16

我有一个带有Obs和VRP和Up矢量的透视相机。

我想在我的场景中实现像观察者一样的转身。我已经实现了向前和向后,因为它只添加相同数量的z坐标到Obs和VRP(都是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]);
}

假设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为旋转矩阵。根据您的表示法,视图矩阵可能需要反转