1. 在游戏世界中定义一个物体
现实世界真的很庞大和复杂,要想在计算机中完整模拟出来是不可能的。
表面代替整体
在游戏中只需要把物体的表面给完整定义出来,计算机就能给你渲染出逼真的图像。然而想完整的定义物体表面依然很困难。现实中的物体表面大多数是坑坑洼洼的,颜色也可能是深浅不一,甚至形状也是不规整的。这意味着你需要花大量的小几何图形才能完整的定义物体表面。这些几何图形是如此之多,以至于计算机也无法流畅的实时渲染出来。我们也不得不想办法降低几何图形的数量,舍弃大量不必要的细节。
点、线、面组成表面
统一是一个减少计算量(省去了大量判断)的好方法,三角形可以组成任意的几何图形。这也就意味着大量的三角形可以组成任意的物体。为了更好的保存三角形,也为了更好的定义物体。我们一般先找出物体的菱点(特殊的点),这些点被保存在一个数组中。再在另一个数组中保存由这些点构成的三角面。
图片.png
补充:为了支持一些特殊的物体如粒子、光线,计算机的渲染系统也支持着点与线。顶点数组也可储存物体的颜色信息。
2.给物体上色
即使我们定义了点和面,我们渲染出来的物体也是没有颜色,只有形状的。对于一些简单的有规律的物体,我们还能通过代码给各个顶点指定颜色(计算机会按照各顶点的颜色来给三角形内部做插值)。而现实世界物体的表面一般都呈现丰富特殊的颜色,并且在很小的图形上呈现多彩的变化,如果我们还是用计算机计算出一个个微小像素上的颜色再拼成特定的“图案”是非常辛苦的工作。
纹理映射
为了获得更真实的细节,一张或多张纹理映射将会应用到物体的表面,正如下图所显示的。物体表面上每一点的纹理像素都能在纹理映射中找到。我们需要通过代码给各个顶点指定纹理(图像)坐标,计算机计算三角形内部颜色时会通过图像插值的方法得到。
图片.png
虽然同样是要给每个定义额外信息,但纹理映射确实要方便真实很多。
一方面,我们可以通过特殊的函数来定义纹理到顶点的投影。如平面投影、球形投影,在程序里体现的是很少的代码即可实现。
另一方面,纹理投影意味着物体表面的小的坑坑洼洼和颜色不一可以通过选取合适的纹理图像来解决。即我们可以合并掉那些多余的小三角形。
3.声明一个物体
虽然我们已经创建了逼真的三维物体模型了,但这只是模型,还不能代表游戏中的物体。
位置、旋转、缩放
为了证明这个物体确实存在在空间中,我们需要声明物体的空间位置、物体朝向、物体大小。这样我们才会对物体有一个清晰的印象。
4.给物体补上体积
前面说了,我们是通过物体的表面来模拟物体的。这就造成了一个问题---穿模。我们必须在游戏逻辑里加入逻辑判断。但是如果利用组成物体的不规则的点和面来检测的话,那计算量就太大,也太复杂了。
碰撞体-给物体表面套一层规则体
不规则体之间的碰撞很难判断,但如果对两个球体来检测碰撞,是不是就很简单了。碰撞体的原理就是在物体表面再套一层看不见的规则体(如球、长方体、椭球体)
当然这么做还有两个问题。一个是精度不可能太高。对于凹形图,可能会产生---浮空现象。另外一个就是如果是给很薄的平面检测的话,可能在一帧的时间内,物体就穿过去了。程序也是检测不到的。
图片.png
5.让物体更真实
仔细想想,我们似乎也创建了一个世界。但这个世界依然不够真实。现实世界我们看到的物体都是通过物体的材质和光照映射出来的。而这个世界却是由贴图和模型构造的。这当然有很大的区别。
材质
现实世界中有很多不同的材质。这些材质主要体现在对光的响应函数不同上。
材质表示一个模型看起来像是用什么做的。比如看起来像是金属做的,看起来像是玻璃做的,体现在对亮度的变化上。而贴图呈现的是细节一个,决定颜色的变化。纹理其实是贴图的一部分,即物体呈现出来的图案叫纹理。
图片.png
6.点亮整个世界
材质和光照是一体的,定义了材质而没有光照。那么你是无法看到这个物体的。定义了光照没有材质,那么光是对物体没有影响的。
材质主要体现在系数Ka、Kd、Ks上
图片.png
这就是经典的Phong模型。Ia、Ip都是常数,k也是已知的,L是光源的方向也是已知的,N是物体表面的法向可以算出来的,v是视线的方向,R也可以算出来。
PS:很多概念理解的不是很透,后续会不断更新的
网友评论