我正在使用键盘上的箭头键实现一个 first-person 相机来移动场景。当我只绕一个轴(X 或 Y)旋转时似乎工作正常,但是如果我绕两个轴旋转它也会让我绕第三个 Z 轴旋转。我很确定问题是我的相机不是围绕全局轴旋转而是旋转本地轴,当我只想要偏航和俯仰时会导致“滚动”。在我的代码中,我从 X 和 Y 旋转中推导出一个前向向量,存储在两个变量中。最相关的代码段如下:
glm::mat4 CameraManager::rotateWorld(float angle, glm::vec3 rot){
static float yRot = 0.0f;
static float xRot = 0.0f;
glm::vec3 degrees = rot * angle;
glm::vec3 radians = glm::vec3(degrees.x * (M_PI/180.0f),
degrees.y * (M_PI/180.0f),
degrees.z * (M_PI/180.0f));
yRot += radians.y;
xRot += radians.x;
forwardVector = glm::vec3(sinf(yRot) * cosf(xRot),
-sinf(xRot),
-cosf(yRot) * cosf(xRot));
return glm::rotate(glm::mat4(1.0f), angle, rot);
}
moveForward
函数由moveForward
函数补充:
glm::mat4 CameraManager::moveForward(float dist){
glm::vec3 translation = forwardVector/glm::vec3(sqrt(forwardVector.x * forwardVector.x +
forwardVector.y * forwardVector.y +
forwardVector.z * forwardVector.z)) * dist;
return glm::translate(glm::mat4(1.0f), -translation);
}
其中yRot
相当于偏航,xRot
相当于俯仰。旋转和平移矩阵简单地在程序的主要部分中相乘。
然后,我继续乘以此向量的距离d
来更新位置。
xRot 和 yRot 是static double
s,当用户按下箭头键时获得 incremented/decremented。
程序启动时,这是视图。飞机和猴子头朝向“正确的方向”。 incrementing/decrementing 俯仰和偏航单独按预期工作。但是,当我说,增加音高然后偏航时,场景会向侧面翻转! (图片 below.)任何想法如何解决这个问题?
1 回答
如果我理解正确,您遇到的问题是您的“向上”向量并不总是相对于查看平面的预期 Y 轴垂直向上指向。
确定正确的“向上”向量通常需要针对视口的 X 和 Y 轴上的矢量进行交叉乘积运算的组合。
您可能会为
gluLookAt
函数找到一些有用的提示在文档中,其目的是计算具有所需方向的视图矩阵(i.e.无滚动)给定眼睛位置和该字段的预期中心的坐标。