OpenGL摄像机/方向向量

OpenGL摄像机/方向向量,opengl,trigonometry,Opengl,Trigonometry,我一直在试图弄清楚本教程中有两部分代码在做什么: 具体而言: // Direction : Spherical coordinates to Cartesian coordinates conversion glm::vec3 direction( cos(verticalAngle) * sin(horizontalAngle), sin(verticalAngle), cos(verticalAngle) * cos(horizontalAngle) ); 及 我看

我一直在试图弄清楚本教程中有两部分代码在做什么:

具体而言:

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

我看不出第一个是球面->笛卡尔坐标。当我查找它时,我得到:

x = r * sin(theta) * cos(phi)
y = r * sin(theta) * sin(phi)
z = r * cos(theta)
我读过关于欧拉角、轴角和四元数的书,但没有一本能说明这是怎么回事,或者我只是不能理解我在读什么


在第二个问题上,右向量不应该与方向向量的右侧成90度角吗?

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

// Direction : Spherical coordinates to Cartesian coordinates conversion
glm::vec3 direction(
    cos(verticalAngle) * sin(horizontalAngle),
    sin(verticalAngle),
    cos(verticalAngle) * cos(horizontalAngle)
);
这看起来和你查到的公式不同的原因是因为它是相同的想法,但转换成了不同的空间。作者只是希望当垂直角度==0和水平角度==0时,相机透视图是“正前方的”

你自己解决吧

x = cos(0) * sin(0) = 0
y = sin(0)          = 0
z = cos(0) * cos(0) = 1
因此,在这种情况下,相机的“look”向量直接指向z轴,在典型的OpenGL应用程序中,通常认为z轴是直行的(即:Y轴通常是向上和向下的)

尝试计算不同的角度,看看这将如何使相机看起来像矢量旋转

在第二个例子中,作者对公式有一些自由,并以一种仅在第一人称游戏/应用程序中有用的方式对其进行了定义。在一些3D场景中,摄像机可以以不同的方式定向(例如,飞行模拟器)。不管怎样,还是一样的想法。作者只是根据自己的需要调整球坐标


就我个人而言,我更喜欢使用欧拉角度来做相机角度。这是一个稍微多一点的工作设置(你需要做一些矩阵数学),但它是一个不同的方式来解决同一个问题。但在超出典型FPS游戏的情况下,这可能更有用。

您是将这些值传递给
gluLookAt(…)
之类的对象,还是它们构成了矩阵的基础?“方向右侧90度”泛化不起作用的一个原因是,它可能与上方向向量平行,然后会有一个退化的三维空间
gluLookAt(…)
在计算叉积后,实际上会重新正交化基向量,这样输入的上方向向量和前方向向量就不必为90度,就可以生成工作视图矩阵。在结束位置,前方向向量和上方向向量被传递到glm::lookAt(),作者的cos*cos从何而来?我在minecraft中从偏航+俯仰转换为外观向量时也注意到了这一点。我想最好问问你是如何理解作者想要什么,公式从何而来/他们是如何得出的?我会看看是否能想出更好的解释方法,但这主要是一个必要的问题。如果你要使用你发布的原始公式,你必须考虑绕z轴旋转的角度!这需要更多的计算。在minecraft的例子中,将X方向的鼠标移动简单地转换为
水平角度
,将Y方向的鼠标移动转换为
垂直角度
,非常有用。cos*cos来自于进入那个空间的需要。理解它最简单的方法就是把它画在纸上,然后拿出你的计算器!很多次我看着球坐标,我都没有注意到Z向上!因为使用了Y,所以我看都不看标签。谢谢我要去玩了。是的,我只是在看那些维基百科的图片,它们也让我很恼火。好像Z可以被认为是向上的:)
x = cos(0) * sin(0) = 0
y = sin(0)          = 0
z = cos(0) * cos(0) = 1