我一直在试图弄清楚本教程中代码的两部分: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度吗?
答案 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游戏的情况下,这可能更有用。