gpt4 book ai didi

c++ - 如何在 OSX(或跨平台)c++ 上实现没有 GLU 的 FPS 相机

转载 作者:太空宇宙 更新时间:2023-11-04 14:23:57 26 4
gpt4 key购买 nike

我正在尝试让 FPS 风格的相机工作,同时遵循 openGL SuperBible 书中的示例。

一切都进行得很顺利,直到我遇到了最终发生翻滚的问题,而您实际上只想要俯仰和偏航。

Similar question

这个问题基本上是在问同样的事情,但我希望有人能够更详细地说明实现,最好是有 SuperBible GLTools 框架经验的人。

我已经尝试实现 GluLookAt code我必须对其进行编译,但要么是我在复制所需函数时犯了错误,要么是我在使用它时传递了错误的参数。

我想我发现它有点令人困惑,因为 SuperBible 代码抽象了一些相机的工作原理,所以我发现很难正确实现它。在测试我当前的版本时,我正在传递这样的参数

M3DMatrix44f mCamera;
cameraFrame.GetCameraMatrix(mCamera); //returns the matrix of the CameraFrame.

M3DVector3f up = { 0.0f, 1.0f, 0.0f };
M3DVector3f look = { xHeading,yHeading,0.0f };

//xHeading & yHeading ranges from -1 to 1 based on mouse movement, is this correct?

我应该如何管理和传递外观变量?目前看起来外观值停留在同一个地方,所以如果我向后移动,我最终会围绕场景旋转。

glhLookAtf2(mCamera, mCamera, look, up);

我觉得我必须更好地管理我的视线方向,可能还有我的相机位置。看起来位置似乎没有改变,这似乎很奇怪。

任何人都可以提供帮助,或为我指明可靠的教程路径吗?我试图避免做任何不赞成的事情,但在这一点上,我真的很高兴能得到一些工作。

最佳答案

这很容易。你只需要 3 个 vector 来处理相机:位置、相对 LookAt 和相对 Up vector

设置这 3 个后,您可以像这样将它们提供给 gluLookAt:

gluLookAt(camera.eye.x,camera.eye.y,camera.eye.z,
camera.lookAt.x,camera.lookAt.y,camera.lookAt.z,
camera.up.x,camera.up.y,camera.up.z);

不要混淆,camera.lookAt 是添加了眼睛 vector 的真实 LookAt:

camera.lookAt = camera.eye + camera.rLookAt;

所以这基本上应该包括设置相机。相机的下一个基本任务是移动。这要归功于相对简单的 LookAt 任务,因为您只更新眼 vector 。您可能还想更新绝对 LookAt,但那是我上面显示的同一段代码。

最后,您需要旋转 View 。棘手的是您可以使用 3 种解释 - 矩阵、3 个角度或四元数。因为角度很容易理解(另一方面,它们的性能最差并且会受到万向节锁定的影响)我将向您展示如何做到这一点。我不会描述万向节锁是什么,你可以谷歌这个,但为了避免它,我们需要限制旋转。我们将使用完整的 360° 进行水平旋转,但仅使用 180° 进行垂直旋转。如果你查看 openGl 坐标系,我们可以定义围绕 Y 轴的水平旋转和围绕 X 轴的垂直旋转。为了在应用程序中旋转 vector ,我们使用以下 2 个代码:

vector3f vector3f::rotateX(const float &radians)
{
float t_y = y;

y = t_y*cos(radians) + z*sin(radians);
z = t_y*-sin(radians) + z*cos(radians);
return *this;
}

vector3f vector3f::rotateY(const float &radians)
{
float t_x = x;

x = t_x*cos(radians) + z*-sin(radians);
z = t_x*sin(radians) + z*cos(radians);
return *this;
}

你可以看到我从我的代码中复制了这个。 vector3f 只是一个包含 3D vector 所有内容的类。 x、y 和 z 是定义 vector 的公共(public)成员。

因此,如果您想要俯仰,基本上是 rotateX 和偏航 rotateY。要更新相机,您需要同时旋转相对 LookAt 和 Up vector ,计算绝对 LookAt 并将其提供给 gluLookAt。就这样..

PS:少数人在 OSX 上编写 opengl 程序并非如此。我从未运行过 OSX,但作为跨平台的 openGl 肯定仍然很受欢迎。

PSS:我忘了说,永远不要添加轮换。最好添加角度,每次旋转设置 vector 到默认位置并以该绝对角度旋转:

rLookAt.set(0,0,-1);
rLookAt.rotateX(rotations.x);
rLookAt.rotateY(rotations.y);
lookAt = eye + rLookAt;

up.set(0,1,0);
up.rotateX(rotations.x);
up.rotateY(rotations.y);

关于c++ - 如何在 OSX(或跨平台)c++ 上实现没有 GLU 的 FPS 相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5545867/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com