Camera 飞行模拟器摄像机

Camera 飞行模拟器摄像机,camera,game-engine,quaternions,Camera,Game Engine,Quaternions,编辑:我上传了一个视频到youtube,显示了现在发生的事情。当我旋转60度(俯仰或偏航)时,我会感到奇怪的颤抖。如您所见,鼠标输入工作正常(没有不必要的滚动,滚动后局部出现俯仰/偏航) 我正试图在我正在制作的OpenGL游戏中实现一个飞行模拟器摄像头。我遵循了页面底部提到的内容,对视图矩阵的计算结果是: my = my * 0.001f; //per-frame delta mx = mx * 0.001f; //per-frame delta glm::vec3 pitchAxis = g

编辑:我上传了一个视频到youtube,显示了现在发生的事情。当我旋转60度(俯仰或偏航)时,我会感到奇怪的颤抖。如您所见,鼠标输入工作正常(没有不必要的滚动,滚动后局部出现俯仰/偏航)

我正试图在我正在制作的OpenGL游戏中实现一个飞行模拟器摄像头。我遵循了页面底部提到的内容,对视图矩阵的计算结果是:

my = my * 0.001f; //per-frame delta
mx = mx * 0.001f; //per-frame delta

glm::vec3 pitchAxis = glm::normalize( glm::cross( cameraDirection, cameraUp ) );
glm::vec3 yawAxis = glm::normalize( cameraUp );

glm::quat pitchQuat = glm::angleAxis( (float)my, pitchAxis );
glm::quat yawQuat = glm::angleAxis( (float)mx, yawAxis );

glm::quat comp = yawQuat * pitchQuat;

cameraDirection = cameraDirection * comp;

pitchAxis = glm::cross( cameraDirection, cameraUp );
cameraUp = glm::cross( pitchAxis, cameraDirection );

return glm::lookAt( cameraPosition, cameraPosition + cameraDirection, cameraUp );
其中,我根据鼠标输入计算增量俯仰/偏航四元数,然后将其应用于相机的方向。然后,我使用叉积基于新的俯仰轴重新计算相机的上方向向量

当我测试它时,我没有得到任何90度的相机锁定,但如果我俯仰和偏航,那么相机也开始滚动(不需要)

post中的公认答案建议使用全局俯仰/偏航/横摇值,而不仅仅是我上面使用的增量值。因此,我继续尝试这样做:

//using left-handed coordinate system
glm::vec3 yawAxis = glm::vec3( 0.0f, 1.0f, 0.0f );
glm::vec3 pitchAxis = glm::vec3( -1.0f, 0.0f, 0.0f );
//glm::vec3 rollAxis = glm::vec3( 0.0f, 0.0f, -1.0f );

glm::quat yawQuat = glm::angleAxis( yaw, yawAxis );
glm::quat pitchQuat = glm::angleAxis( pitch, pitchAxis );

glm::quat composite = yawQuat * pitchQuat;

cameraDirection = composite * glm::vec3( 0.0f, 0.0f, -1.0f );

glm::quat rollQuat = glm::angleAxis( roll, cameraDirection );
cameraUp = rollQuat * glm::vec3( 0.0f, 1.0f, 0.0f );

return glm::lookAt( cameraPosition, cameraPosition + cameraDirection, cameraUp );
其中,如果鼠标移动,则每帧的偏航和俯仰都会增加。我仍然可以很好地四处看看,但如果:

  • 我向上或向下倾斜90度,然后继续拍摄,就像相机翻转/反转一样
  • 我首先滚动,俯仰/偏航仍然是关于全局轴(代码中预期的),而不是我认为应该是的局部摄影机轴,这就是为什么我尝试第一种方法

我认为第一个问题可以通过一个案例来解决,即当俯仰>90度或时翻转全局俯仰轴,这通常很难让3D相机做你想做的事情。由于应用更改的顺序会影响下一次更改。 当您尝试不同的方法时,可以更容易地在单独的步骤中应用俯仰、偏航和横摇的变化,如下所示:

编辑:添加有关相机本地空间的信息

  • 使用摄影机局部空间将俯仰应用于摄影机方向和摄影机向上(前向向量为摄影机方向,上向向量为摄影机向上)
  • 使用新的局部空间将偏航应用于摄影机方向和摄影机向上
  • 使用新的局部空间,将滚动应用于摄影机方向和摄影机向上
  • 现在将摄影机用于视图矩阵

这样,您可以在测试时注释掉不同的步骤。当您对结果感到满意时,您可以尝试将这些步骤移动到一起以提高性能,但更改的顺序可能会使其变得困难。

通常很难让3D相机按您的要求进行操作。由于应用更改的顺序会影响下一次更改。 当您尝试不同的方法时,可以更容易地在单独的步骤中应用俯仰、偏航和横摇的变化,如下所示:

编辑:添加有关相机本地空间的信息

  • 使用摄影机局部空间将俯仰应用于摄影机方向和摄影机向上(前向向量为摄影机方向,上向向量为摄影机向上)
  • 使用新的局部空间将偏航应用于摄影机方向和摄影机向上
  • 使用新的局部空间,将滚动应用于摄影机方向和摄影机向上
  • 现在将摄影机用于视图矩阵

这样,您可以在测试时注释掉不同的步骤。当您对结果感到满意时,您可以尝试将步骤移动到一起以提高性能,但更改的顺序会使操作变得困难。

这不会导致万向节锁定,因为它将应用3个单独的旋转,而不是单个旋转?您是对的,我将编辑答案来说明我的意思。所以我刚刚抽出时间来看看你的建议。所以当我俯仰时,我应该做一些类似的事情:向前=俯仰四分之一*向前而不是向前=俯仰四分之一*向量(0,0,1)。这样,每个旋转都是基于局部轴而不是世界轴?是的,这就是想法。在飞机上,如果你把机头垂直向上俯仰,向前实际上是向上的。如果你分开不同的旋转,你会得到更多的计算,但是如果你想的话,你可以在以后尝试优化它。这只适用于增量输入,即不存储偏航/俯仰/滚转。这现在可以正常工作了,当我俯仰和偏航时,相机会滚动,这是预期的。这不会导致万向节锁定,因为它将应用3个单独的旋转,而不是单个旋转?你是对的,我将编辑答案以显示我的意思。所以我刚刚抽出时间来看看你的建议。所以当我俯仰时,我应该做一些类似的事情:向前=俯仰四分之一*向前而不是向前=俯仰四分之一*向量(0,0,1)。这样,每个旋转都是基于局部轴而不是世界轴?是的,这就是想法。在飞机上,如果你把机头垂直向上俯仰,向前实际上是向上的。如果你分开不同的旋转,你会得到更多的计算,但是如果你想的话,你可以在以后尝试优化它。这只适用于增量输入,即不存储偏航/俯仰/滚转。这项工作现在很好,相机在我俯仰和偏航时滚动,这是预期的。