【发布时间】:2012-10-27 22:25:24
【问题描述】:
我正在尝试通过更新三个向量来实现 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);
}
【问题讨论】:
-
我认为更新 DIR 向量就足够了。 UP 向量可以是 (0,1,0),它会在垂直于 EYE 和 DIR 之间的向量的方向上自动解析。如果我错了,请纠正我。
-
所以你是说我应该保持代码不变,但删除向上向量的更新?我会继续尝试,让你知道会发生什么。谢谢,马克斯。
-
@Max 感谢您的建议,但没有奏效。我将它更新为这个(我用中心切换目录):查看上面的编辑。
-
度数参数是否指定了相对于当前位置您想要转动多少?
-
这里,我有链接解释我的意思 - 你不需要调整 UP 矢量。 stackoverflow.com/questions/3427379/… 另外,谷歌它并阅读 gamedev.net 结果。希望你清楚。
标签: opengl graphics vector-graphics frame-rate glulookat