OpenGL LookAt 混淆
OpenGL LookAt Confusion
我在网上看到,如果我们想直接计算世界到视图矩阵,我们可以使用 OpenGl 的 LookAt 函数如果你有相机位置,相机正在注视的位置和一个向上矢量。
然而,这是我的困惑,该函数接受以下内容:
lookAt(const Vector3& vEye, const Vector3& vAt, const Vector3& vUp)
如果我的相机只是简单地观察具有任意 z 缓冲区值的正 z 轴,"vAt" 向量会是什么?我知道它告诉你相机正在看哪个点,但如果我只是沿着 z 轴看,而不是在任何特定点,向量会是什么?
在我看来,您对轴系统感到困惑。简要说明:
因为您确实需要相机(或您喜欢的眼睛)来观察世界,所以一切都必须在相机坐标中定义(或视图 Space,同样是您喜欢的)。
通常,世界是在右手轴系中定义的。这意味着 Z 轴上的向量是 X 轴和 Y 轴上向量的 叉积:Vz = Vx x Vy
。如果更改顺序 (Vz' = Vy x Vx),则会得到左手轴系,即 Vz' = - Vz
视图 Space 通常也是在右手坐标系中定义的。将 X 轴定义为向右,将 Y 轴定义为向上,使 Z 轴向您的背部(或您喜欢的相机后面)增长。这意味着你能看到的一切都在你的面前,在你的视野space坐标系中有负Z坐标,而不是在世界坐标系中。
完全没关系。您所需要的只是一个考虑到这一点的良好变换矩阵。
为了构建典型的 "lookAt" 矩阵,您需要相机的位置(因为所有东西都必须在那里平移),一个 "target" 来定义观察方向(一个向量朝向负 Z 轴)和一个向上矢量来定义倾斜度,即头部与肩膀的角度。使用这些向量的叉积计算矩阵成员。也可以使用旋转获得,但叉积包括旋转并且它们更便宜。
这个典型的 "lookAt" 矩阵的构建方式需要这三个数据(位置、目标、向上)在世界坐标系中定义。
最后是您的问题:您的相机位于 (xc,yc,zc) 并注视 Z 轴正方向上的一个点。这还不够。 Z 轴上的任何点都是 (0,0,zp)。选择"zp"相关"zc":如果你想让相机看世界正Z轴方向,那么你需要zp > zc
。 "zp" 有多大并不重要。好吧,除了数字问题。
记住:世界坐标系中的一切。
我在网上看到,如果我们想直接计算世界到视图矩阵,我们可以使用 OpenGl 的 LookAt 函数如果你有相机位置,相机正在注视的位置和一个向上矢量。
然而,这是我的困惑,该函数接受以下内容:
lookAt(const Vector3& vEye, const Vector3& vAt, const Vector3& vUp)
如果我的相机只是简单地观察具有任意 z 缓冲区值的正 z 轴,"vAt" 向量会是什么?我知道它告诉你相机正在看哪个点,但如果我只是沿着 z 轴看,而不是在任何特定点,向量会是什么?
在我看来,您对轴系统感到困惑。简要说明:
因为您确实需要相机(或您喜欢的眼睛)来观察世界,所以一切都必须在相机坐标中定义(或视图 Space,同样是您喜欢的)。
通常,世界是在右手轴系中定义的。这意味着 Z 轴上的向量是 X 轴和 Y 轴上向量的 叉积:Vz = Vx x Vy
。如果更改顺序 (Vz' = Vy x Vx),则会得到左手轴系,即 Vz' = - Vz
视图 Space 通常也是在右手坐标系中定义的。将 X 轴定义为向右,将 Y 轴定义为向上,使 Z 轴向您的背部(或您喜欢的相机后面)增长。这意味着你能看到的一切都在你的面前,在你的视野space坐标系中有负Z坐标,而不是在世界坐标系中。
完全没关系。您所需要的只是一个考虑到这一点的良好变换矩阵。
为了构建典型的 "lookAt" 矩阵,您需要相机的位置(因为所有东西都必须在那里平移),一个 "target" 来定义观察方向(一个向量朝向负 Z 轴)和一个向上矢量来定义倾斜度,即头部与肩膀的角度。使用这些向量的叉积计算矩阵成员。也可以使用旋转获得,但叉积包括旋转并且它们更便宜。
这个典型的 "lookAt" 矩阵的构建方式需要这三个数据(位置、目标、向上)在世界坐标系中定义。
最后是您的问题:您的相机位于 (xc,yc,zc) 并注视 Z 轴正方向上的一个点。这还不够。 Z 轴上的任何点都是 (0,0,zp)。选择"zp"相关"zc":如果你想让相机看世界正Z轴方向,那么你需要zp > zc
。 "zp" 有多大并不重要。好吧,除了数字问题。
记住:世界坐标系中的一切。