游戏中的数学:矩阵与变换(一)

英文原文地址:Docs » Math » Matrices and transforms

转载请注明出处

矩阵于变换

导论

在阅读本教程之前,建议你阅读先前关于向量数学的介绍,因为本部分是其后续内容。

本教程的主题是变换(transformation),也会覆盖一些矩阵的知识(但不会太深入)。

变换多数情况下指的就是:位移(translation),旋转(rotation),缩放(scale),所以它们会被优先讨论。

定向坐标系(Oriented coordinate system ,OCS)

试想一下,空间中某处有个太空飞船。在Godot中很容易实现,把飞船移动到某处然后旋转它:

image

OK,在2D中看起来很简单,一个位置和一个旋转角度。但是记住,我们是成年人了,不要用角度(而且,在3D中角也不是那么的好使)。

我们应该知道,是有人设计了这个飞船。2D的话也许是用Paint.net,Gimp,Photoshop等等,如果是3D的话也许是Blender,Max,Maya等等。

当它被设计出来的时候,它并没有被旋转。而是在自己的坐标系中被设计出来。

image

扫描二维码关注公众号,回复: 11654620 查看本文章

这意味着飞船的顶部有一个坐标,尾翼有另一个坐标,等等。无论其在2D还是3D中。

所以我们再来一次,空间中某处有个飞船:

image

那么,它是怎么到那的呢?是什么把它从初始位置移动并旋转到当前位置的?答案是…变换(transform),飞船是从初始位置被变换到新位置的。这使得飞船被显示在它的位置。

但是变换对于这个过程是一个过于泛泛的描述了。为了能够解开这个迷,我们得把它的原始设计位置添加到当前位置:

image

然后,我们可以看到“设计空间”也被变换了。如何更好地表现这个变换?让我们使用3个向量(在2D中),一个指向X轴正方向的单位向量,一个指向Y轴正方向的单位向量和一个位移向量(translation)。

image

让我们管这3个向量分别叫"X","Y"和“Origin”,让我们把它们添加到飞船上,这样就更有意义了:

image

OK,现在好多了,但是还是没有意义。“X”,"Y"和“Origin”和飞船怎么到那的有什么关系?

好吧,我们以飞船顶部的点作为参考:

image

我们对它应用如下运算(对于飞船上的所有点都是一样的,只不过我们用顶部点作为参考):

var new_pos = pos - origin

这样我们就可以把选中的点移回到中心:

image

结果不出所料,接下来咱们做点更有趣的。使用X和该点的点乘加上Y和该点的点乘:

var final_pos = Vector2(x.dot(new_pos), y.dot(new_pos))

于是我们得到了…等会儿,这是飞船的设计位置!

image

这到底是什么黑魔法?这个飞船迷失在太空里,现在回家了!

看起来很奇怪,但是是有道理的。记住们正如我们在向量数学里看到的,实际发生的是这样的,计算出到X轴和Y轴的距离。计算到某一方向或平面的距离是点乘的用法之一。这就足以获得飞船每个点的原始坐标了。

所以,我们一直用的(X,Y,Origin)是定向坐标系,其中X和Y是基(basis),Origin是偏移量(offset)

猜你喜欢

转载自blog.csdn.net/hello_tute/article/details/107887725