【问题标题】:OpenGL LookAt ConfusionOpenGL LookAt 混淆
【发布时间】:2017-03-05 08:04:24
【问题描述】:

我在网上读到,如果我们想直接计算世界以查看矩阵,我们可以使用 OpenGl 的 LookAt 函数如果你有相机位置,相机正在看的位置和一个向上向量。

但是,这是我的困惑,该函数包含以下内容:

lookAt(const Vector3& vEye, const Vector3& vAt, const Vector3& vUp)

如果我的相机只是用一些任意的 z 缓冲区值观察正 z 轴,那么“vAt”向量是什么?我知道它可以告诉你相机正在看哪个点,但是如果我只是顺着 z 轴而不是任何特定点看,那么向量会是什么?

【问题讨论】:

  • 如果您从 z 轴向下看,那么 vEyevAt 将是相同的。唯一的区别是vAt 将在 z 轴上偏移。您可以将vAt 视为与vEye 相关的方向,而不是将其视为一个点。

标签: opengl glulookat


【解决方案1】:

在我看来,您对轴系统感到困惑。简要说明:

因为你确实需要一个相机(或者你喜欢的眼睛)来观察这个世界,所以所有的东西都必须在相机坐标中定义(或者你喜欢的 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”有多大并不重要。好吧,除了数字问题。

记住:世界坐标系中的一切。

【讨论】:

    猜你喜欢
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 2013-07-05
    相关资源
    最近更新 更多