任何人都可以推荐一些很好的起点来理解像我这样数学能力差的傻瓜的转化矩阵。
我愿意学习数学,而且我不是一个完全白痴(我希望),但我发现的例子似乎需要从我所知道的东西到我需要知道的东西的巨大飞跃。
答案 0 :(得分:18)
我写了一个可以用来改变转换矩阵的网络程序。它允许预设类型和自定义类型。
Play with it online或grab the source。
玩数字应该很容易,并立即看到它如何影响房屋绘图。查看在线提供的代码以确定它正在做什么,并且您应该能够了解正在发生的事情。
如果遇到问题,请注意3×3矩阵只是乘以房屋形状中的每个顶点(X& Y坐标)。矩阵乘法与顶点(我们现在将其称为向量)和变换矩阵看起来像这样......
1 0 0 1
0 1 0 * 2
0 0 1 0
左边是identity matrix(一个不影响向量的幂等矩阵)和一个1,2,0的向量(假设这映射到上面提到的程序中的位置X1和Y2,忽略最后的0
)。
Matrix multiplication可以像这样可视化......
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
由于我们说我们的单位矩阵不应该修改这些值,我们可以在上面看到,因为结果向量与原始数据相匹配。
要进一步解释,请考虑何时需要翻译矢量。假设我们想要沿着X轴将房子翻译成5
像素。我们希望从单位矩阵开始,但是将右上角的数字更改为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
。
如果您仍遇到问题,请查看在线视频(例如this one),以便更直观地解释视频。
记住:几乎任何人都可以驾驶汽车,而且几乎任何人都可以学习这一点,尽管任何自我评估对数学的理解都很差。坚持下去:持久性是关键。祝你好运。答案 1 :(得分:8)
就像duffymo指出的那样,矩阵变换仅仅是(预)将矢量(如3d点)乘以矩阵。然而,这是纯粹的数学,很难让一些人想象。
了解转换矩阵的最佳方法(至少对我而言)是获取示例代码,让它运行,然后使用数字即可。尝试查看是否可以将物体放置得更远,或者旋转45度。尝试将转换放在不同的顺序中,看看结果是什么。
全部工作?好。
一旦你有了这种感觉,如果你足够勇敢地解决数学问题,你可以采取以下步骤:
首先,了解矩阵乘法的工作原理。一些链接:
一旦您习惯于手动乘以矩阵,您就会感觉到为什么转换是以这种方式编写的。当你使用它们时,最终会得到对矩阵的理解。
其次,我总是建议您花一个下午尝试实施自己的Matrix
课程,并定义一些常见的操作,例如mul(Vector v)
,transpose()
甚至createTranslationMatrix(float x, float y, float z)
。进行一些测试,看看结果是否与你手工做的相同。
如果你走得那么远,试着实现你自己的Perspective Transformation!这是我们永远不会欣赏的最令人惊奇的事情。这里有一个有用的解释:
一旦你完成了实现矩阵对象的最重要但最不受重视的任务之一,你将为自己感到骄傲。祝你好运!
答案 2 :(得分:6)
转换只不过是一个矩阵乘以一个向量来生成转换后的向量,所以如果你不理解矩阵乘法和加法,你就不会走得太远。
从matricies和线性代数开始。那里有很多书,但是要意识到基于我上面的陈述,你不需要阅读整本书。你不需要特征值或高斯消元或向量空间或其他任何先进和困难的东西。
你只需要知道如何扩展你所知道的关于将数字相乘和添加到基础的数据。
获取转换矩阵中的条目完全是另一回事。你需要一本关于数学和计算机图形学的好书。你不会在线性代数教科书中找到它。