很多人会觉得图形学中的数学复杂难懂。的确,一些数学模型在初学者看来晦涩难懂。但很多情况下,我们需要打交道的只是一些基础的数学运算。
笛卡尔坐标系
在游戏制作中,我们使用数学绝大多数是用于计算位置,距离和角度等信息。而这些计算都是在笛卡尔坐标系下进行的。
1. 二维笛卡尔坐标系
一个二维笛卡尔坐标系包含两部分信息:
- 原点(它是整个坐标系的中心)。
- 两条过原点的互相垂直的矢量,即X轴和Y轴。也被称为该坐标系的基矢量。
下图显示了一个二维笛卡尔坐标系:
注意: 虽然上图的X轴和Y轴分别是水平指向右和垂直指向上的,这并不是必须的。把上面的坐标系整体进行旋转,指向取反等都是可以的,
例如:OpenGL和DirectX就使用了不同的二维坐标系,如下图所示:
2. 三维笛卡尔坐标系
在三维笛卡尔坐标系中,我们需要定义三个坐标轴和一个原点。
这三个坐标轴被称为该坐标系的基矢量。
如下图所示:
通常情况下,但这三个坐标轴之间是相互垂直且长度为1,我们称这样的基矢量为标准正交基(orthonormal basis),但这不是必须的。
有些坐标系中坐标轴之间相互垂直但长度不为1,这样的基矢量被称为正交基(orthogonal basis)。
和二维笛卡尔坐标系类似,三维笛卡尔坐标系中的坐标轴的方向也不是固定的。由此导致了两种不同类型的坐标系:左手坐标系(left-handed coordinate space)和右手坐标系(right-handed coordinate space)。
3. 左手坐标系和右手坐标系
为什么在三维笛卡尔坐标系中要区分左手坐标系和右手坐标系,而二维中就没有呢?
这是因为在二维笛卡尔坐标系中,虽然X轴和Y轴的指向可能不同,但可以通过一些旋转操作来使它们的坐标轴指向相同,由此来看,所有的二维笛卡尔坐标系都是等价的。
但对于三维笛卡尔坐标系,靠这种旋转有时并不能使两个不同朝向的坐标系重合。也就是说,三维笛卡尔坐标系并不都是等价的。因此,就出现了两种不同的三维坐标系:左手坐标系和右手坐标系。
如果两个坐标系具有相同的旋向性(handedness),那么我们就可以通过旋转的方法来让它们的坐标轴指向重合。而左手坐标系和右手坐标系具有不同的旋向性,因此无法通过旋转来重合坐标轴指向。
至于为什么要叫做左手坐标系和右手坐标系?是因为,我们可以利用我们的双手来模拟判断一个坐标轴的旋向性。
可以像下图所示一样,伸出我们的双手来试验一下:
除了坐标轴的朝向不同之外,左手坐标系和右手坐标系对于正向旋转的定义也不同。
例如,在空间中有一条直线和一个点,要把这个点以该直线为旋转轴旋转30°,我们是应该往哪个方向旋转呢?
在左手坐标系中这个旋转正方向是由左手法则定义的,而在右手坐标系中则是有右手法则定义的(同高中物理学到的左手法则和右手法则)。
可以像下图所示一样,伸出我们的双手来试验一下:
举起对应的左右手,握拳,伸出大拇指让它指向旋转轴的正方向,那么旋转的正方向就是剩下的四个手指弯曲的方向。
左右手坐标系之间是可以转换的,最简单的方法就是把其中的一个轴反转,并保持其它两个轴不变。
4. 一些软件工具引擎的坐标系
软件工具引擎 | 类型 | 轴向 | 坐标系 |
---|---|---|---|
Unity | 3D应用开发 | Y轴向上 | 左手坐标系 |
LightWave3D | 3D动画制作 | Y轴向上 | 左手坐标系 |
ZBrush | 3D建模 | Y轴向上 | 左手坐标系 |
CINEMA 4D | 3D特效 | Y轴向上 | 左手坐标系 |
Babylon.js | 3D应用开发 | Y轴向上 | 左手坐标系 |
Unreal Engine | 3D应用开发 | Z轴向上 | 左手坐标系 |
Three.js | 3D渲染引擎 | Y轴向上 | 右手坐标系 |
MAYA | 3D动画 | Y轴向上 | 右手坐标系 |
MODO | 3D建模 | Y轴向上 | 右手坐标系 |
Houdini | 3D特效 | Y轴向上 | 右手坐标系 |
GODOT | 3D游戏 | Y轴向上 | 右手坐标系 |
3DS MAX | 3D建模 | Z轴向上 | 右手坐标系 |
Blender | 3D建模 | Z轴向上 | 右手坐标系 |
AutoCAD | 3D建模 | Z轴向上 | 右手坐标系 |
Three.js使用的是右手坐标系,这是源于OpenGL默认情况下,也是右手坐标系。而WebGL是基于OpenGL的。
Babylon.js默认使用的是左手坐标系。(因为Babylon.js 最初是基于 DirectX 原则设计的,DirectX是左手坐标系)
可以通过代码设置scene.useRightHandedSystem = true;
把它改为右手坐标系。