过去我一直在涉及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矩阵时间?
所以是的,我已经考虑了一段时间了,我只是想知道这些矩阵乘法的矩阵是否完全没必要,至少对某些事情是这样。此外,我意识到缩放增加了一些复杂性,并且还没有完全理解矩阵的概念。
答案 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次乘法(这是非投影矩阵 - 向量乘法的代价)。