如何用glm旋转3D相机

时间:2014-11-11 18:10:18

标签: c++ opengl 3d quaternions glm-math

所以,我有一个Camera类,女巫有向前,向上和位置。我可以通过改变位置移动相机,我正在计算它的矩阵:

  glm::mat4 view = glm::lookAt(camera->getPos(),
  camera->getTarget(), //Caclates forwards end point, starting from pos
  camera->getUp());  
问题是,如何在不进行万向节锁定的情况下旋转相机。我没有找到任何关于glm四元数的信息,甚至没有在3d编程中找到四元数

1 个答案:

答案 0 :(得分:1)

glm使四元数相对容易。您可以使用包含Euler角度的glm :: vec3启动四元数,例如glm :: fquat(glm :: vec3(x,y,z))。您可以通过乘法(r = r1 * r2)将四元数旋转到另一个四元数,这样就没有万向节锁定。要使用四元数生成矩阵,请使用glm :: mat_cast(yourQuat)将其转换为旋转矩阵。

因此,假设您正在制作3D应用程序,将方向存储在四元数中并将您的位置存储在vec4中,然后,为了生成View矩阵,您可以使用vec4(0,0,1,1)并相乘与四元数生成的矩阵相对应,然后将其添加到位置,这将为您提供目标。可以通过将四元数矩阵乘以vec4(0,1,0,1)来获得向上矢量。如果你有任何问题,请告诉我。

对于你的另外两个问题假设你使用的是opengl而你的Z轴是前轴。 (正X远离用户。)

1)。要变换前向矢量,可以在四元数上围绕Y轴和X轴旋转。例如glm :: fquat(glm :: vec3(rotationUpandDown,rotationLeftAndRight,0))。并将其乘以您的方向四元数。

2)。如果要滚动,请找到前轴所在的组件。由于您似乎使用的是openGL,因此该轴很可能是您的正Z轴。所以如果你想滚动,glm :: quat(glm :: vec3(0,0,rollAmt))。并将其乘以您的方向四元数。 oriention = rollquat * orientation。

注意::这是一个可以帮助你的功能,我曾经将它用于我的相机。 制作将1个向量转换为另一个向量的quat,例如将一个向量向量转换为另一个向量。

//Creates a quat that turns U to V
glm::quat CreateQuatFromTwoVectors(cvec3 U, cvec3 V)
{
    cvec3 w = glm::cross(U,V);
    glm::quat q = glm::quat(glm::dot(U,V), w.x, w.y, w.z);
    q.w += sqrt(q.x*q.x + q.w*q.w + q.y*q.y + q.z*q.z);
    return glm::normalize(q);
}