3D游戏开发所需的数学基础——笛卡尔坐标系

很多人会觉得图形学中的数学复杂难懂。的确,一些数学模型在初学者看来晦涩难懂。但很多情况下,我们需要打交道的只是一些基础的数学运算。

笛卡尔坐标系

在游戏制作中,我们使用数学绝大多数是用于计算位置,距离和角度等信息。而这些计算都是在笛卡尔坐标系下进行的。

1. 二维笛卡尔坐标系

一个二维笛卡尔坐标系包含两部分信息:

  1. 原点(它是整个坐标系的中心)。
  2. 两条过原点的互相垂直的矢量,即X轴和Y轴。也被称为该坐标系的基矢量
    下图显示了一个二维笛卡尔坐标系:
    在这里插入图片描述
    注意: 虽然上图的X轴和Y轴分别是水平指向右和垂直指向上的,这并不是必须的。把上面的坐标系整体进行旋转,指向取反等都是可以的,
    例如:OpenGLDirectX就使用了不同的二维坐标系,如下图所示:
    在这里插入图片描述

2. 三维笛卡尔坐标系

在三维笛卡尔坐标系中,我们需要定义三个坐标轴和一个原点。
这三个坐标轴被称为该坐标系的基矢量
如下图所示:
在这里插入图片描述
通常情况下,但这三个坐标轴之间是相互垂直且长度为1,我们称这样的基矢量为标准正交基(orthonormal basis),但这不是必须的。
有些坐标系中坐标轴之间相互垂直但长度不为1,这样的基矢量被称为正交基(orthogonal basis)。

和二维笛卡尔坐标系类似,三维笛卡尔坐标系中的坐标轴的方向也不是固定的。由此导致了两种不同类型的坐标系:左手坐标系(left-handed coordinate space)和右手坐标系(right-handed coordinate space)。

3. 左手坐标系和右手坐标系

为什么在三维笛卡尔坐标系中要区分左手坐标系和右手坐标系,而二维中就没有呢?

这是因为在二维笛卡尔坐标系中,虽然X轴和Y轴的指向可能不同,但可以通过一些旋转操作来使它们的坐标轴指向相同,由此来看,所有的二维笛卡尔坐标系都是等价的。

但对于三维笛卡尔坐标系,靠这种旋转有时并不能使两个不同朝向的坐标系重合。也就是说,三维笛卡尔坐标系并不都是等价的。因此,就出现了两种不同的三维坐标系:左手坐标系和右手坐标系。

如果两个坐标系具有相同的旋向性(handedness),那么我们就可以通过旋转的方法来让它们的坐标轴指向重合。而左手坐标系和右手坐标系具有不同的旋向性,因此无法通过旋转来重合坐标轴指向。

至于为什么要叫做左手坐标系和右手坐标系?是因为,我们可以利用我们的双手来模拟判断一个坐标轴的旋向性。
可以像下图所示一样,伸出我们的双手来试验一下:
在这里插入图片描述
除了坐标轴的朝向不同之外,左手坐标系和右手坐标系对于正向旋转的定义也不同。

例如,在空间中有一条直线和一个点,要把这个点以该直线为旋转轴旋转30°,我们是应该往哪个方向旋转呢?
在左手坐标系中这个旋转正方向是由左手法则定义的,而在右手坐标系中则是有右手法则定义的(同高中物理学到的左手法则和右手法则)。

可以像下图所示一样,伸出我们的双手来试验一下:
举起对应的左右手,握拳,伸出大拇指让它指向旋转轴的正方向,那么旋转的正方向就是剩下的四个手指弯曲的方向。
在这里插入图片描述
左右手坐标系之间是可以转换的,最简单的方法就是把其中的一个轴反转,并保持其它两个轴不变。

4. 一些软件工具引擎的坐标系

软件工具引擎类型轴向坐标系
Unity3D应用开发Y轴向上左手坐标系
LightWave3D3D动画制作Y轴向上左手坐标系
ZBrush3D建模Y轴向上左手坐标系
CINEMA 4D3D特效Y轴向上左手坐标系
Babylon.js3D应用开发Y轴向上左手坐标系
Unreal Engine3D应用开发Z轴向上左手坐标系
Three.js3D渲染引擎Y轴向上右手坐标系
MAYA3D动画Y轴向上右手坐标系
MODO3D建模Y轴向上右手坐标系
Houdini3D特效Y轴向上右手坐标系
GODOT3D游戏Y轴向上右手坐标系
3DS MAX3D建模Z轴向上右手坐标系
Blender3D建模Z轴向上右手坐标系
AutoCAD3D建模Z轴向上右手坐标系

Three.js使用的是右手坐标系,这是源于OpenGL默认情况下,也是右手坐标系。而WebGL是基于OpenGL的。
Babylon.js默认使用的是左手坐标系。(因为Babylon.js 最初是基于 DirectX 原则设计的,DirectX是左手坐标系)
可以通过代码设置scene.useRightHandedSystem = true;把它改为右手坐标系。
在这里插入图片描述
在这里插入图片描述

下一篇:3D游戏开发所需的数学基础——点和矢量

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神小夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值