我在网上看到,如果我们想直接计算世界来查看矩阵,我们可以使用OpenGl的LookAt功能如果您有摄像机位置,摄像机所在的位置和向上矢量。
然而,这是我的困惑,该功能包括以下内容:
lookAt(const Vector3& vEye, const Vector3& vAt, const Vector3& vUp)
什么是" vAt"矢量,如果我的相机只是用一些任意的z缓冲值来观察正z轴?我知道相机正在观察哪一点,但如果我正在向下看z轴而不是在任何特定点,向量会是什么?
答案 0 :(得分:0)
在我看来,你对轴系统感到困惑。简要说明:
因为您确实需要相机(或眼睛,视情况而定)才能看到世界,所有内容都必须在相机坐标中定义(或者根据您的喜好再次定义View Space)。
通常,世界是在右手轴系统中定义的。这意味着Z轴中的矢量是X轴和Y轴上矢量的叉积:Vz = Vx x Vy
。如果改变顺序(Vz' = Vy x Vx),那么你得到一个左手轴系统,即Vz' = - Vz
视图空间通常也在右手坐标系中定义。将X轴定向到您的右侧,将Y轴定义为朝上,使Z轴朝向您的背部(或在相机后面,如您所愿)增长。这意味着您可以看到的所有内容都在您面前,在您的视图空间坐标系中具有负Z坐标,而不是在世界范围内。
这根本不重要。您需要的只是一个很好的转换矩阵,可以将其考虑在内。
为了建立典型的" lookAt"矩阵,你需要相机的位置(因为一切都必须在那里翻译),一个"目标"定义视图方向(向负Z轴的矢量)和向上定义倾斜的向量,与头部相关的头部角度。使用这些载体的叉积计算矩阵成员。它也可以使用旋转获得,但是交叉产品包括旋转并且它们更便宜。
这种典型的方式" lookAt"构建矩阵需要世界坐标系中定义的三个数据(位置,目标,向上) 。
最后您的问题:您的相机处于(xc,yc,zc)并观察正Z轴上的一个点。这还不够。 Z轴上的任何点都是(0,0,zp)。选择" zp"与" zc"相关:如果您希望相机查看世界正Z轴方向,则需要zp > zc
。它并不重要" zp"是。好吧,除了数字问题。
记住:世界坐标系中的一切。