欢迎光临

文章详情

游戏中的3D数学知识之法线的应用

2018-08-22 handler 1607

很多时候做游戏都想实现一些炫酷的效果,包括水、风、火、土、雷等。了解游戏开发的人都知道,这些东西往往都是由程序自己实现的,美术更多提供的是辅助。而平时自己想要实现的时候总觉得这些会涉及一些极为麻烦的数学知识,这里我就想将法线作为一个切入角度,把对应的知识点都列出来,因为涉及比较多的内容,具体细节还希望大家多多去查找资料。一旦掌握这些知识点,相信以后这些效果都会信手拈来(当然如果要做次时代效果还需要进一步研究,如果只是手机上的话,基本是够用的)。

理解法线是什么

AB娱乐知道,游戏中的模型面数越高,细节越丰富,那么就可以出越好看的效果。但出于性能的限制,AB娱乐往往无法无限制的增加细节。于是人们就想了一个办法,就是将一个面数很高的模型的法线信息存入到一张图片里面,然后低面数的模型通过对这个贴图的采样去制造自己有很多细节的效果。在这种场景下,法线的作用可以理解为反映出模型表面的凹凸信息。


模型法线怎么算

首先AB娱乐需要知道如何表示一个法线。正常情况下AB娱乐都是用一个三维向量表示法线的方向。这个向量垂直于当前顶点所在的这个面,如果有多个面共用这个顶点,那么就可以通过取所有面的平均值来计算出这个法线。在得知如何计算法线之后,AB娱乐就可以开始考虑如何存储法线。

模型法线的坐标系

对于静止的物体,AB娱乐可以轻易的把它在当前状态下的全部法线信息保存下来,但是如果物体发生了移动或者旋转,AB娱乐就会发现物体相对于世界坐标发生了改变,这是不可接受的。因为游戏中的物体肯定会经常移动变换,如果要针对每一个状态都存储对应的法线信息,显然是不可取的。于是人们想到了可以用模型坐标系或者切线空间坐标系来表示法线的坐标。目前绝大多数都是采用切线空间坐标系来表示法线坐标的。

切线空间坐标系


参考这个球,蓝色的线垂直于球面,就是法线坐标系的Z轴,而红色的线和贴图的方向一致,AB娱乐可以认为是X轴,然后Y轴可以根据这两个算出来,图中没有画,但AB娱乐可以知道它是垂直于这两个轴的。那么这个坐标的含义是什么呢?在切线空间坐标中(0, 0, 1)代表当前顶点法线没有任何偏移,而一旦x,y不为0,那么就代表着法线分别向x,y进行一定的偏移。这样做的好处十分明显,对于不停移动变换的物体,法线信息存储一份就可以了,因为相对当前顶点而言,这个顶点的法线和法线贴图之间的偏移总是保持不变。

法线的存储方式

知道了法线的坐标系,那么AB娱乐就可以通过模型去算出法线,同时转化成切线空间下的三维向量。那么要怎么保存到一张贴图中呢?首先AB娱乐可以把法线坐标限制在长度为1内,那么可以通过范围[-1,1]来表示法线在360度内的偏移。但AB娱乐知道贴图正常情况下是无法存储负值的,于是AB娱乐进行这样的变换,f(x) = (x + 1) / 2。 这样子AB娱乐就发现范围被限制到了[0,1]中,就可以存储在图片里面了。那么使用的时候,AB娱乐需要反向操作,而在Unity中也是这么做的:

关于AB娱乐

业务覆盖AR/VR研发及解决方案,游戏订制开发,小程序开发,营销管理系统,动作捕捉等领域。解行业之需,以顶尖人才技术和服务为客户创造非凡价值。

查看更多

联系AB娱乐

底部图文