我试图通过更新三个向量来实现 FPS 风格的相机:EYE、DIR、UP。这些向量与 gluLookAt 使用的向量相同(因为 gluLookAt 由相机的位置、它所看的方向和向上向量指定)。
我已经实现了左右和上下扫射运动,但是我很难理解在保持静止的同时让相机环顾四周的数学原理。在这种情况下,EYE 向量保持不变,而我必须更新 DIR 和 UP。
下面是我尝试过的代码,但它似乎无法正常工作。有什么建议么?
void Transform::left(float degrees, vec3& dir, vec3& up) {
vec3 axis;
axis = glm::normalize(up);
mat3 R = rotate(-degrees, axis);
dir = R*dir;
up = R*up;
};
void Transform::up(float degrees, vec3& dir, vec3& up) {
vec3 axis;
axis=glm::normalize(glm::cross(dir,up));
mat3 R = rotate(-degrees, axis);
dir = R*dir;
up = R*up;
};
rotate 方法创建一个旋转矩阵,该矩阵围绕轴旋转一定度数。
--
编辑:我将它编辑为这个(也将“dir”切换为“center”),但它仍然没有用。当我尝试向左/向右旋转时,没有任何反应。当我尝试向上/向下旋转时,对象消失了。
void Transform::left(float degrees, vec3& center, vec3& up) {
center = center*rotate(-degrees,glm::normalize(up));
}
void Transform::up(float degrees, vec3& center, vec3& up) {
vec3 axis = glm::normalize(glm::cross(center,up));
center = center*rotate(-degrees, axis);
}