1

我试图通过更新三个向量来实现 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);
}
4

1 回答 1

0

rotate() 方法没有定义,好像忘记实现了。它似乎是围绕任意轴旋转,您可以从公式 http://upload.wikimedia.org/math/f/b/a/fbaee547c3c65ad3d48112502363378a.png
(轴和角度的旋转矩阵)形式 Wiki http实现它://en.wikipedia.org/wiki/Rotation_matrix

代码:

mat3 Transform::rotate(const float degrees, const vec3& axis) { 
glm::mat3 m3;
glm::mat3 I(1.0f,0.0f,0.0f,0.0f,1.0f,0.0f,0.0f,0.0f,1.0f);
glm::mat3 T(axis.x*axis.x, axis.x*axis.y, axis.x*axis.z,axis.y*axis.x, axis.y*axis.y, axis.y*axis.z,axis.z*axis.x, axis.z*axis.y, axis.z*axis.z);
glm::mat3 A(0.0f,-axis.z, axis.y, axis.z, 0.0f, -axis.x,-axis.y,axis.x,0.0f);
m3 = glm::cos(degrees)*I + (1.0f-glm::cos(degrees))*T + glm::sin(degrees)*A;  return m3;}
于 2012-11-20T14:14:22.577 回答