使用lookAt进行相机旋转
Camera Rotation using lookAt
嘿,伙计们,我试图做一个相机类,使用从glm库lookAt。我有4个点,第一个是eye,这是相机在空间中的位置,第二个是look,这是相机所看到的点,第三个是upp,它设置了相机的方向,第四个是side,这是look -eye和upp -eye的叉积。
所以最后我得到了3个向量的基底它们的原点都在眼点。我得到了相机的坐标系统。
在我的camera类中,我希望能够围绕摄像机的坐标系旋转,而不是世界的坐标系。我要做的是绕摄像机坐标系的一个轴旋转
我用这样的初始值构造类:
void Observer::initialize(glm::vec3 eye, glm::vec3 look, glm::vec3 upp, glm::vec3 side)
{
this->eye = eye; // (0.0, 0.0, 0.0)
this->look = look; // (0.0, 0.0, -1.0)
this->upp = upp; // (0.0, 1.0, 0.0)
this->side = side; // (1.0, 0.0, 0.0)
}
例如,当我想围绕x轴旋转坐标系时,我从glm中调用函数,如下所示:
void Observer::pitch(GLfloat pitch)
{
glm::mat4 rotate(1.0f);
rotate = glm::rotate(rotate, pitch, side - eye);
look = glm::vec3(rotate * glm::vec4(look, 1.0f));
upp = glm::vec3(rotate * glm::vec4(upp, 1.0f));
}
到目前为止,我所理解的是,我所有的点仍然构成了相机的一个坐标系统,所有的向量彼此垂直。
然后我用lookAt函数得到的这些点来定位相机在世界中的位置。
glm::mat4 view = glm::lookAt(eye, look, upp);
将这个矩阵与OpenGL中的modelview矩阵相乘
如果我开始大量旋转,几次旋转后相机会"反映"旋转,就像我以另一种方式旋转一样(我不知道如何更好地描述真正发生的事情=s)。
我真的不明白发生了什么事。我应该在旋转之后归一化这些向量吗?我有一个问题与万向锁(我不知道很多关于万向锁)?当您对向量进行增量旋转时,数值误差会增加。当误差导致向上和向下矢量几乎指向相同方向或彼此相反时,相机变换计算不稳定,可能会发生奇怪的事情。万向节锁。长度变化会引起不同的问题。
一个对我有效的解决方案是在每次旋转后重新正交化向上和向下的向量。要做到这一点,计算它们的外积L,然后通过将L与lookAt交叉来调整(实际上是替换)向上向量。所有这一切之后,重新标准化两个向上看单位长度。
虽然正交化归一化是一个快速的操作,但你并不需要对每个相机运动都这样做。
注意,当你像这样修正向量时,你实际上是在做lookAt矩阵计算的一部分,所以考虑实现你自己的,以避免不必要的叉乘。
- 将"Compass"与相机旋转隔离开GL
- 如何围绕对象旋转相机?
- 如何使用gluLookAt围绕OpenGL中的点旋转相机视图
- 如何校准相机焦距,平移和旋转给定四个点
- 从iPhone相机拍摄的视频似乎被OpenCV旋转了90度?我该如何解决这个问题?
- 相机的旋转方向在一段时间后反转
- 将网格与VTK相机对齐(相机的视觉表示,随之移动和旋转的网格)
- 直接相机旋转的错误控制
- 如何使OpenGL相机旋转360度
- C++OpenGl相机旋转使用四元数问题
- 尝试保持光标居中时,相机旋转会受损
- OpenGL第一人称相机旋转和平移
- 在openGL或更具体的LWJGL中,一个人如何相对于相机旋转
- 使用lookAt进行相机旋转
- 变换四元数相机旋转矩阵- OpenCV
- 使用相机旋转使四边形始终显示在相机前面(c++/opengl)
- OpenGL 相机旋转不起作用
- 如何累积相机旋转
- GLM相机X,Y旋转引入Z旋转的问题
- openGL光照随相机旋转