如何使用glm旋转3D相机

How to rotate 3D camera with glm

本文关键字:3D 相机 旋转 glm 何使用      更新时间:2023-10-16

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

  glm::mat4 view = glm::lookAt(camera->getPos(),
  camera->getTarget(), //Caclates forwards end point, starting from pos
  camera->getUp());  

穆的问题是,我怎么能旋转相机而不得到万向节锁。我还没有找到任何关于glm四元数的好信息,甚至在三维编程中也没有找到四元数

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

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

对于您的另外两个问题,假设您使用的是opengl,并且您的Z轴是正向轴。(正X远离用户。)

1) 。若要变换正向矢量,可以在四元数上绕Y轴和X轴旋转。例如glm::fquat(glm:∶vec3(旋转向上和向下,旋转向左和向右,0))。并将其乘以方向四元数。

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

注意:这是一个可能对你有帮助的功能,我以前在相机上使用过这个。制作一个将一个矢量转换为另一个矢量的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);
}