【摘 要】本文以广西理工职业技术学院为例,论述三维虚拟校园建设和漫游的设计与实现,提出通过谷歌地球获取校园整体地形地貌,采用Photoshop对实拍图片进行处理,利用3DsMAX作为建模工具创建教学楼、办公楼、宿舍、综合楼等,运用Unity3D制作校园地形并实现第一人称校园漫游的交互制作,其逼真的校园环境模拟和良好的交互性给用户身临其境的漫游体验感。

【关键词】虚拟校园 第一人称虚拟漫游 3DSMAX Unity3D

【中图分类号】G 【文献标识码】A

【文章编号】0450-9889(2018)06C-0187-04

近年来,虚拟现实技术发展迅猛,它作为一个体验平台和设计工具的共同体,通过计算机融合多源信息、交互式的三维动态视景和实体,创造出一个让用户“身处其中”的模拟环境,使用户足不出户就能获得“身临其境”的体验感。三维虚拟校园漫游是通过对校园环境、建筑物、基础设施等的仿真,以漫游的形式再现一个三维可视化的、有声有色的虚拟校园,它基于虚拟现实技术,以真实校园为蓝本,通过三维实景模拟的方式构建一个逼真的三维虚拟立体校园空间,实现了第一人称的自主漫游,体现了环境的艺术性与真实性,使得学生和家长能够提前了解校园教学和生活环境,提高学校的形象和声誉,拓展了学校对外宣传、招生、校容校貌展示水平,提升了学校文化建设的对外影响力和知名度,使得学校在日益激烈的高职生源竞争中脱颖而出。本文以广西理工职业技术学院的三维虚拟校园漫游为例,通过3DsMAX进行建模和贴图,使用Unity3D平台制作校园地形,结合C#语言实现对三维虚拟校园第一人称漫游的交互控制。

一、三维虚拟校园漫游开发流程与设计

(一)三维虚拟校园漫游开发流程。三维虚拟校园漫游的实现主要分为三大部分:数据采集、模型构建、第一人称漫游制作。

1.数据采集。从谷歌地球获取校园平面布局图,为校园地形环境的制作、道路设置、建筑物布局提供依据;从学院后勤获取各楼栋CAD设计图,为校园建筑建模提供数据;拍摄校园中各建筑物细节图,拍摄草坪、花圃、林地、天鹅湖、道路等校园环境景观,现场测量门窗等获取实景数据信息,为后期制作高仿真虚拟校园提供参考。

2.模型构建。包括模型创建、优化及纹理贴图处理三个方面。导入处理好的CAD图,使用3DMAX软件创建校园各建筑物模型;删除建筑物模型中的不可见面,对同一个面中多余的线和点进行移除,优化模型;使用Photoshop软件裁剪图片、处理贴图和绘制建筑物纹理等;依据校园平面图,使用Unity3D软件制作校园地形、道路等。

3.第一人称漫游制作。使用Unity3D软件进行登录界面设计、场景组建、碰撞设计、第一人称设计、漫游设计、交互设计等。

具体流程如图1所示。

(二)三维虚拟校园漫游设计。三维虚拟校园漫游的设计目标是使用户在交互的过程中进行视觉、听觉、触觉的触碰,足不出户就能感受到浓烈的校园气氛,获得身临其境的体验。因此,我们将从以下几个方面对三维虚拟校园漫游进行设计。

1.资源优化。为了避免场景过大而增加网络环境和设备的负担,本文所有建筑模型在主场景漫游时均以只显示建筑物外观的形式展现,并通过跳转方式进入建筑物内部漫游,解决了主场景载入时负担过大的问题,使得可以通过网络访问和浏览。

2.三维虚拟校园的展示。校园地形、建筑物等均以外观95%相似度的精细模型展示,与真实校园环境基本吻合。

3.三维虚拟校园漫游。用户可以通过鼠标、键盘在虚拟校园内自由游览,并通过小地图了解用户在虚拟校园中的位置。

4.多媒体展示。用户在进入建筑物内部巡游时,可通过点播视频、音频的方式了解该建筑物主要功能及相关宣传资料,增强体验感。

二、三维虚拟校园漫游的实现

(一)三维虚拟校园模型的构建。三维虚拟校园模型主要包括大门、教学楼、宿舍楼、运动场、路灯、花草树木、人工湖、道路、地形模型等,可归为建筑模型、环境模型、地表模型三大类。

建筑模型的构建,首先根据学院后勤处提供CAD图在3DMAX中绘制建筑物二维图形轮廓,再将其挤出、转换为可编辑多边形,然后对该可编辑多边形进行挤出、倒角、桥、调整顶点等操作得到三维建筑物模型,最后对建筑物模型进行优化处理,通过减面、移除多余的边和顶点、压缩材质贴图和对建筑物表面的细节如外墙瓷砖、门窗、装饰物等以纹理贴图代替等方法达到优化和减少模型所占内存空间的目的。

三维虚拟校园的环境模型中包含大量的花草树木,为了减少场景所占内存空间,树木均采用十字交叉面制作,花圃花卉采用立面体添加透明贴图制作,草坪等植被则使用纹理映射的方法。

构建地表模型,需要将从谷歌地球上获取的校园地形图在CAD上进行处理,使用Unity3D的地形(Terrain)绘制高地、人工湖、山坡、平地、道路等,创建出广西理工职业技术学院校园依山而建的地貌形态。

(二)场景构建。场景的构建包括登录界面制作、模型载入、灯光设置、小地图制作等。登录界面以广西理工职业技术学院正门照片作为背景,使用Unity3D软件中UI的Text和Button制作标题和按钮,如图2所示。

主场景则是将所有在3DsMAX创建的模型导入到Unity3D系统中并摆放到相应的位置,调整大小和方向,在每个有宣传展示功能的建筑物边上设置进入建筑物的引导按钮,使得能够跳转进入建筑物内部漫游和浏览。

为了使得场景看起来更逼真,需要为场景进行布光设置,使用Directional Light方向光充当太阳光,在需要的地方适当添加Point Light点光源以增强效果。设置主角外的所有模型为Static静态模式,使用Lightmapping技术将光线效果预渲染成为贴图模拟物体上的光影效果,减少光影对性能的开销。添加天空盒子skybox,使得虚拟校园更美观。

小地图的制作需要添加新的摄像机作为小地图专用摄像机,从上往下垂直拍摄校园道路层。创建一个球体,去掉其Sphere Collider属性,放置在第一人称胶囊体的层级之下作为第一人称的替代体,跟随主摄像机移动并在小地图中显示出来。保持小地图视图是正方形的摄像机主要代码为:

float px=(float)Screen.width/(float)Screen.height;//获取分辨率比例

this.camera.rect=new Rect((1-0.2f),(1-0.2f*px),0.2f,0.2f*px);//保持摄像机视图为正方形

(三)第一人称漫游设计与实现。本部分主要分为第一人称移动控制、场景切换设置、媒体播放设置三个部分。

1.第一人称移动控制。首先,选中场景中的所有物体,为它们添加Mesh Collider多边形碰撞组件设置为不可穿越的对象,取消Is Trigger属性使其仅作为触发器使用。使用Cretate Empty创建空游戏体作为第一人称的替代体,为其添加Character Controller角色控制器组件使其变为胶囊体以模拟人体的大致形状。为胶囊体添加Rigidbody刚体组件,使其在移动的过程中与环境产生碰撞交互,避免发生穿墙撞树的行为。使用键盘、鼠标控制摄像机跟随第一人称移动的代码分别如下。

(1)使用键盘WSAD键控制第一人称替代体移动的C#脚本代码。

void Control() {

//获取鼠标移动距离

float m_h=Input.GetAxis(“Mouse X”);

float m_v=Input.GetAxis(“Mouse Y”);

//旋转摄像机

m_camRot.x-=m_v;

m_camRot.y+=m_h;

m_camTransform.eulerAngles=m_camRot;

//使主角的面向方向与摄像机一致

Vector3 camrot=m_camTransform.eulerAngles;

camrot.x=0; camrot.z=0;

m_transform.eulerAngles=camrot;

if (Input.GetKey(KeyCode.W))

{ m_Transform.Translate(Vector3.forward * 0.1f, Space.Self); }

if (Input.GetKey(KeyCode.S))

{ m_Transform.Translate(Vector3.back * 0.1f, Space.Self); }

if (Input.GetKey(KeyCode.A))

{ m_Transform.Translate(Vector3.left * 0.1f, Space.Self); }

if (Input.GetKey(KeyCode.D))

{ m_Transform.Translate(Vector3.right * 0.1f, Space.Self); }

}

(2)使用鼠标控制第一人称替代体移动的C#代码。

protected Transform m_transform;

protected Vector3 targetPos;//目标位置

void Start() {

m_transform = this.transform;

targetPos = this.m_transform.position; }

void MoveTo() {

if (Input.GetMouseButton(0))

{ Vector3 mousePos = Input.mousePosition; //获得鼠标屏幕位置

Ray ray = Camera.main.ScreenPointToRay(mousePos); //将屏幕位置转为射线

RaycastHit hitInfo; //用来记录射线碰撞记录

bool isCast = Physics.Raycast(ray, out hitInfo, 1000, inputMask); //产生射线

if (isCast) {

targetPos = hitInfo.point; //如果射中目标,记录射线碰撞点

}

}

//使用Vector3提供的MoveTowards函数,获得朝目标移动的位置

Vector3 pos = Vector3.MoveTowards(this.m_transform.position, targetPos, speed * Time.deltaTime);

this.m_transform.position = pos; //更新当前位置

}

2.场景切换设置。为了减少虚拟校园主场景载入负担,本次设计将进入建筑物内部的漫游采用场景跳转切换的方式进行,在相应的建筑物边上加入UI控件Button设置进入内部漫游指示牌,使用代码Application.LoadLevel(“scence_n”);跳转切换场景。

3.媒体播放设置。在游览时播放相应的音乐,可以增加漫游的趣味性。在主场景中为地面或主摄像机添加audio source组件,在其属性面板的AudioClip项中添加背景音乐文件,保持play on Awake和Loop选项的选择以保证在运行场景时循环播放音乐即可实现背景音乐的添加。

当进入建筑物内部浏览时,可以选择播放相关的讲解音频或宣传视频,增强宣传效果。添加讲解音频主要代码如下:

public AudioClip audioClip; //定义声音文件

private AudioSource m_audioSource; //定义声音源

void Awake() {

m_audioSource = this.gameObject.AddComponent(); //为脚本对象添加声音源组件

m_audioSource.loop = true; //设置声音的循环播放

m_audioSource.volume = 1.0f; //设置最大音量值

m_audioSource.clip = audioClip;

}

void OnGUI() {

if(GUI.Button(new Rect(10, 10, 80, 30),"播放")) {

m_audioSource.Play(); }

if(GUI.Button(new Rect(10,50,80,30),"停止")) {

m_audioSource.Stop(); }

}

目前比较流行的视频播放方式有两种,一种是直接在场景的物体上播放,另一种是在GUI层面上播放。不管哪一种视频播放方式,其主要代码如下:

public MovieTexture m_movTexture; //定义视频纹理

void Start () {

……

M_movTexture.loop = true; //设置视频纹理的播放方式为循环播放

}

void OnGUI(){

if (GUILayout.Button ("播放")) {

if(!m_movTexture.isPlaying)

m_movTexture.Play(); }

if (GUILayout.Button ("停止"))

m_movTexture.Stop ();

}

三、测试与分析

在完成所有功能后运行场景测试其流畅性,观察模型、贴图与实际是否相符等,修改并重复测试,最后导出为EXE格式。测试证明,采用上述的设计理念和方法实现了基于3DSMAX和Unity3D的三维虚拟校园漫游,其运行流畅、逼真程度高、交互性强,能够满足不同用户的需求。

总之,本次漫游设计使用了AutoCAD、Photoshop、3DMAX、Unity3D等软件,以广西理工职业技术学院实景校园为蓝本进行了设计和制作,实现了三维虚拟校园的漫游。在后续还可对漫游设计进行二次开发,加入更多元素以丰富虚拟校园漫游,使漫游更真实;同时开发适用于多平台的版本,以增强对外宣传的效果。

【参考文献】

[1]王彩玲,刘瑞香,宋钊.基于Unity3D的虚拟校园漫游的设计与实现[J].科技视界,2015(5)

[2]郭仁春,霍西宝,玉锦宏,等.基于3DMAX及Unity3D技术实现数字化虚拟校园的网络建设[J].信息系统工程,2017(5)

[3]刘发久.基于Unity3D的虚拟校园[J].电子设计工程,2016(6)

[4]李吉锋.基于3DS MAX及UNITY 3D的虚拟校园系统的设计与实现[D].厦门:华侨大学,2016

[5]董春侠,司占军.基于Unity3D的虚拟校园App设计与开发[J].软件导刊,2017(2)

[6]王星捷,李春花.基于Unity3D平台的三维虚拟城市研究与应用[J].计算机技术与发展,2013(4)

【作者简介】蒙秋琼(1984— ),广西理工职业技术学院计算机应用专业教研室主任,讲师。

(责编 卢 雯)