2014-05-09 210 views
3

我一直在试图弄清楚本教程中代码的两部分内容:Keyboard and MouseOpenGL相机/方向矢量

具体做法是:

// Direction : Spherical coordinates to Cartesian coordinates conversion 
glm::vec3 direction(
    cos(verticalAngle) * sin(horizontalAngle), 
    sin(verticalAngle), 
    cos(verticalAngle) * cos(horizontalAngle) 
); 

// Right vector 
glm::vec3 right = glm::vec3(
    sin(horizontalAngle - 3.14f/2.0f), 
    0, 
    cos(horizontalAngle - 3.14f/2.0f) 
); 

我没有看到第一个是如何球形 - >直角。当我看到它,我得到:

x = r * sin(theta) * cos(phi) 
y = r * sin(theta) * sin(phi) 
z = r * cos(theta) 

我欧拉角度看,那些轴角和四元数都没有阐明什么该做或者我只是不能够把握什么我正在阅读。 ;)

第二个,右边的矢量不应该是方向矢量的右边90度吗?

+0

你是否将这些值传递给'gluLookAt(...)'或它们是否构成矩阵的基础? “向右90度”泛化不起作用的一个原因是因为它可能与你的向上平行,然后你有一个退化的三维空间。 'gluLookAt(...)'实际上是在计算交叉乘积后重新对基础向量进行了正交化处理,这样输入向上和向前的向量不一定要在90度才能生成工作视图矩阵。 –

+0

在结束位置,向前和向上传递给glm :: lookAt() – stewsims

回答

0

这与教程制作者有很大关系,他如何决定使用球坐标来生成他的视角。他的方法很有趣,但请记住,你可以拿出你自己的!

// Direction : Spherical coordinates to Cartesian coordinates conversion 
glm::vec3 direction(
    cos(verticalAngle) * sin(horizontalAngle), 
    sin(verticalAngle), 
    cos(verticalAngle) * cos(horizontalAngle) 
); 

这个看起来与您抬头的公式不同的原因是因为它是相同的想法,但转换为不同的空间。作者只是希望相机的视角是“直线前进”时verticalAngle == 0 && horizontalAngle == 0

自己动手!

x = cos(0) * sin(0) = 0 
y = sin(0)   = 0 
z = cos(0) * cos(0) = 1 

因此,在这种情况下,“看”照相机的载体直接指向到z轴,其在典型的OpenGL应用程序的情况下,将通常被认为是笔直向前(即: Y轴通常是上下)。

尝试计算不同的角度,看看如何让相机看起来向量旋转。

在第二个例子中,作者对这个公式采取了一些自由度,并且以一种只会在第一人称游戏/应用程序中有用的方式来定义它。在某些3D情况下,相机可以以不同的方式进行定向(例如,飞行模拟器)。无论如何,这仍然是一个想法。作者只是根据自己的需要调整球坐标。

就我个人而言,我更喜欢用欧拉角来拍摄角度。这需要更多的工作来设置(你需要做一些矩阵运算),但它是解决同样问题的另一种方法。但是在超出典型的FPS游戏的情况下,这可能会更有用。

+0

作者的cos * cos从z出来的位置?当我从偏航+俯仰转向外观矢量时,我也注意到了这一点。 – stewsims

+0

我想最好问你是如何理解作者想要什么以及公式来自哪里/他们如何能够想出它? – stewsims

+0

我会看看我能否想出更好的解释方式,但这主要是一个必要问题。如果您要使用您发布的原始公式,则必须考虑围绕z轴的旋转角度!这将需要更多的计算。在Minecraft的情况下,将X方向鼠标移动转换为“horizo​​ntalAngle”并将Y方向鼠标移动转换为“verticalAngle”非常有用。 cos * cos出于进入该空间的必要性。理解它的最简单方法就是将其绘制在纸上并打破计算器。 – AudioGL