第一人称摄像机,在OPENGL中旋转

3

我有一个透视相机,具有Obs和VRP以及Up向量。

我想实现围绕自己转动,就像在场景内观察者一样。我已经实现了前进和后退,因为只需将相同数量添加到Obs和VRP的z坐标即可(两者都是vec3)。

当我尝试实现旋转时,问题出现了,是否有任何办法可以通过矩阵乘积来实现?我尝试了以下内容:

x = R * cos angle

z = R * sin angle

其中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]);
}

你使用glut吗? - Mykola
我正在使用glm库。 - Daniel Roca Lopez
1个回答

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是旋转矩阵。根据你的记号法,视图矩阵可能需要被倒置。


1
你的回答看起来很有趣,尽管我还没有完全理解它,但我想在每次按下左右箭头时给相机添加一个固定的旋转,并且如果我应用你的前两行代码,VRP(视点参考点)将会每次都更远一些。 - Daniel Roca Lopez
抱歉,你是完全正确的:我写了 VRP + 这个错误的公式。正确的公式应该以 Obs + 开始。现在 VRP 和 Obs 之间的距离应该始终保持不变。 - BDL
编辑了我的帖子,你会在哪里应用你得到的新VRP?另外,为了累积旋转,我需要保存其他什么吗?因为我尝试了一些看起来类似的东西,但并没有正常工作,不过我会再看看。 - Daniel Roca Lopez
VRP_new 可以替换您的 VRP。但我只会存储 Obs、angle 和 r(因为它是常数),并在每次需要时计算 VRP。 - BDL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接