OpenGL相机运动问题

OpenGL相机运动问题,opengl,3d,rotation,quaternions,glm-math,Opengl,3d,Rotation,Quaternions,Glm Math,我旋转偏航俯仰摄像头时出现问题。我的相机工作得很好,除了看向上或向下的时候。使用叉积获得正确的向量会在查找时使程序崩溃,因为我最初是将前向向量(0,1,0)与世界上向向量(0,1,0)交叉。为了解决这个问题,我决定通过取前向向量和上向向量的叉积来计算右向量(这意味着我还需要更新上向向量)。我用这段代码得到了奇怪的结果,对我来说,这是有意义的: glm::quat quaternion = glm::angleAxis(angle.x, glm::vec3(0, 1, 0)); forward

我旋转偏航俯仰摄像头时出现问题。我的相机工作得很好,除了看向上或向下的时候。使用叉积获得正确的向量会在查找时使程序崩溃,因为我最初是将前向向量(0,1,0)与世界上向向量(0,1,0)交叉。为了解决这个问题,我决定通过取前向向量和上向向量的叉积来计算右向量(这意味着我还需要更新上向向量)。我用这段代码得到了奇怪的结果,对我来说,这是有意义的:

glm::quat quaternion = glm::angleAxis(angle.x, glm::vec3(0, 1, 0));

forward = glm::rotate(quaternion, forward); // change yaw

glm::vec3 right = glm::cross(forward, up);

quaternion = glm::angleAxis(angle.y, right);

forward = glm::rotate(quaternion, forward); // change pitch

up = glm::cross(right, forward); // update up-vector, unintended result
我调用
up=glm::cross(right,forward)
来更新我的相机的上方向向量,这样如果我将相机直接指向上,我就可以安全地使用
glm::vec3 right=glm::cross(right,forward)
来获得俯仰旋转的右方向向量。但是,这段代码会导致我的相机将上方向向量侧向旋转,这是我不希望看到的。谢谢你的帮助

简言之,我如何重新计算我的相机的上方向向量,这样我就可以用它来计算我相机的右方向向量和一个叉积


编辑:为了澄清,由于某种原因,
up=glm::cross(右,向前)
使我的相机“滚动”。我不知道为什么会发生这种情况。

您是否初始化
转发到类似
(0,0,-1)
?是的,已初始化。如果我把这个
up=glm::cross(right,forward)
从我的代码中去掉,相机可以作为飞行偏航俯仰相机正常工作。您是否保存了一些状态?或者
向前
向右
向上
是否总是从头开始计算?在计算
up
之前,您先计算
right
,然后为什么要将
right
重新计算为叉积?你说的“上方向向量是侧向旋转的”是什么意思?我使用的是
glm::lookAt()
位置
向前
向上
。所有状态都保存在Camera类中,此函数只更新这些向量,以便我可以使用偏航和俯仰移动。我用
向前
向上
的叉积来计算
,因为如果我用
向前
(0,1,0)
来计算它,则取叉积可能会使程序崩溃。我重新计算
向上
,因为如果我不这样做,它将始终保持为
(0,1,0)
。最后,当我说“上方向向量侧向旋转”时,我的意思是我的相机在其前轴上倾斜(相机翻转),你的计算不应该基于更新的向量。尤其是
向前
向量应始终类似于
(0,0,-1)
,而向上向量应始终类似于
(0,1,0)
。旋转已经旋转的向量有点难以管理。