Unity3D引擎之渲染技术

2017年04月07日 16:24 0 点赞 0 评论 更新于 2025-11-21 21:20

在学习Unity引擎或其他3D游戏引擎时,坐标空间是一个常见且关键的问题。在之前的博客中,我已向读者介绍过相关内容。在本篇博客里,我将用通俗易懂的语言,深入探讨为何需要如此多的坐标空间,以及如何利用矩阵变换解决实际问题。

生活中的坐标空间类比

在日常生活中,我们常常会遇到问路的情况。不同人的方向感存在差异,有的人方向感强,有的人则较弱。当为方向感强的人指路时,我们可以说“向东走大约300米,再向北走100米”,这里是以东南西北为坐标轴进行描述的。而对于方向感弱的人,我们只能说“向前走300米,再向左走100米”,此时使用的是以路人自身为原点的坐标空间。从这个案例可以看出,不同的指路方式对应着不同的坐标轴向。这表明在生活中,我们会根据不同的情况使用不同的坐标空间,这与游戏中使用不同空间的原理是类似的。

Unity3D引擎中的坐标空间

在使用Unity3D引擎开发3D游戏时,同样会面临各个坐标空间的变换问题。下面为开发者详细普及相关知识,以便在进行空间变换时能够更加得心应手。

模型空间

Unity3D引擎通常使用扩展名为FBX的模型,这些模型由美术人员使用建模工具(如3ds Max)制作并导出,同时还会包含图片(如高光、法线等)。关于材质的渲染,既可以使用Unity3D自带的Shader,也可以自行编写Shader。

制作好的模型相对于自身而言处于局部空间,也称为模型空间。每个模型都有自己独立的坐标空间,当模型进行移动或旋转时,其模型空间也会随之移动和旋转。打个形象的比方,当我们在公司的房间里移动时,我们自身的空间也会跟着移动;当我们转身时,我们的坐标空间也会相应变化。

在模型制作过程中,美术人员会为模型设置一个坐标,默认情况下通常设置为(0,0,0),这个坐标作为父节点的坐标。模型可能会有孩子节点,假设带有孩子节点的物体如下:

孩子节点的坐标是(2,2,0),这是子物体的局部坐标。接下来,我们将通过矩阵转换的方式,计算它在Unity中的世界坐标,同时向读者展示如何利用矩阵变换获取世界空间中的坐标。

世界空间

Unity3D引擎使用的是左手坐标系,即Z轴朝里,X轴朝右,Y轴朝上。将制作好的模型拖入到Unity编辑器后,红色箭头表示X轴,绿色箭头表示Y轴,蓝色箭头表示Z轴。此时,模型在世界场景中的坐标是(0,0,0),也就是说它自身的局部坐标与世界坐标重合。

下面我们对模型进行位移、旋转和缩放操作,具体参数为:缩放(2,2,2),旋转(0,150,0),位移(5,0,25)。在进行这些操作时,需要注意变换的顺序是固定的,必须先进行缩放,再进行旋转,最后进行位移操作。相应的矩阵变换如下:

经过这些变换后,在世界空间下,模型的子物体的位置是(9,4,18.0)。通过矩阵变换,我们成功得到了子物体的世界坐标。

在游戏开发中,这些基本运算经常会被用到。例如,我们可以利用矩阵变换自行实现实时阴影。由于Unity3D自带的阴影计算消耗较大,在移动端实现较为困难,而通过矩阵变换实现阴影可以有效提升效率。

后续内容展望

后续我将继续介绍观察空间的矩阵实现,敬请期待。

作者信息

孟子菇凉

孟子菇凉

共发布了 3994 篇文章