Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在OSX(或跨平台)c+上实现无GLU的FPS摄像头+;_C++_Opengl_Camera_3d - Fatal编程技术网

C++ 如何在OSX(或跨平台)c+上实现无GLU的FPS摄像头+;

C++ 如何在OSX(或跨平台)c+上实现无GLU的FPS摄像头+;,c++,opengl,camera,3d,C++,Opengl,Camera,3d,我试图让FPS风格的相机工作,同时遵循openGL超级圣经书中的示例 这一切都进行得很顺利,直到我遇到了一个问题,当你真的只想要俯仰和偏航时,你最终会发生侧倾 这个问题基本上是问同样的问题,但我希望有人能够对实现更详细一点,最好是有SuperTools框架的经验 我已经尝试过实现我必须编译的函数,但要么是在复制所需函数时出错,要么是在使用它时传入了错误的参数 我想我发现它有点混乱,因为《超级圣经》的代码抽象了一点相机的工作原理,所以我发现很难正确实现它。在测试我的当前版本时,我会传入如下参数

我试图让FPS风格的相机工作,同时遵循openGL超级圣经书中的示例

这一切都进行得很顺利,直到我遇到了一个问题,当你真的只想要俯仰和偏航时,你最终会发生侧倾

这个问题基本上是问同样的问题,但我希望有人能够对实现更详细一点,最好是有SuperTools框架的经验

我已经尝试过实现我必须编译的函数,但要么是在复制所需函数时出错,要么是在使用它时传入了错误的参数

我想我发现它有点混乱,因为《超级圣经》的代码抽象了一点相机的工作原理,所以我发现很难正确实现它。在测试我的当前版本时,我会传入如下参数

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?
我应该如何管理和传递look变量?目前看来,“外观”值保持在同一位置,因此如果我向后移动,我最终会围绕场景旋转

glhLookAtf2(mCamera, mCamera, look, up);
我觉得我必须更好地管理我的视线方向,可能还有我的相机位置。看起来奇怪的是,外观位置似乎没有改变


有谁能帮我,或者给我指出一条坚实的教程路径吗?我正试图避免做任何不推荐的事情,但在这一点上,我真的很高兴能让某些东西起作用。

这是一件容易的事情。只需3个矢量即可处理摄影机: 位置、相对注视和相对向上向量

设置好这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是添加了眼向量的真实注视:

camera.lookAt = camera.eye + camera.rLookAt;
所以这基本上应该包括设置一个摄像头。相机的下一个基本任务是移动。这要归功于相对注视简单的任务,因为您只需更新眼向量。您可能还想更新AbsoluteLookat,但这是我上面展示的同一段代码

最后,您需要旋转视图。有一点很棘手,那就是你可以使用3种解释——矩阵、3个角或四元数。因为角度很容易理解(另一方面,它们的性能最差,并且受到万向节锁的影响),所以我将向您展示如何做到这一点。我不会描述什么是万向节锁,你可以谷歌这一个,但为了避免它,我们需要限制旋转。水平旋转时,我们将使用全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是定义向量的公共成员

所以如果你想要俯仰,基本上是旋转和偏航旋转。 为了更新您的相机,您需要旋转相对注视和向上向量,计算绝对注视并将其提供给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);

谢谢大家的回答,但我的问题是这个。在openGL超级圣经中,我使用了他们内置的参考框架类,我遇到的问题是两个函数,一个叫做rotate,另一个叫做rotateWorld

我需要使用旋转进行上/下移动,使用旋转旋转旋转进行左右移动。这使摄影机的行为正确(飞行摄影机)


这是有道理的,因为无论你向上/向下看,你都希望整个世界始终围绕垂直轴旋转。呸

另外,当我使用wasd键移动场景时,当“注视”预设为{1.0f、1.0f、1.0f}时,相机不会聚焦在场景中间。但是,当我将变量从鼠标的look-1传递到1时,相机确实会移动,只是不正确。如果我确定了观察位置,相机不应该聚焦在中心吗?