OpenGL相机/方向矢量

时间:2014-05-09 21:33:05

标签: opengl trigonometry

我一直在试图弄清楚本教程中代码的两部分:Keyboard and Mouse

具体做法是:

// 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度吗?

1 个答案:

答案 0 :(得分: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游戏的情况下,这可能更有用。