转换所需的矩阵乘法图形矩阵?

时间:2016-10-31 06:58:24

标签: c++ opengl matrix graphics directx

过去我一直在涉及OpenGL和DirectX,而且我注意到所有转换都是通过矩阵和矩阵进行矢量乘法来完成的。我想我们都可以承认,特别是矩阵乘法矩阵并不直观,当我通过矩阵乘法得知矩阵涉及64次乘法和48次加法时,我对自己的理解并不是很好。

无论如何,我知道现代系统上的矩阵和向量乘法是用SIMD或SSE指令完成的,减少了操作(或计算)的次数,但是我看过程序员做的很多计算似乎都没有用。

例如,如果你有一个想要变换的顶点,我们只想说我们要旋转45度然后在本地翻译(5,5,5),我所见的典型方法如下: / p>

1:获取单位矩阵。

2:用旋转矩阵乘以单位矩阵。

3:用翻译矩阵乘以得到的矩阵(顺序很重要)。

4:将得到的矩阵乘以要变换的点/矢量。

如果我想在某个方向上转换对象,而不是将其矩阵乘以

{ 1  0  0  translationX }
{ 0  1  0  translationY }
{ 0  0  1  translationZ }
{ 0  0  0      1        }

...我不能将翻译添加到适当的矩阵索引,即。,matrix [3] [0] + = translationX;

差异是3次加法,而不是64次加法和48次加法。

同样地说,我想要在本地进行翻译,而不是在世界空间中进行翻译,比如说在对象的右边向量中,然后我可以将翻译向量乘以对象的世界的左上角部分或模型矩阵,获取对象的本地右向量?这只是向量的3x3矩阵时间?

所以是的,我已经考虑了一段时间了,我只是想知道这些矩阵乘法的矩阵是否完全没必要,至少对某些事情是这样。此外,我意识到缩放增加了一些复杂性,并且还没有完全理解矩阵的概念。

2 个答案:

答案 0 :(得分:3)

  

认为我们都可以承认特别是矩阵乘法矩阵不直观

我完全不同意。首先,当考虑线性变换时,将矩阵视为“2D数组数组”是没有意义的。考虑矩阵的正确方法是以非常一般的方式作为运算符

  

无论如何,我知道现代系统上的矩阵和向量乘法是用SIMD或SSE指令完成的,减少了操作(或计算)的次数,但是我看过程序员做的很多计算似乎都没有用。

矩阵乘法的规则及其必要性完全由线性代数规则决定。你从某些基本规则开始,如何将矢量从一个空间转换到另一个空间的行为,并从那里开始矩阵乘法规则的上升。

重要的是,当链接一系列变换时,最终结果可以合并为一个单个矩阵。这就是这些东西的美丽。无论您的转换设置多么复杂和复杂,一个矩阵就能完成这项工作。 Matrices为您提供预先计算的机会!

  

...我不能只将翻译添加到适当的矩阵索引,即。,matrix [3] [0] + = translationX;

不一般。仅当左上部分是身份转换时。在该部分是非身份的那一刻,翻译也会被修改。

我建议你每手写出结果

M = rot((0,0,1), 90°) · translate(1, 2, 3)

提示

                    |  0 -1  0  0 |
rot((0,0,1), 90°) = |  1  0  0  0 |
                    |  0  0  1  0 |
                    |  0  0  0  1 |
  

所以是的,我一直在考虑这个问题,我只是想知道这些矩阵乘法矩阵是否完全没必要,至少在某些方面是这样。

有趣的是,一旦你达到一定程度的转换水平,矩阵很快就会胜过链接单个基本向量运算。

但事情就是这样:不要将矩阵看作二维数组。这只是一种记下线性变换的方法。

答案 1 :(得分:0)

  • 这是一个不成熟的优化。小矩阵乘法(即2d或3d图形)在大多数情况下足够便宜,我们不去考虑它。

  • 不,矩阵不是表示转换的唯一方法。另一个非常好的表现形式,不太受欢迎,是用于旋转的四元数+用于翻译的矢量。它不包括3x4(或4x4)矩阵可能的一些变换,但它们更紧凑,数值更稳定,更易于插值,有时更便宜。我很惊讶您将矩阵称为“不直观的”,但如果是这样,四元数可能更难以掌握。

  • 这些转换表示(矩阵或四元数)的关键是它们可以组成。 IRL会发生什么,你将一些变换计算为多个变换的组合,然后将其应用于模型的每个顶点。考虑一个飞行直升机的观察者看着带有旋转炮塔的坦克的情况。要渲染炮塔,您必须应用至少三次旋转和平移,以将顶点从炮塔的模型空间转换为观察者坐标。通过单独应用每个转换来实现它是非常昂贵的,相比之下,将整个链预先计算为一个矩阵,然后将 应用于每个顶点,只需每个顶点9次加法和9次乘法(这是非投影矩阵 - 向量乘法的代价)。