繁体   English   中英

如何使用GLM旋转3D相机

[英]How to rotate 3D camera with glm

因此,我有一个Camera类,女巫具有向前,向上和定位的向量。 我可以通过更改位置来移动相机,并以此计算其矩阵:

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

穆的问题是,如何才能在不获得万向节锁定的情况下旋转相机。 我尚未找到有关glm四元数甚至3d编程中四元数的任何好信息

glm使四元数相对容易。 您可以使用包含欧拉角的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))。 并将其乘以方向四元数。 方向= rollquat *方向。

注意::这是一个可能对您有帮助的功能,我以前将其用于我的相机。 使quat将1个向量转换为另一个向量,例如将一个正向向量转换为另一个向量。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM