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

笛卡尔坐标系

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

1. 二维笛卡尔坐标系

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

  1. 原点(它是整个坐标系的中心)。
  2. 两条过原点的互相垂直的矢量,即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;把它改为右手坐标系。

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

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

  1. 3D游戏开发所需的数学基础——点和矢量

    一:点(point) 点是N维空间(游戏中主要是二维和三维空间)中的一个位置,它没有大小,宽度这类概念. 在笛卡尔坐标系中,我们可以这样表示一个点. 二维空间中的点如:P=(PxP_{x}Px​, P ...

  2. 3D游戏开发所需的数学基础——矩阵

    一: 矩阵(matrix)的定义 矩阵的一般表达式,如3X3的矩阵: M = [m11m12m13m21m22m23m31m32m33]\left[ \begin{matrix} m_{11} &am ...

  3. 《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——2.4节文件I/O

    本节书摘来自异步社区<Android 3D游戏开发技术宝典--OpenGL ES 2.0>一书中的第2章,第2.4节文件I/O,作者 吴亚峰,更多章节内容可以访问云栖社区"异步社 ...

  4. 雨松MOMO《Unity 3D游戏开发》源码公布

    原创文章如需转载请注明:转载自雨松MOMO程序研究院 本文链接地址:雨松MOMO<Unity 3D游戏开发>源码公布 下载源码时,首先大家请登陆图灵社区找到<Unity 3D游戏开发 ...

  5. 介绍一下3D游戏开发的简单常识,以及最终幻想13游戏流程为什么会过于线性的原因。

    介绍一下3D游戏开发的简单常识,以及最终幻想13游戏流程为什么会过于线性的原因. (1) 回复 1楼 2012-01-25 14:10 举报 | keyblade2 坐等B青现身给LZ答疑解惑 回复 ...

  6. 【Unity 3D游戏开发】在Unity使用NoSQL数据库方法介绍

    随着游戏体积和功能的不断叠加,游戏中的数据也变得越来越庞杂,这其中既包括玩家产生的游戏存档等数据,例如关卡数.金币等,也包括游戏配置数据,例如每一关的配置情况.尽管Unity提供了PlayerPref ...

  7. Unity3D ——强大的跨平台3D游戏开发工具教程

    http://unity3d.9ria.com/?p=22 众所周知,Unity3D是一个能够实现轻松创作的多平台的游戏开发工具,是一个全面整合的专业游戏引擎.在现有的版本中,其强大的游戏制作功能已经 ...

  8. 《Unity 3D 游戏开发技术详解与典型案例》——1.1节Unity 3D基础知识概览

    本节书摘来自异步社区<Unity 3D 游戏开发技术详解与典型案例>一书中的第1章,第1.1节Unity 3D基础知识概览,作者 吴亚峰 , 于复兴,更多章节内容可以访问云栖社区" ...

  9. Android+3D游戏开发技术详解与典型案例

    内容导读 本书共分两篇,第一篇介绍了Android 3D游戏开发的基础知识,主要对OpenGL ES的相关内容进行了介绍. 章 名主 要 内 容 第1章 英雄还看今朝-Android简介本章介绍了市场 ...

最新文章

  1. php中$_REQUEST、$_POST、$_GET的区别和联系小结
  2. spark-scheduled调度算法
  3. linux shell 显示路径
  4. 现代谱估计:多窗口谱
  5. iOS开发点击UIButton实现UIView的旋转
  6. 如果linux目录中没有srv,了解linux系统目录,proc,root,sbin,selinux,srv!
  7. golang 接口类型 interface 简介使用
  8. PyQT项目优化---添加多线程数控制
  9. MAMP Pro for Mac(PHP/MySQL开发环境)v6.6
  10. pyinstaller编译出的exe被杀毒软件认为是木马
  11. 语文数学英语计算机文理科,高考文理科英语试卷一样吗
  12. 硬核!深信服春招3面,终获20k入职offer!
  13. UWP 学习笔记 二
  14. 马克飞象markdown用法
  15. 贪吃蛇小游戏编写心得
  16. 上海创蓝253董事长_从世界记忆大师到互联网百强企业CEO:创蓝253钛牛哥的传奇之路...
  17. 【技能树共建】Python 列表推导式
  18. linux配置和查看主机名
  19. JSF pickList
  20. Mac 的brew 换源

热门文章

  1. matlab伯德图稳定性,11系统的稳定性Bode稳定判据介绍.ppt
  2. 关于在Android中使用CMake你所需要了解的一切(三)
  3. AMEYA360报道:干式电容器与油式电容器有什么区别
  4. 字节跳动架构师讲解Java开发!美的java开发面试
  5. 学习日记08 08——超级数组
  6. cetus权限连接主从mysql_cetus/cetus-rw.md at master · niumanniu/cetus · GitHub
  7. bool型判断年份是否为闰年
  8. uploadify ie9 empty() 缺少对象
  9. JavaScript中innerText,innerHTML,outerText,outerHTML使用心得和区别
  10. 必备:音乐的魅力,一边听歌一边练习英语!