我有带Obs和VRP和Up vector 的透视相机。
我想实现转身以使自己像场景中的观察者一样。我已经实现了前进和后退,因为它只是将相同量的z坐标添加到Obs和VRP(均为vec3)。
当我尝试实现旋转时,问题就来了,
有什么办法可以做矩阵乘积吗?我已经尝试过了:
x = R *余弦角
z = R *正弦角
其中R是 vector 的大小(VRP-Obs),但不起作用
编辑:我在这里应用 View 和投影矩阵:
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)
由于稍后可能需要第二个旋转轴,因此建议为相机使用以下参数:位置 vector t和两个 Angular ,分别描述围绕x和y轴[rx,ry]的旋转。可以将它们组合到每一帧中以获得Obs和VRP,但这并不是真正必要的,因为可以直接从此参数派生 View 矩阵:
V = T(t) * R_y(ry) * R_x(rx),
其中T是平移矩阵,R_x,R_y是旋转矩阵。根据您的表示法,可能需要反转 View 矩阵。
关于c++ - 第一人称摄影机,转过OPENGL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33125588/