Graphics 什么';这两种计算注视矩阵的方法有什么区别?

Graphics 什么';这两种计算注视矩阵的方法有什么区别?,graphics,3d,coordinate-transformation,Graphics,3d,Coordinate Transformation,我一直在试图理解在给定摄像机位置、观察点和上方向向量的情况下,视图矩阵是如何构造的 我找到了两个教程,这就解释了这一点。但是,它们在构建视图矩阵的方式上有所不同。在前者中,它们创建一个平移和一个旋转,然后将它们相乘得到视图矩阵。但在后一种情况下,他们只是将翻译放在最后一行(列,取决于约定的行/列) 所以我的问题是,为什么这两种方式?注视矩阵不是独一无二的吗?据我所知,在阅读和思考了很多之后,我觉得第一个博客的方式是正确的。我遗漏了什么吗?(假设行的主要顺序,因为这是我通常使用的) 这样想:首先,

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

我找到了两个教程,这就解释了这一点。但是,它们在构建视图矩阵的方式上有所不同。在前者中,它们创建一个平移和一个旋转,然后将它们相乘得到视图矩阵。但在后一种情况下,他们只是将翻译放在最后一行(列,取决于约定的行/列)

所以我的问题是,为什么这两种方式?注视矩阵不是独一无二的吗?据我所知,在阅读和思考了很多之后,我觉得第一个博客的方式是正确的。我遗漏了什么吗?

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

这样想:首先,你有一个未转换的世界,相机在某个位置旋转。你知道,为了从那个世界进入变换后的世界,相机位于原点,指向+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 = rotation * translation
view = translation * rotation
然后
视图
将等于:

a b c -camera_x
d e f -camera_y
g h i -camera_z
0 0 0     1
这是因为,当您使用纯平移矩阵变换矩阵时,您将获得原始矩阵,其中xyz偏移量添加到最后一列中的前三个值。这可能就是第二个教程要做的


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

Ok。虽然我有一些观察,但我明白你们的意思。行主顺序不支持将译文放在最后一行吗?我还读到在第二行中,乘法是从左到右进行的。最后,我理解了两种结果之间的区别,即
view=translation*rotation
view=rotation*translation
。然而,根据我的理解,哪种方法会给我真实生活中的表现,首先平移然后旋转,会给出人们在现实中可以看到的结果。我误解了什么吗?关于乘法顺序:虽然矩阵乘法不是可交换的(你不能转换矩阵的顺序),但它是关联的(如果你有矩阵A、B和C,
A*B*C
=
(A*B)*C
=
A*(B*C)
)。至于您的另一个问题:视图矩阵的目标是,当您使用它变换世界时,结果将始终使摄影机位于相同方向的同一点(原点)。任何达到这种效果的矩阵都会起作用,但正如我所说,在这种情况下,最简单的方法是先平移,然后旋转。