当前位置: 首页 > 知识库问答 >
问题:

飞行模拟器摄像机

宁飞宇
2023-03-14

编辑:我上传了一段视频到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度的相机锁,但是如果我俯仰和偏航,相机也开始滚动(不需要)。

这篇文章中的公认答案建议使用全局俯仰/偏航/横摇值,而不仅仅是我上面使用的增量值。所以我继续尝试:

//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度,然后继续,就像相机翻转/反转一样
  • 我首先滚动,俯仰/偏航仍然是关于全局轴(这是代码中预期的),而不是我认为应该是的局部相机轴,这就是为什么我尝试了第一种方法

我认为第一个问题可以通过一个案例来解决,即在俯仰时翻转全局俯仰轴

我如何实现这台相机有一个根本性的缺陷,还是我遗漏了一些明显的东西?

共有1个答案

马浩淼
2023-03-14

让3D相机做你想做的事情通常很棘手。因为在女巫中应用您的更改会影响下一个更改。当您尝试不同的方法时,可以更轻松地在单独的步骤中应用俯仰、偏航和滚动的变化,如下所示:

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

  • 使用相机局部空间将俯仰应用于相机方向和相机向上(前向向量是相机方向,上向向量是相机向上)

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

 类似资料:
  • 有人知道模拟器相机启动时是否有可能打开一些个人照片吗? 我有一个基于图像分析的应用程序,我想当我点击相机的按钮时,相机打开的不是默认的Android emulator运动图像。我希望它打开一些我设置为默认图像的图像。因此,当我选择拍照时,它将只显示该图像,当我拍照时,该图像将保存到gallery,而不是Android默认图像。

  • 这是我关于堆栈溢出的第一个问题,如果我错过了指南,请原谅。 我已经在我的macbook air上安装了android Studio 1.0.1并运行avd。 我已经添加了模拟的前端和后端相机。 当我单击模拟器的默认相机应用程序时,它向我显示模糊的屏幕,没有图片视图。 首先,我试着尽可能多地搜索。没有找到与我相关的错误主题。这就是为什么我在这里发布了我的问题。希望学长不要介意。 屏幕截图显示了我对相

  • 我正在通过将前置摄像头设置为 AVD 管理器中的“webcam0”来将网络摄像头连接到模拟器。当我启动模拟器的相机应用程序时,我收到错误 以下是 Android 源代码的相关部分: 网络摄像头已被正确分配了0的ID,因为只有1个摄像头。但是,可能仍然为0。这意味着模拟器正在注册摄像头,但它没有费心更新连接的摄像头数量。 如何连接网络摄像头,使其能够被模拟器正确识别? 编辑:命令

  • 我正在尝试使用PC的内置网络摄像头在我的Android应用程序中拍照。我正在使用 eclipse Android 模拟器,并将 AVD 设置为使用 webcam0 作为后置摄像头,但是当我运行我的程序时,它总是崩溃,说“不幸的是,相机已停止”。我已将以下行添加到我的清单 xml 中: 尽管它似乎仍然不起作用。我在一些地方读到过,在AVD管理器的编辑/创建界面中应该有一个“硬件”部分,但是我的没有。

  • 7.2.4 编程实例:模拟炮弹飞行 本节讨论一个模拟炮弹飞行的程序的设计。我们采用三种设计方法,得到三个版本的程序。通过比较各个版本的差别,可以看出 OOP 与传统的面向过程编程相比具有明显优点。 算法设计 程序规格是输入炮弹的发射角度、初速度和高度,输出炮弹的射程。 虽然可以利用复杂的数学公式直接算出射程,但我们采用模拟炮弹飞行过程的方法来求射程。所谓模拟炮弹飞行过程,就是从炮弹射出炮口开始,计

  • 前面的教程中我们讨论了观察矩阵以及如何使用观察矩阵移动场景(我们向后移动了一点)。OpenGL本身没有摄像机(Camera)的概念,但我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机,产生一种我们在移动的感觉,而不是场景在移动。 本节我们将会讨论如何在OpenGL中配置一个摄像机,并且将会讨论FPS风格的摄像机,让你能够在3D场景中自由移动。我们也会讨论键盘和鼠标输入,最终完成一个