Unity Shader入门:数学基础之坐标系
发表于2018-05-02
在场景中如何确定位置,基本时通过当前坐标来知悉,下面就来看看学习坐标系要了解的一些内容。
在游戏制作中,我们使用数学大部分是为了计算位置、距离和角度等变量。这些计算大部分实在笛卡尔坐标系下进行的。
二维笛卡尔坐标系
二维笛卡尔坐标其实在我们的生活中经常看到,比如:国际象棋的棋盘就可以理解成一个二维笛卡尔坐标洗。
二维笛卡尔坐标系包括了下面几种元素:
- 原点 — 一个特殊的位置,是整个坐标系的中心。
- 两条过原点且互相垂直的矢量 — 即x和y轴。这两个坐标轴也被称为该坐标系的基矢量。
二维笛卡尔坐标系如下图所示:

ps:这里要说明一点,虽然上图看上去x轴指向右,y轴指向左。但是这不是必须的。在屏幕映射中,OpenGL和DirextX就是用了不同的二维笛卡尔坐标系。如下图:

有了二维笛卡尔坐标系我们就能很精确的知道一个点的位置。现在利用二维笛卡尔坐标系就能够描述妞妞在农场中的位置了。如下图:

三维笛卡尔坐标系
上面的二维坐标系看上去比较简单,是在一个平面上的。三维坐标系比二维坐标系多了一个维度。相应的,三维坐标系要比二维坐标系复杂了许多。
和二维坐标系相同,三维坐标系也包含了两个元素:
- 原点
- 三条过原点且相互垂直的矢量 — 即x、y、z轴。
ps:若三条矢量(基矢量)的长度为1,那么我们称它为标准正交基,若长度不为1称它为正交基。
ps:正交可以把它理解为互相垂直的意思。
左手和右手坐标系
和二维笛卡尔坐标系相同,三维笛卡尔坐标系的坐标轴的方向可以是不固定的。
和二维笛卡尔坐标系不同的是,因为坐标轴的方向不同导致了三维笛卡尔坐标系有左手坐标系和右手坐标系之分。
疑问:为什么二维坐标系中没有左右手坐标系之分,而三维的有呢?
因为:在二维坐标系中,即便两个二维坐标系的x、y轴方向各不相同,但是它们都能通过绕某个轴旋转从而和另一个坐标系重合。所以所有的二维笛卡尔坐标系都是等价的!
而在三维坐标系中,有时候靠旋转操作是不能使两个坐标系重合的。因此三维笛卡尔坐标系并不都是等价的。从而出现了左手坐标系和右手坐标系。
疑问:为什么叫做左手坐标系和右手坐标系呢?
利用我们的左右手,就能够表示三维笛卡尔坐标系是左手坐标系还是右手坐标系。如下图:

可以看到上图中,左右手坐标系的x轴的方向不同。并且可以尝试一下,无论你怎么旋转自己的左右手,都不能让他们完全重合。
疑问:左右手坐标系是不是真的不能互相转换呢?
其实是可以的,只需要将其中一个轴反转,另外两个轴保持不变即可。
疑问:那么我们到底该使用左手坐标系还是右手坐标系?
答案是:都可以!左右手坐标系本身没有优劣之分,无论哪种坐标系,在大多数的情况下是不会影响底层的数学计算的,只是在映射到视觉上时会有差别。
Unity使用的坐标系
这里说的坐标系呢仅针对三维空间下的坐标系。
对于Unity使用左手坐标系还是右手坐标系,我们来看看引擎便知:

可以看出,在场景中模型空间下,Unity使用的是左手坐标系。

可以看出,对于观察空间来说,Unity使用的是右手坐标系。在观察空间下,z值越小,说明场景深度增加。
总结:
在Unity中,左右手坐标系都得到了使用。在模型空间下,使用的是左手坐标系。在观察空间下,使用的是右手坐标系。
来自:https://blog.csdn.net/xxwlzfb/article/details/52621995