这两种计算 LookAt 矩阵的方法有什么区别?

问题描述 投票:0回答:2

我一直在尝试理解给定相机位置、观察点和向上向量的情况下视图矩阵是如何构造的。

我找到了两个教程,这里这里,解释了这一点。然而,它们的不同之处在于构建视图矩阵的方式。在前者中,他们创建平移和旋转,然后将它们相乘以获得视图矩阵。不过,在后者中,他们只是将翻译放在最后一行(列,取决于约定行/列专业)。

所以我的问题是,为什么是这两种方式? LookAt矩阵不是唯一的吗?据我了解,经过大量阅读和思考后,我认为第一篇博客的方法是正确的。我是不是错过了什么?

graphics 3d coordinate-transformation
2个回答
1
投票

(假设行主顺序,因为这是我通常使用的)

这样想:首先,您拥有未变形的世界,相机位于某个位置并进行了一些旋转。你知道,为了从那个世界到达相机位于原点并指向 +z 或 -z 或什么的变换世界,你需要做某种翻译(因为相机不是不在中心)和某种旋转(因为相机可以指向任何方向)。

由于当您旋转的点(相机)位于原点时最容易执行旋转,因此您首先需要平移相机以使其位于原点。矩阵如下所示:

1 0 0 -camera_x
0 1 0 -camera_y
0 0 1 -camera_z
0 0 0     1

执行此旋转后,相机位于中心。现在您可以旋转它,使其指向您想要的方向。旋转可以通过多种方式完成,因此我只给出一个占位符,而不是编写实际的矩阵:

a b c 0
d e f 0
g h i 0
0 0 0 1

现在,我们如何组合这些矩阵来得到我们的视图矩阵?规则是按从右到左的顺序将矩阵全部相乘。所以计算如下:

view = rotation * translation

因为你先平移,然后旋转。

回答你的问题:如果你先旋转,然后平移,如下所示:

view = translation * rotation

那么

view
就等于:

a b c -camera_x
d e f -camera_y
g h i -camera_z
0 0 0     1

这是因为,当您使用纯平移矩阵变换矩阵时,您将得到原始矩阵,其中 xyz 偏移量添加到最后一列的前三个值。这可能就是第二个教程想要做的事情。

然而,矩阵乘法是不可交换的。当以更简单的方式组装视图矩阵时(首先平移,第二旋转),您不能只从旋转矩阵中减去相机位置,因为您正在旋转平移而不是平移旋转,这只是一个更复杂的事情手工做。在这种情况下,您需要将两个矩阵相乘。


0
投票

不同之处在于这两个变换矩阵的使用方式。前者用于将顶点从世界空间映射到相机空间。后者用于将相机放置在世界空间中所需的位置和方向。

© www.soinside.com 2019 - 2024. All rights reserved.