第一人称相机,转身 OPENGL

first person camera, turning around OPENGL

我有一台带 Obs、VRP 和向上矢量的透视相机。

我想实现转身,在我的场景中扮演观察者的角色。我已经实现了向前和向后,因为它只是将相同数量的 z 坐标添加到 Obs 和 VRP(两者都是 vec3)。 当我尝试实施旋转时,问题就来了, 有什么办法可以用矩阵积来做吗?我试过了:

x = R * 余弦角

z = R * 正弦角

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