【问题标题】:gluLookAt vectors and FPS-style cameragluLookAt 向量和 FPS 风格的相机
【发布时间】: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


【解决方案1】:

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;}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多