Quaternion LookAt相机

我正在使用下面的代码来旋转实体来查看点。

glm::vec3 forwardVector = glm::normalize(point - position); float dot = glm::dot(glm::vec3(0.0f, 0.0f, 1.0f), forwardVector); float rotationAngle = (float)acos(dot); glm::vec3 rotationAxis = glm::normalize(glm::cross(glm::vec3(0.0f, 0.0f, 1.0f), forwardVector)); rotation = glm::normalize(glm::quat(rotationAxis * rotationAngle)); 

这对我平常的实体工作正常。 但是,当我在我的相机实体上使用这个,我得到一个黑屏。 如果我在第一行翻转减法,以便将前向vector作为从该点到相机位置的方向,那么我的相机就可以工作,但自然,我的实体会旋转,从而在相反的方向上进行查看。

我计算相机的变换matrix,然后把相反的视图matrix,我传递给我的OpenGL着色器:

 glm::mat4 viewMatrix = glm::inverse( cameraTransform->GetTransformationMatrix() ); 

正交投影matrix是使用glm :: ortho创建的。

怎么了?

你正在比较世界空间前向vector和目标(视图 – 空间)前向vector来计算将摄像机转换到视野所需的旋转吗?
在这种情况下,我认为你应该尝试改变第二行

 float dot = glm::dot(glm::vec3(0.0f, 0.0f, -1.0f), forwardVector); 

因为如果我没有弄错,在OpenGL中,相机被假定为在视图空间中向下看负Z轴。 这也可以解释为什么在第一行删除减法有点解决您的问题。 负向前向量和正向z向之间的角度应该与负向z向和正向向量之间的角度相同。 (你可以通过画一个小小的草图来确认)。
为了修复其他实体的错误旋转,我相信你不应该把你计算的变换matrix的逆matrix取反。 你获得的方向已经将一个给定的向量转换成视图空间,这是约束,你从后面导出而不是反过来。 尽管将原点映射到相机位置的翻译将不得不颠倒,但是如果使用将相机位置映射到原点的变换,则不要反转。

还有用于计算视图matrix的glm :: lookAt()函数,如果您没有任何需要您自己进行计算的特定要求,那么它将非常适合使用glm :: ortho()。