3D游戏开发所需的数学基础——笛卡尔坐标系
很多人会觉得图形学中的数学复杂难懂。的确,一些数学模型在初学者看来晦涩难懂。但很多情况下,我们需要打交道的只是一些基础的数学运算。
笛卡尔坐标系
在游戏制作中,我们使用数学绝大多数是用于计算位置,距离和角度等信息。而这些计算都是在笛卡尔坐标系下进行的。
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;
把它改为右手坐标系。
下一篇:3D游戏开发所需的数学基础——点和矢量
3D游戏开发所需的数学基础——笛卡尔坐标系相关推荐
- 3D游戏开发所需的数学基础——点和矢量
一:点(point) 点是N维空间(游戏中主要是二维和三维空间)中的一个位置,它没有大小,宽度这类概念. 在笛卡尔坐标系中,我们可以这样表示一个点. 二维空间中的点如:P=(PxP_{x}Px, P ...
- 3D游戏开发所需的数学基础——矩阵
一: 矩阵(matrix)的定义 矩阵的一般表达式,如3X3的矩阵: M = [m11m12m13m21m22m23m31m32m33]\left[ \begin{matrix} m_{11} &am ...
- 《Android 3D游戏开发技术宝典——OpenGL ES 2.0》——2.4节文件I/O
本节书摘来自异步社区<Android 3D游戏开发技术宝典--OpenGL ES 2.0>一书中的第2章,第2.4节文件I/O,作者 吴亚峰,更多章节内容可以访问云栖社区"异步社 ...
- 雨松MOMO《Unity 3D游戏开发》源码公布
原创文章如需转载请注明:转载自雨松MOMO程序研究院 本文链接地址:雨松MOMO<Unity 3D游戏开发>源码公布 下载源码时,首先大家请登陆图灵社区找到<Unity 3D游戏开发 ...
- 介绍一下3D游戏开发的简单常识,以及最终幻想13游戏流程为什么会过于线性的原因。
介绍一下3D游戏开发的简单常识,以及最终幻想13游戏流程为什么会过于线性的原因. (1) 回复 1楼 2012-01-25 14:10 举报 | keyblade2 坐等B青现身给LZ答疑解惑 回复 ...
- 【Unity 3D游戏开发】在Unity使用NoSQL数据库方法介绍
随着游戏体积和功能的不断叠加,游戏中的数据也变得越来越庞杂,这其中既包括玩家产生的游戏存档等数据,例如关卡数.金币等,也包括游戏配置数据,例如每一关的配置情况.尽管Unity提供了PlayerPref ...
- Unity3D ——强大的跨平台3D游戏开发工具教程
http://unity3d.9ria.com/?p=22 众所周知,Unity3D是一个能够实现轻松创作的多平台的游戏开发工具,是一个全面整合的专业游戏引擎.在现有的版本中,其强大的游戏制作功能已经 ...
- 《Unity 3D 游戏开发技术详解与典型案例》——1.1节Unity 3D基础知识概览
本节书摘来自异步社区<Unity 3D 游戏开发技术详解与典型案例>一书中的第1章,第1.1节Unity 3D基础知识概览,作者 吴亚峰 , 于复兴,更多章节内容可以访问云栖社区" ...
- Android+3D游戏开发技术详解与典型案例
内容导读 本书共分两篇,第一篇介绍了Android 3D游戏开发的基础知识,主要对OpenGL ES的相关内容进行了介绍. 章 名主 要 内 容 第1章 英雄还看今朝-Android简介本章介绍了市场 ...
最新文章
- php中$_REQUEST、$_POST、$_GET的区别和联系小结
- spark-scheduled调度算法
- linux shell 显示路径
- 现代谱估计:多窗口谱
- iOS开发点击UIButton实现UIView的旋转
- 如果linux目录中没有srv,了解linux系统目录,proc,root,sbin,selinux,srv!
- golang 接口类型 interface 简介使用
- PyQT项目优化---添加多线程数控制
- MAMP Pro for Mac(PHP/MySQL开发环境)v6.6
- pyinstaller编译出的exe被杀毒软件认为是木马
- 语文数学英语计算机文理科,高考文理科英语试卷一样吗
- 硬核!深信服春招3面,终获20k入职offer!
- UWP 学习笔记 二
- 马克飞象markdown用法
- 贪吃蛇小游戏编写心得
- 上海创蓝253董事长_从世界记忆大师到互联网百强企业CEO:创蓝253钛牛哥的传奇之路...
- 【技能树共建】Python 列表推导式
- linux配置和查看主机名
- JSF pickList
- Mac 的brew 换源
热门文章
- matlab伯德图稳定性,11系统的稳定性Bode稳定判据介绍.ppt
- 关于在Android中使用CMake你所需要了解的一切(三)
- AMEYA360报道:干式电容器与油式电容器有什么区别
- 字节跳动架构师讲解Java开发!美的java开发面试
- 学习日记08 08——超级数组
- cetus权限连接主从mysql_cetus/cetus-rw.md at master · niumanniu/cetus · GitHub
- bool型判断年份是否为闰年
- uploadify ie9 empty() 缺少对象
- JavaScript中innerText,innerHTML,outerText,outerHTML使用心得和区别
- 必备:音乐的魅力,一边听歌一边练习英语!