图形学入门之线性代数

时间:2021-09-19 16:31:46

已经搬家到新博客 jjyy.guru
分享跟游戏相关的技术、编程心得、unity3d、cocos2d、emacs、操作系统

 

图形学入门之线性代数

在图形学中,我们常常会用到很多数学技术,这里简单的讲一下,主要以理解为主。

一切从表示位置开始

我们可以用什么去表示三维空间爱你中的某个位置?

那就是一个坐标,它是有三个标量组成:

(x,y,z)

可以理解成在该空间中,从原点出发,x轴单位走过的路程,在y轴单位中走过的路程,再加上z轴走过的路程。一个坐标其实不仅仅是一个位置,也可以表示一个方向。我们称之为向量。

什么是空间

那么刚刚提到的“该空间”是什么空间呢?

空间可以理解成坐标的“容器”。

数学上怎么表示一个空间的容器呢?

答案就是通过一个坐标系。通过坐标系,我们可以表示一个空间,而坐标填充满了在里面。

我们自身就活在三维空间,容易想到,这里我们把三条不平行的向量放在一起表示坐标系:

(x, 0, 0)

(0, y, 0)

(0, 0, z)

这里我们用三条正交的向量,配以一个单位长去表示一个空间。当然,三条向量不是一定要正交。因为不正交的空间也是存在的。

空间和坐标的关系

那么在这个空间上的坐标怎么算呢?比如:

(1, 0, 0)

按照刚开始的说法坐标可以理解成从原点出发,x轴单位走过的路程,在y轴单位中走过的路程,再加上z轴走过的路程。

所以我们让这个坐标在上面的空间走一下,得到下面的结果:

x

我们发现,在不同空间下,相同的值走过的路程不一样,因此,坐标的位置由它所处的空间决定。

对顶点进行变换

通过上面的发现,我们可以对顶点进行一些有趣的变换,而且有三种基本的变换。

  • 平移

图形学入门之线性代数

  • 缩放

图形学入门之线性代数

  • 旋转

图形学入门之线性代数

通过这三种基本的变换,我们可以通过一个矩阵把,把顶点从原点移动到任意一个地方。

计算机显示三维

计算机图形学中的光栅化,简单来讲就是在把用数据表示成的三维世界,在屏幕上的像素中显示出来,因此需要计算每一个像素的颜色。听上去是一个庞大的工作,但是聪明的程序员通过强大的抽象,通过有限的几个简单的组合去描述这个工作,从而可以用一个更加人性化的方式去表示。但在此之前,需要先讨论怎么把屏幕中的三维世界显示出来。

在图形学的渲染管线中,我们会用网格再贴上纹理去表达这个三维世界。简单来讲就是这些数据关于光的计算之后,颜色进行叠加,就像画家一样,把颜料一层一层的涂上去,直到满意为止。用绘画去比喻的话,在色彩之前,我们通常还要素描稿,把形状绘制出来。把色彩绘制出来会在放在下一篇,这里主要讲解这个线稿怎么画。

假设我们有一个网格模型,我们的目标便是将这个网格放到屏幕上的位置,并且将线条上经过的像素进行填充。这个网格是怎样放到屏幕上的正确位置呢?

由于艺术家都喜欢把模型放到坐标原点,因此,所有模型都需要从坐标原点变换到我们希望的位置(屏幕上的那个位置)。在前面我们学到,我们可以通过一个矩阵去把一个顶点变换到另外一个位置。这显然可行,但是计算这个矩阵太复杂了。所以这里我们把矩阵进行分解,我们形象地分开几个矩阵的相乘。

世界矩阵:原点->世界空间的位置

图形学入门之线性代数

摄像机矩阵:世界空间的位置->以摄像机为中心后的位置

图形学入门之线性代数

屏幕矩阵:以摄像机为中心的位置上每一点映射到屏幕上每一点

图形学入门之线性代数

把它们串起来就得到了我们屏幕上的“线稿”