我正在尝试使用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个向量即可处理相机:
位置,相对LookAt和相对Up向量
设置完这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是添加了眼睛向量的逼真的LookAt:
camera.lookAt = camera.eye + camera.rLookAt;
因此,这基本上应该涵盖设置摄像机。相机的下一个基本任务是移动。这要归功于相对的LookAt轻松任务,因为您只需更新眼图矢量即可。您可能还想更新绝对LookAt,但这与我上面显示的代码相同。
最后,您需要旋转视图。棘手的是,您可以使用3种解释-矩阵,3个角或四等分。因为角度很容易理解(另一方面,它们的性能最差并且受万向节锁定的影响),我将向您展示如何做到这一点。我不会描述什么是万向节锁,您可以在Google上进行搜索,但要避免这种情况,我们需要限制旋转角度。水平将使用完整的360°,垂直旋转仅使用180°。如果您查看openGl协调系统,我们可以定义围绕Y轴的水平旋转和围绕X轴的垂直旋转。为了在应用中旋转矢量,我们使用以下两个代码:
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向量的所有内容的类。 x,y和z是定义向量的公共成员。
因此,如果您想要的音调基本上是rotateX和偏航rotateY。
为了更新相机,您需要同时旋转相对LookAt和Up向量,计算绝对LookAt并将其提供给gluLookAt。就这样..
PS:很少有人在OSX上编写opengl。我从来没有运行过OSX,但作为跨平台的openGl仍然很受欢迎。
PSS:我忘了提,永远不要增加轮换。最好添加角度,并且每次将设置矢量旋转到默认位置并以该绝对角度旋转时:
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/