基于3ds Max和Unity3D的校园漫游系统的设计与实现
2022-09-07邱百爽段胜辉
邱百爽,段胜辉
(华北理工大学轻工学院 河北 唐山 063000)
0 引言
传统形式的高校宣传一般是通过实地取景,成片以后通过PS等软件对图片进行修饰调色。但是通过专业三维软件可以制作校园的三维仿真模型,在计算机上根据需要调整各个模型的位置、大小、材质,控制光线的角度、颜色等。后期还可以将3ds Max完成的模型导入到Unity3D中,对模型进行进一步的加工来制作自由世界漫游系统,使得用户能身临其境地浏览校园。
校园漫游系统构建过程首先需要对学校地形地貌进行考察、测绘、拍照,并记录数据及图像,然后通过不同的建模方法进行模型的制作并为所有模型赋予材质贴图。将完成的所有模型导入Unity3D中,对模型进行适当调整后导入人物模型,对模型添加刚体、碰撞体、动画器及控制脚本,然后对场景相机挂载脚本文件,跟随人物。最后对场景进行丰富,添加合适的物理效果,构建发布成可执行文件。
1 校园模型制作
首先对实景进行考察,通过无人机和相机来获取学校的整体鸟瞰图以及建筑细节图,在3ds Max软件中对区域进行划分,对模型进行分类以便分别建模,最后合成完整模型。然后为每一个模型添加精确的贴图并赋予材质。当模型整体位置及比例调整好以后,我们对其添加灯光以及真实的大气效果,通过摄像机视角进行渲染,对灯光违背物理原则以及模型破面的BUG进行修复,最终在Max内完成整体的3D模型[1]。
华北理工大学轻工学院的建筑多以传统中式的屋顶为主并融入了现代元素,在具有浓郁中式古典风格的同时也体现出了现代的风格。但传统中式的屋顶是美观且细节极其丰富的,数量繁多的瓦片、斗拱、龙骨,图案精美的动物甚至是龙图腾的雕刻,这些都是制作过程的难点。对于这些难点位置模型的处理我们主要采取两种方式:一方面是正常绘制中高模型例如瓦片等,另一方面则是建立低模或表现大概轮廓,通过纹理贴图和法线贴图来表现物体表面的材质和纹理凹凸效果等细节。因此,在建模时需要将模型的中式风格与现代风格的部分进行分割制作,而后合并到一起。下面以学校荷花池模型为例说明建模过程及材质贴图原理。
1.1 荷花池景观的建模
小桥、河水、荷花、凉亭相得益彰,为校园平添几分风采。对于这些不规则模型我们主要采用多边形建模法和二维线条建模法。多边形建模主要是运用基本几何体和扩展几何体构建基本模型,对其采用多边形建模命令进行调整优化。二维线条建模主要是利用基本的建模方式,将二维图形配合使用一些命令,构建三维模型[2]。对于3ds Max来说,三维多边形物体模型应尽量保证其面都是四边面,否则会出现破面、闪面的情况。在样条线的弯曲过于随机和不规则的情况下,挤出后直接塌陷很容易出现破面,所以解决办法是通过修改线条,将有问题的面改为标准的四边面,然后再进行插入倒角等一系列操作。
小桥栏杆模型的建模首先需要绘制二维样条线,然后使用倒角剖面修改器来改变不同位置的凹凸收缩效果以完成石柱头部建模,并将其与进行过一定倒角的石柱本体拼接完成。对于桥面,桥洞、桥墩使用基础长方体调整出应有的形状,摆放好合适的位置,而后沿着各个模型的边界,通过顶点捕捉的方式绘制出对应形状的样条线,对其添加挤出修改器,挤出等同的厚度后即可达到目标。
凉亭顶部模型的建模采用拆分法。凉亭顶部覆盖面最主要的是瓦片,我们从圆柱体出发通过插入将其改成一通心管,而后删掉一半并将一端收缩,就形成了需要的形状。通过实例的方式对其复制来形成屋顶瓦片重叠的效果。对于斗拱,我们将其分为一个个形状大小不同的多边形物体分别建模,而后再拼接到一起。对于脊骨上雕刻的部分,我们通过Bezier点来调整二维样条线的位置和细节,并添加挤出命令来形成多边形物体模型。
1.2 贴图及材质制作
逼真的模型效果除了完成建模,还需要趋近真实的优秀材质。现实世界的各种物体有着不同的漫反射颜色,不同的光泽度,不同的凹凸程度。完成模型后需要通过材质及贴图表现出物体本源的物理效果。下面以荷花池周围鹅卵石的效果为例来说明模型的材质贴图原理。
本文使用VRayMtl材质,其中3个通道分别为反射、漫反射和凹凸通道,用来处理荷花池鹅卵石的材质贴图效果。首先采用VRay位图作为基础贴图,将原始图片赋予模型,连接材质球的漫反射通道使其表现出基础的纹理效果,然后通过颜色校正表现出合适的颜色[3]。漫反射效果通过贴图控制即可,而反射效果则需要通过贴图和材质球参数共同控制,材质球参数部分需要调整光泽度来达成一个较为合理的高光效果。我们将法线贴图连接到凹凸通道,通过调整材质球的凹凸通道比例来控制具体的凹凸效果。在大模型或者贴图较为密集的模型上,使用UVW贴图通常需要将Gizmo缩小,而这时通常会出现贴图瓷砖性重复问题,因此我们通过VRay随机器将贴图通过算法避免重复拼接。反射、漫反射和凹凸用同一个UVW随机器也是为了保证随机化的过程中参数相同,以免导致贴图错乱或者纹理和凹凸效果不一致的情况。
1.3 灯光、摄像机的布置及渲染
VRay渲染器为使用者提供了完全仿真的太阳光模型。与3ds Max中集成的灯光模型不同,VRay太阳光模型会根据创建的光源点与目标点的角度和距离来表现出不同的光线效果。例如正午的阳光是高且亮的,投射下来的阴影会比较清晰,颜色微黄,但是傍晚的阳光则低且昏暗,投射出来的阴影效果是较为模糊的,并且颜色昏黄[4]。我们利用VRay太阳光作为主要光源,使用HDRI环境贴图作为环境光,辅以穹顶灯来增强亮度,对整个模型场景进行打光。我们选择VRay物理相机,这个相机同样是完全模拟真实相机的参数,比如光圈、焦距、感光度等,和生活中的相机无异,可以快速调节相机的各项参数来达到想要的效果。
经过对校园内众多模型的逐一建模及添加材质贴图,并添加灯光和摄像机操作,最终完成校园漫游系统所需的所有模型,其中小桥荷花池的三维模型效果见图1。
2 校园漫游系统开发
将制作完成的校园场景模型导入到Unity3D中,该过程会出现部分材质损坏,需要在Unity3D中重新添加基础材质,并对部分损坏的材质加以校正。材质校正完成后,我们将准备好的人物模型导入其中。
2.1 添加刚体和碰撞体
漫游系统要求人物能够在场景中自由移动,Unity3D是以真实世界为基础的物理引擎,它为我们提供了能够表现物理效果的组件。可以利用Rigidbody(刚体)表现重力效果,它可以使游戏内的模型具有真实世界的物理效果,并且可以在Unity的物理引擎模拟重力、摩擦力、角动量等效果,从而模拟现实世界中的各种情况,刚体通常需要配合各种碰撞体来发挥作用。碰撞体代表物体的实际碰撞体积,在一个物体被创建时一般会分配一个与其模型大体符合的碰撞体[5]。碰撞体是Unity中用于检测模型碰撞的组件,其中有很多类别,比如常用于物体的网格碰撞体(Mesh),常用于人物模型的胶囊碰撞体(Capsule)。
Unity3D系统中提供了CharacterController人物控制组件,它可以直接用于控制人物移动,但是这个组件会和刚体组件冲突。如果使用CharacterController,刚体上对模型施加力的作用可以产生碰撞效果,但是碰撞后不会对其他物体施加力,也就是不会把被碰撞的物体弹开,并不符合我们的实际情况,所以我们采用刚体和碰撞体的组合。通过刚体为人物模型添加重力效果使人物拥有一定的物理属性,然后再为其添加碰撞体。作为碰撞双方,碰撞体是必须都要有的组件,但是刚体只需要一方拥有即可。因此我们常在人物模型上挂载刚体组件,然后对每个模型添加碰撞体,这样人物模型和任何模型碰撞都可以实现碰撞效果。
2.2 人物模型选取及动画器制作
人物模型在行走、跳跃、站立时都有不同的动作,因此需要对其动作进行调整。Unity3D资源商店为我们提供了Basic Motion动画包,里面包含基础的动画包括直立、跳跃、行走等。我们首先从中下载动画,然后通过动画器编辑人物的动作使其符合正常行走逻辑。在动画的切换过程中,常因为两个动画之间的差距过大,而显得动画的切换很不自然,此时利用动画混合树在走动画与跑动画中生成多个过渡用的插值动画以达到平滑切换的功能。
2.3 编写第三人称控制脚本
人物的动作需要通过脚本对应键盘的各种不同操作来实现。Unity3D提供了两种人物移动的方式,分别对应触屏状态下的操作和键值下的操作。在C#程序中通过input.GetAxis(Horizontal)和input.GetAxis(Vertical)两个控件使人物模型获得横轴和纵轴的移动[6]。Horizontal对应键盘上的A/D键或方向箭头的左右键,Vertical参数对应键盘上的WS或者是方向键。按下不同的键位会产生不同的值并驱使模型在对应轴向及增量上产生移动。
调用动画需要通过GetComponent方法获得动画器组件,声明UpdateAnimator方法来单独使用动画状态机,在Start函数内调用即可。我们使用动画机内的SetFloat函数来获取人物量的移动,向量的长度决定了人物移动的快慢。通过setbool这个布尔值来调用跳跃和下蹲状态,这其中涉及碰撞检测。当人物模型顶部的碰撞体遇到另一个碰撞体时,就会触发布尔类型的m_Crouching参数。
2.4 自由视角相机设置
第三人称游戏开发里的人物是会不断移动的,所以相机需要保持合适的角度跟随人物进行移动。最简单的实现方法是首先在Unity3D场景中将摄像机调整到合适的位置,然后将它放到人物模型的子层级下,让相机成为人物的子物体。Unity中的子物体是随父物体移动的,我们通常使用这种方式来将一些武器或者粒子特效挂载到人物模型上,这样就可以达到相机跟随人物移动的效果。
3 校园漫游系统的测试与完善
本系统中的预期功能已经实现,但是进入场景内仍存在一些问题,因此我们进行了调试优化,下面以其中较为典型的两个问题为例加以说明。
首先是场景模型资源优化。进入游戏后,人物在个别场景中的活动会出现卡顿现象。分析得知比较影响场景开销的因素主要有:场景模型面数过多,场景内资源过多,光影效果过于丰富以及额外的粒子效果过于丰富等。我们针对性地进行优化,比如场景的某些花草、树木、河流模型是从3ds Max导入的模型,效果很好但是面数过多,因此使用Unity官方资源库内的部分开源模型包代替。阴影设置为“极高分辨率”后参数过高也占用了大量的系统资源,因此将模型的阴影参数调整为“中等分辨率”。经过一系列优化后通过帧数监控软件,可以看到复杂场景下的帧数最高提升44帧,提升幅度达到了61.9%,同时由于场景优化,也提升了GPU的占用率,使其能更好地发挥性能。
其次是人物移动优化。人物的问题主要是移动速度过快,但通过对图书馆到商业街的距离测试,发现人物移动过程中的问题并不仅仅是速度过快,主要是人物模型和场景模型比例失调,因此对相关模型的大小进行了调整。
对漫游系统优化之后,我们将漫游系统导出,完成的校园漫游系统部分效果见图2。
4 结语
本项目利用3ds Max软件完成了校园模型的制作,并利用Unity3D软件实现了校园虚拟漫游系统的开发。研究结论主要有以下几点:(1)在建模方面,应深刻理解布线与模型边面的关系,严格遵循四边面布线规则,否则在将模型导入其他软件时会出现破面、损坏等无法预料的问题。(2)在材质制作上,需要通过真实的物理世界参数对不同材质进行调整,以追求更为真实的材质表现。(3)在灯光和渲染上,灯光的布置应遵循物理世界的灯光表达方式,时刻注意阴影的角度和位置,避免出现违背物理原则的阴影。(4)在Unity漫游系统的制作中,人物之间的动画过渡如果不自然,可以通过BlendTree混合树将多个动画混合在一起从而实现自然的动画效果。
本项目利用Unity3D实现了在校园内的自由移动,并且添加了天气效果使其更为真实。后续还可以通过对学校的室内场景进行建模,在Unity中完善更多的人物模型,实现人物能够在校园及室内进行自由移动,并基于此漫游系统完成校园系列三维动画宣传片的制作。