任何人都可以为像我这样数学能力差的傻瓜推荐一些好的起点来理解转换矩阵。
我愿意学习数学,而且我不是一个完全的白痴(我希望如此),但我发现的例子似乎需要从我所知道的到我需要知道的巨大飞跃。
任何人都可以为像我这样数学能力差的傻瓜推荐一些好的起点来理解转换矩阵。
我愿意学习数学,而且我不是一个完全的白痴(我希望如此),但我发现的例子似乎需要从我所知道的到我需要知道的巨大飞跃。
我编写了一个 Web 程序,可以用来玩转变换矩阵。它允许预设类型和自定义类型。
玩数字应该很容易,并立即看到它如何影响房屋绘图。查看在线可用的代码以确定它在做什么,您应该能够理解发生了什么。
如果您遇到问题,请意识到 3×3 矩阵只是简单地乘以房屋形状中的每个顶点(X 和 Y 坐标)。与顶点的矩阵乘法(我们现在将其称为向量)和变换矩阵看起来像这样......
1 0 0 1
0 1 0 * 2
0 0 1 0
左边是一个单位矩阵(一个不影响向量的幂等矩阵)和一个 1、2、0 的向量(假设它映射到上面提到的程序中的位置 X1 和 Y2 并忽略 final 0
)。
矩阵乘法可以像这样可视化......
a b c x a * x + b * y + c * z
d e f + y = d * x + e * y + f * z
g h i z g * x + h * y + i * z
所以,在我们的例子中,这将是......
1 0 0 1 1 * 1 + 0 * 2 + 0 * 0
0 1 0 * 2 = 0 * 1 + 1 * 2 + 0 * 0
0 0 1 0 0 * 1 + 0 * 2 + 1 * 0
做那个数学,我们得到最终的向量......
1
2
0
由于我们说我们的单位矩阵不应该修改值,我们可以在上面看到结果向量与原始向量匹配的情况。
为了进一步解释,请考虑何时需要平移向量。假设我们想将房子5
沿 X 轴平移像素。我们想从单位矩阵开始,但是将右上角的数字更改为5
并在向量中添加额外的维度1
(您将简要了解原因)。
1 0 5 1 1 * 1 + 0 * 2 + 5 * 1
0 1 0 * 2 = 0 * 1 + 1 * 2 + 0 * 1
0 0 1 1 0 * 1 + 0 * 2 + 1 * 1
我们再做一次数学...
6
2
1
我们可以看到第一个数字(我们坐标中的 X)已沿 X 轴平移了5
. 在上面链接的程序中尝试。
我们制作第三个值的原因1
是在执行数学运算时考虑了翻译。如果是,它将被忽略,0
因为任何数字乘以0
。0
如果您仍然遇到问题,请查看在线视频(例如,此视频),它可以帮助您以更直观的方式进行解释。
请记住:几乎任何人都可以驾驶汽车,而且几乎任何人都可以学习这一点,尽管任何人自我评估对数学的理解很差。坚持下去:坚持是关键。祝你好运。
就像 duffymo 指出的那样,矩阵变换只不过是(预)将向量(如 3d 点)乘以矩阵。然而,那是纯粹的数学,有些人很难想象。
理解转换矩阵的最好方法(至少对我来说)是获取一个示例代码,让它运行,然后玩弄数字。试试看你能不能把一个物体放在更远的地方,或者旋转 45 度。尝试以不同的顺序进行转换,看看结果如何。
都工作了吗?好的。
一旦你感受到了这一点,并且如果你有足够的勇气来解决数学问题,你可以采取以下步骤:
首先,了解矩阵乘法的工作原理。一些链接:
一旦您对手动乘以矩阵感到满意,您就会了解为什么要以这种方式编写转换。当你使用它们时,你最终会理解矩阵。
其次,我总是建议花一个下午的时间来尝试实现自己的Matrix
类并定义一些常见的操作,比如mul(Vector v)
,transpose()
甚至createTranslationMatrix(float x, float y, float z)
. 进行一些测试,看看结果是否与您手动执行的相同。
如果您已经走到了这一步,请尝试实施您自己的透视转换!这是我们从未欣赏过的最令人惊奇的事情。这里有一个有用的解释:
一旦您完成了实现矩阵对象的最费力但被低估的任务之一,您将为自己感到非常自豪。祝你好运!
变换只不过是一个矩阵乘以一个向量来产生变换后的向量,所以如果你不了解矩阵乘法和加法,你就走不了多远。
从矩阵和线性代数开始。那里有很多书,但要意识到,根据我上面的陈述,您不需要阅读整本书。您不需要特征值或高斯消除或向量空间或任何其他高级且困难的东西。
你只需要知道如何扩展你对矩阵乘法和加法的了解。
获取该转换矩阵中的条目完全是另一回事。你需要一本关于数学和计算机图形学的好书。你不会在线性代数教科书中找到它。