在我看来,您对轴系统感到困惑。简要说明:
因为你确实需要一个相机(或者你喜欢的眼睛)来观察这个世界,所以所有的东西都必须在相机坐标中定义(或者你喜欢的 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)。选择与“zc”相关的“zp”:如果你想让相机看世界Z轴正方向,那么你需要zp > zc
。“zp”有多大并不重要。好吧,除了数字问题。
记住:世界坐标系中的一切。