英文原文地址:Docs » Math » Matrices and transforms
转载请注明出处
矩阵于变换
导论
在阅读本教程之前,建议你阅读先前关于向量数学的介绍,因为本部分是其后续内容。
本教程的主题是变换(transformation),也会覆盖一些矩阵的知识(但不会太深入)。
变换多数情况下指的就是:位移(translation),旋转(rotation),缩放(scale),所以它们会被优先讨论。
定向坐标系(Oriented coordinate system ,OCS)
试想一下,空间中某处有个太空飞船。在Godot中很容易实现,把飞船移动到某处然后旋转它:
OK,在2D中看起来很简单,一个位置和一个旋转角度。但是记住,我们是成年人了,不要用角度(而且,在3D中角也不是那么的好使)。
我们应该知道,是有人设计了这个飞船。2D的话也许是用Paint.net,Gimp,Photoshop等等,如果是3D的话也许是Blender,Max,Maya等等。
当它被设计出来的时候,它并没有被旋转。而是在自己的坐标系中被设计出来。
这意味着飞船的顶部有一个坐标,尾翼有另一个坐标,等等。无论其在2D还是3D中。
所以我们再来一次,空间中某处有个飞船:
那么,它是怎么到那的呢?是什么把它从初始位置移动并旋转到当前位置的?答案是…变换(transform),飞船是从初始位置被变换到新位置的。这使得飞船被显示在它的位置。
但是变换对于这个过程是一个过于泛泛的描述了。为了能够解开这个迷,我们得把它的原始设计位置添加到当前位置:
然后,我们可以看到“设计空间”也被变换了。如何更好地表现这个变换?让我们使用3个向量(在2D中),一个指向X轴正方向的单位向量,一个指向Y轴正方向的单位向量和一个位移向量(translation)。
让我们管这3个向量分别叫"X","Y"和“Origin”,让我们把它们添加到飞船上,这样就更有意义了:
OK,现在好多了,但是还是没有意义。“X”,"Y"和“Origin”和飞船怎么到那的有什么关系?
好吧,我们以飞船顶部的点作为参考:
我们对它应用如下运算(对于飞船上的所有点都是一样的,只不过我们用顶部点作为参考):
var new_pos = pos - origin
这样我们就可以把选中的点移回到中心:
结果不出所料,接下来咱们做点更有趣的。使用X和该点的点乘加上Y和该点的点乘:
var final_pos = Vector2(x.dot(new_pos), y.dot(new_pos))
于是我们得到了…等会儿,这是飞船的设计位置!
这到底是什么黑魔法?这个飞船迷失在太空里,现在回家了!
看起来很奇怪,但是是有道理的。记住们正如我们在向量数学里看到的,实际发生的是这样的,计算出到X轴和Y轴的距离。计算到某一方向或平面的距离是点乘的用法之一。这就足以获得飞船每个点的原始坐标了。
所以,我们一直用的(X,Y,Origin)是定向坐标系,其中X和Y是基(basis),Origin是偏移量(offset)。