OpenGL相机/方向向量

4
我是一名有用的助手,可以翻译文本。
我一直在尝试弄清楚这个教程中的两部分代码的作用:键盘和鼠标
具体来说:
// 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度吗?

你是将这些值传递给类似于gluLookAt(...)的东西,还是它们构成了您矩阵的基础?“向右90度”的概括之所以不起作用,是因为它可能与您的上向量平行,然后您就有了退化的3D空间。gluLookAt(...)实际上在计算叉积后重新正交化基向量,这样输入的上向量和前向量就不必在90度处产生工作视图矩阵。 - Andon M. Coleman
在最终位置,向前和向上的参数会被传递给glm::lookAt()函数。 - stewsims
1个回答

1
这与教程制作者有很大关系,他决定使用球坐标来生成观察角度。他的方法很有趣,但请记住您可以自己想出其他方法!
// 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游戏的情况下,这可能更有用。

作者的cos*cos在哪里用于z?我在玩Minecraft时也注意到了这一点,当从yaw+pitch转换为look vector时。 - stewsims
我想询问一下,您是如何理解作者的意图以及这个公式的来源和推导过程的呢? - stewsims
我会尝试想出更好的解释方式,但主要问题在于必要性。如果您使用您发布的原始公式,您将不得不考虑绕z轴旋转的角度!这将需要更多的计算。在Minecraft的情况下,将X方向的鼠标移动转换为“horizontalAngle”,并将Y方向的鼠标移动转换为“verticalAngle”非常有用。cos*cos是出于进入该空间的必要性。最简单的理解方法是在纸上画出它,并拿出你的计算器。 - AudioGL
啊!我看了那么多次球面坐标,却没注意到Z是向上的!我太盲目地使用Y了,甚至没有看标签。谢谢!我要去玩了。 - stewsims
是的,我也刚看了那些维基百科的图片,它们也让我很烦。好像Z可以被认为是向上的 :) - AudioGL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接