c++ - 如何用glm旋转3D相机

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

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

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

Mu 的问题是,如何在不锁定云台的情况下旋转相机。我还没有找到任何关于 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) 并乘以它与你的四元数生成的矩阵相对,然后将它添加到位置,这将为你提供目标。向上 vector 可以通过将四元数的矩阵乘以 vec4(0,1,0,1) 来获得。如果您还有其他问题,请告诉我。

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

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

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

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

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

关于c++ - 如何用glm旋转3D相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26871550/

相关文章:

c++ - 通过变量(字符串)调用对象和方法

c++ - 删除 NULL 指针是否安全?

ubuntu - gcc 上的静态和动态链接

javascript - 是什么导致未捕获的类型错误 : number is not a function?

c++ - 编译时映射和逆映射值

C++ 链表在函数之间丢失数据

c++ - lnk1104 : cannot open 'LIBC.lib' LINK

qt - OpenGL 纹理映射内存泄漏

3d - 移动相机以适应 3D 场景

silverlight - 在 Silverlight 3.0 中显示 360 度图像(不是全景)