如何使用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四元数的好信息,甚至在三维编程中也没有找到四元数
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);
}
- 无法将结构注册为增强几何体3D点
- 了解 GLM- openGL 中的相机转换
- OpenGL大的3D纹理(>2GB)非常慢
- OpenGL相机和相机空间转型的困惑
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- 如何使用按钮更新GTK3图像以使用C++从相机捕获图片
- 如何使用OpenCV从已知的3D点云(在没有I的情况下构建)估计新图像I的相机姿态矩阵
- OPENCV(C ) - 从已知的3D对象和相机位置计算图像的2D坐标
- 3D相机具有意外的卷
- OpenCV立体视觉3D坐标到2D相机平面投影不同于将2D点三角化到3D
- 如何在 3D 空间中正确移动相机
- 在3D中旋转针孔相机
- 在单目视觉里程计中使用 3D-2D 运动估计的相机位置
- 使用 DirectX11 进行相机 3D 旋转
- 3D 几何:从相机位置、最小和最大视角长度、指向角度和视角查找观看边界
- 2D 坐标到 3D 坐标分辨率和相机矩阵
- 如何使用glm旋转3D相机
- 3d相机-如何改变相机方向
- 关于3d相机类的帮助