OpenGL中的坐标系-3D

494 阅读4分钟

请预定了我们游戏引擎课程的同学,务必强迫自己至少浏览一遍所有内容,因为这些心法口诀将时时刻刻体现在整个游戏引擎的设计中。


啊!我怀孕了!

3D坐标系系统实际上是2D情况的一个简单的扩展。我们简单粗暴的去添加一条同时垂直于x和y轴的坐标轴,我们叫它z轴好了。x轴指向右边,y轴指向上面,z轴指向我们的后方。

对的,对于跟着萌同学学习OpenGL的人来说呢,这就是传说中的右手坐标系了。我们当然会按照我们最熟悉的坐标系来介绍,市面上的书籍你们之所以看不懂,因为有的不是右手坐标系,有的即便是右手坐标系,数据结构也不是按照标准内存来做的,所以理论代码是脱钩了的,但是大家不要怕,有了我们,你的未来将一帆风顺。

在几何学忠,3D坐标系系统定义了一个我们非常熟悉的东西:欧几里德空间


接下来开始就是纯理论数学方面的东西,而不是讲故事了,请大家提起裤子,擦干净鼻涕,把窗帘拉上。

3D坐标系中的三个坐标轴,我们称他们为坐标系系统的基。一个基是由一组互相线性无关的向量构成。这样的一组向量可以通过线性的结合来表现该坐标系中的任意向量。一组线性无关的向量是指一组可以通过线性组合来表示其他向量的向量们。改变基或者改变坐标系,在计算机图形学中是最常见的操作。


左手坐标系vs右手坐标系

坐标系也分左手坐标系和右手坐标系,你去看算法书得先看看这些算法是什么手坐标系下的算法。左右手坐标系如下图所示:

正如图所示,坐标这货就叫左手坐标系,右边的就叫右手坐标系。

为何叫他们左手坐标系和右手坐标系呢?不妨掏出你的玉手,摆出图中的pose,是不是很屌。

那么左右手坐标系到底他喵的对你写代码有神马影响呢?

他们对法线朝向的计算是起着决定性作用的。如果你用的是右手坐标系,那么多边形的点要按照逆时针方向进行组织才能算是面的正面。后面我们还会有相关的文章或者内容对这部分进行介绍。



Right、Up、Forward

在笛卡尔坐标系中只定义了互相垂直的三个单位向量。他们并没有什么真正的意义,所以是你,没错,就是你这个呆头呆脑的程序员决定了他们到底是什么样的几何含义。

在东汉书院的所有课程中,我们都使用的是右手坐标系。这就跟OpenGL的坐标系是一模一样的。其他使用了右手坐标系的还比如Maya。DirectX、PBRT还有PRMan使用的是左手坐标系。


世界坐标系

我们现在已经知道点还有向量的坐标是相对于他们所在的笛卡尔坐标系的原点而言的。我们同时也说了,我们可以创建无数个坐标系,点和向量在每个坐标系中都是唯一存在的。所以,很多3D程序中会定义一个最牛叉的坐标系系统,所有的其他坐标系都是相对于这个坐标系来定义的,这个家伙就叫做世界坐标系。这个世界坐标系定义了x、y、z轴,通过这些数据来定义其他的所有东西。世界坐标系或许是整个渲染管线中最重要的东西。其他的坐标系还包括模型坐标系、局部坐标系、视口坐标系、屏幕坐标系。我们将在后面慢慢来介绍。


我们需要记住的是

分享、转发。由于服务号每月只能群发四篇,所以其他的文章需要同学们主动来我们这里获取。我们从四月份开始将以每天一篇文章的速度来发文,助力我们游戏引擎线上班的同学学习更轻松愉快。