我一直试图了解如何根据相机的位置,要查看的点和向上矢量来构造视图矩阵。
我找到了两个教程,here和here,可以解释这一点。但是,它们在视图矩阵的构建方式上有所不同。在前者中,它们创建平移和旋转,然后将它们相乘以获得视图矩阵。但是,在后者中,他们只是将翻译放在最后一行(列,取决于约定行/ col-major)。
所以我的问题是,为什么这两种方式?看起来矩阵是不是唯一的?根据我的理解,在阅读和思考之后,在我看来,第一个博客有正确的方法。我错过了什么吗?
答案 0 :(得分:1)
(假设是行主要订单,因为那是我通常使用的)
以这种方式思考:首先,你拥有未经过改造的世界,相机在某个位置有一些旋转。你知道,为了从那个世界到达变形的世界,在那里相机处于起源并指向+ z或-z或者你有什么,你需要做一些翻译(因为相机不是#39; t在中心)和某种旋转(因为相机可能指向任何方向)。
由于当您旋转的点(相机)位于原点时执行旋转最简单,因此您首先要翻译相机,使其位于起源。这是矩阵的样子:
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偏移量被添加到最后一列中的前三个值。这可能是第二篇教程试图做的事情。
但是,矩阵乘法不可交换。在组装视图矩阵时,更简单的方法(先平移,再旋转第二个),您不能从旋转矩阵中减去相机位置,因为您正在旋转平移而不是平移旋转,这只是手工做的事情比较复杂。在这种情况下,您需要将两个矩阵相乘。