智能社区三维展示系统的设计与实现
2018-09-21汪俊峰王星东郑传海
汪俊峰,王星东,郑传海
(河南工业大学 信息科学与工程学院,河南 郑州 450001)
0 引 言
随着计算机图形学研究的快速发展,特别是计算机硬件技术的成熟,三维虚拟现实技术在城市规划、教育、娱乐、旅游等方面都取得了广泛的应用成果[1]。虚拟现实技术利用计算机等硬件设备建立三维虚拟空间,为使用者带来了视觉、听觉、触觉等各种感观体验,使其足不出户就能身临其境地体验整个三维场景[2]。
二十世纪初,“智慧地球”(smart planet)这个名词第一次被美国提出,它具有强大的信息产业基础和领先的理念模型,在此基础上三维智能数字化城市在政府的管理下取得了许多优秀的成果[3]。2005年7月,欧盟三维智能化城市战略正式全面实施[4]。在此背景下,英国和荷兰等国家前后通过并制定了一系列比较完整的三维智能数字化城市的战略体系结构,并开始实施了一整套系统的解决方案[5]。一些欧洲国家比较重视三维虚拟数字化城市技术的研究与发展,为公共智能服务平台制定了各种规划[6]。在全球兴起的“智慧风潮”影响下,国内一、二线城市也开始寻找适合自己的智慧社区策略[7]。2010年上海世博园的各个体系结构完美地呈现了全球“智慧城市”的高新水平,一跃领先于国内其他城市[8]。尽管如此,国内三维智能数字化社区建设的研究仍然处于初始阶段,还不能形成完整的体系结构,在现实的实践中也缺乏能够借鉴的成功案例[9]。
1 需求分析与系统设计
1.1 需求分析
传统的社区管理主要是通过人为的物业管理和工作人员在社区内实地工作,需较多的劳动力,并且存在工作效率低下的问题,社区工作难以有效推进。而智能社区三维展示系统可以使社区管理者对社区进行合理有效的管理,让社区管理趋向于三维智能化、可视化,与此同时也可以为社区的居民提供更智能、便捷的社区公共服务[10]。
智能社区三维展示系统包括社区场景模型、虚拟漫游功能、社区每栋楼每一单元信息查询、社区路灯智能管理、社区导航定位功能、社区语音介绍等模块。
1.2 系统设计
智能社区三维展示系统的三维场景模型是通过3ds Max建模软件制作完成的。虚拟漫游通过Unity 3d引擎的第一人称角色控制器组件来实现,通过键盘与鼠标来控制视角,从而实现在虚拟场景中漫游的效果。社区路灯智能管理为社区管理者提供三维可视化查询功能,实现社区中所有路灯的位置定位和基本属性信息的查询功能。社区语音介绍功能是在社区系统中实现语音播放功能,给用户听觉上的享受,从而对社区有进一步的了解。系统的总体框架如图1所示。
图1 智能社区三维展示系统的总体框架
系统实现的基本流程如下:
(1)利用3ds Max软件对社区的地物进行建模。
(2)把模型导入到Unity 3d引擎中,添加环境光,设置阴影显示,从而使整个三维场景都能有阴影的效果,增加真实感。
(3)通过第一人称角色在智能社区三维展示系统中实现漫游功能。
(4)通过数据库和编程实现社区中每栋楼的每一单元住户信息查询显示和路灯位置定位以及基本属性查询功能。
(5)通过数据库和编程实现社区位置的导航定位和社区智能语音介绍的功能。
2 三维场景构建
三维模型是社区三维场景中较重要的一部分,三维模型利用3ds Max三维建模软件设计,其中后期的纹理贴图则直接影响到模型的真实度[11]。模型不能过于简单,过于简单的模型的面数会很少,不能展示模型的许多细节,最终导致的结果就是模型失真;但是建筑物的面数也不能太多,因为太多的面会加重模型渲染负担。这样到最后会有很多高精度的模型组合在一块,用户在客户端进行漫游时就会产生卡顿现象,进而影响用户的真实体验效果[12]。在智能社区三维展示系统中需要建立的模型有社区住户单元楼栋、路灯、垃圾桶、地形以及其他社区公共基础设施的三维模型等。对于那些简单的规则建筑物,可直接用纹理贴图来制作完成,建立简单的模型;而对于那些比较复杂的模型,就需要进行比较复杂的建模,所以需要通过大量的面片来表现真实的建筑物。
2.1 模型制作
根据收集到的信息在3ds Max软件中进行模型的制作,建立社区中每栋楼的外观。根据楼栋外观创建出样条线拉出楼层,还有社区中的一些公共设施的模型,如路灯、社区垃圾桶等。把前期处理后的照片纹理赋予模型,展示社区的完整真实面貌。
2.2 模型导入
不同软件建立的模型导入到Unity 3d中都要求一定的格式,3ds Max软件建立的模型要以FBX文件格式才能导入,模型导入可能会造成模型贴图的丢失,所以将模型从3ds Max中导出时需要注意以下问题:
(1)嵌入的媒体:如果不选择该项,3ds Max对模型的导出不包括贴图资源,只有贴图路径的引用,不能真正地导出含有贴图的模型,贴图的资源路径和名称也不能是中文。
(2)单位设置:默认情况下,3ds Max软件导出的模型再导入Unity 3d中模型尺寸放大了100倍。因此可以在Unity 3d下Inspector面板中修改Scale Factor的值进行调整。还可以在3ds Max建模时设置基本单位为厘米。
(3)轴心设置:3ds Max导出的模型导入到Unity 3d中总会出现轴向不符合要求的情况,要经过一定的旋转。查阅相关的资料发现,模型导入后轴向会自动偏转,在Unity 3d中y轴是朝上的[13]。所以在导出时选择轴转向为z轴向上。最重要的是在模型导出时进行相关的设置。
2.3 虚拟场景构建
在整个智能社区三维展示系统的建立过程中,可以在制作三维模型的同时,将模型导入到Unity 3d软件中,这样做的目的是可以及时查看制作出的模型导入后的效果。把模型导入到Unity 3d引擎软件之前,首先需要把场景中用到的所有贴图全部导入到系统相应的文件夹下,然后在Unity 3d的模型库中选择适合的模型,调整尺寸以及颜色。在智能社区三维展示系统的构建制作过程中,可以修改调整建筑物周围的环境属性以及场景属性,还可以进一步调整光源的方向、强度以及阴影效果的强弱和抗锯齿效果等。整个智能社区三维展示系统的设置都是为了提高校园漫游的体验感和用户的真实感。
导入角色资源包,把第一人称角色控制器(Rigid body FPS Controller)组件拖入到网格层次面板中,调整角色的位置和视角,以便场景进入到角色的视角中。主要用到的组件有Transform、Rigid body、Capsule Collider、Rigid body First Person Controller,在这些组件中修改前进的速度、爬坡的高度等参数,使角色能够在场景中漫游。Capsule Collider是碰撞器,可以设置碰撞器的半径和宽度,要想模型在场景中发生碰撞,在导入其他三维模型时选中模型,在检视面板中的Generate Collider打钩,并选择Apply,这样在角色控制器碰到其他物体时无法穿过。另外,角色控制器组件默认情况下移动鼠标会旋转视角,这在某种情况下会带来很多的困扰,所以要修改Mouse Look脚本,实现检测到鼠标左键按下时才旋转视角,在Look Rotation()方法中当按下鼠标左键为真时执行函数,其添加第一人称控制器及其碰撞。
主要功能代码如下:
float yRot=CrossPlatformInputManager.GetAxis("Mouse X")* XSensitivity;
float xRot=CrossPlatformInputManager.GetAxis("Mouse Y")* YSensitivity;
m_CharacterTargetRot*=Quaternion.Euler(0f,yRot,0f);
m_CameraTargetRot*=Quaternion.Euler(-xRot,0f,0f);
if(clampVerticalRotation)
m_CameraTargetRot=ClampRotationAroundXAxis(m_CameraTargetRot);
if(smooth)
{
character.localRotation=Quaternion.Slerp(character.localRotation,m_CharacterTargetRot,
smoothTime* Time.deltaTime);
camera.localRotation=Quaternion.Slerp (camera.localRotation,m_CameraTargetRot,
smoothTime* Time.deltaTime);
}
else
{
character.localRotation=m_CharacterTargetRot;
camera.localRotation=m_CameraTargetRot;
}
在三维智能社区中,存在着如垃圾桶、路灯、水电表、水龙头等一系列的社区基础设施。随着公共基础设施的日益增多,传统的社区管理方式会暴露出效率低下、浪费大量劳动力资源等问题[14]。这些方式不能对设备进行智能有效的管理,人工釆集的数据会存在误差,无法实现设备的统一管理[15]。在此背景下,三维虚拟社区应运而生,它集合社区的规划、智能化管理以及居民的生活状况为一体[16]。三维虚拟社区是数字化社区的重要内容,它突破了现实空间的局限性,能够直观形象地展示三维社区场景。该系统以社区中的楼栋单元、垃圾桶、路灯作为管理基础,并且能够查询和展示每个单元的住户信息以及路灯基本属性信息,从而实现社区设施的智能化管理。另外,系统还实现了社区的导航功能,可节约住户时间。
3 系统功能展示
3.1 路灯导航定位及属性查询功能
3.1.1 路灯导航定位功能
该系统是通过手动输入社区路灯具体编号来实现查询的功能,图2是查询系统的初始化界面。根据社区物业给路灯的不同编号,手动输入路灯编号后,系统会自动跳转至该对应路灯下,实现路灯的定位功能。
图2 进入查询系统界面
主要功能代码如下:
GameObject.Find("RigiBodyFPSController").transform.position=GameObject.Find("deng/"+inputfield.text).transform.position;
3.1.2 路灯属性查询功能
路灯基本属性功能查询的实现,首先属性信息的显示是通过数据库系统实现的,在数据库中创建Streelight表(见图3),输入NO(路灯编号)、Power(路灯功率)、Lifelength(路灯使用寿命)、Changeovertime(路灯更换时间)等属性信息。再通过Query脚本实现路灯基本属性查询的功能。
主要功能代码如下:
public Text text1;
图3 Streelight属性表
public Text text2;
public Text text3;
public Text text4;
public InputField inputfield;
public Imageaaaa;
private GameObject Roadlight;
public GameObject person;
private Vector3 offset;
static string path="Data Source="+"C:/Users/用户名/Documents/New Unity Project/Assets/mydatabase2.sqlite";
SqliteConnection connection = new SqliteConnection(path);
private bool IsFind=false;
void Start()
{
offset=new Vector3(0,50,30);
}
public void Load()
{
GameObject.Find("RigidBodyFPSController").transform.position=GameObject.Find("deng/"+inputfield.text).transform.position;
//建立一个连接
connection.Open(); //打开连接
SqliteCommand command=new SqliteCommand(connection);//建立一个对连接的管理
stringstr="select ID,No,Power,Lifelength,Changeovertime from Streetlight";//
command.CommandText=str;
SqliteDataReader reader=command.ExecuteReader();
while(reader.Read())
{
if(inputfield.text==reader[1].ToString())
{
text1.text=reader[1].ToString();
text2.text=reader[2].ToString();
text3.text=reader[3].ToString();
text4.text=reader[4].ToString();
aaaa.gameObject.SetActive(true);
break;
}
}
connection.Close();
}
3.2 社区单元住户信息查询
该系统的社区楼栋属性查询是直接通过鼠标点击社区楼栋社区中的每栋单元楼,系统会直接查询该楼栋单元的,例如该楼栋单元ID、业主名字、老人数量、小孩数量以及租户数量等。其中住户信息的显示是通过数据库实现的,再通过QueryClass脚本实现楼栋基本属性查询的功能。
主要功能代码如下:
public staticQueryClass instance;
public UILabel labID;
public UILabel labzhuhu;
public UILabel lablaoren;
public UILabel labxiaohai;
public UILabel labzuhu;
static string path1="Data Source="+"G:/论文/mydatabase3.sqlite";
SqliteConnection connection1=new SqliteConnection(path1);
private bool IsFind=false;
void Start()
{
instance=this;
}
public void Load(string tag )
{
//建立一个连接
connection1.Open();//打开连接
SqliteCommand command=new SqliteCommand(connection1);//建立一个对连接的管理
stringstr="select NO,zhuhu,laoren,xiaohai,zuhu from shuxing";//
command.CommandText=str;
SqliteDataReader reader=command.ExecuteReader();
while(reader.Read())
{
if(ta ==reader[0].ToString())
{
labID.text=reader[0].ToString();
labzhuhu.text=reader[1].ToString();
lablaoren.text=reader[2].ToString();
labxiaohai.text=reader[3].ToString();
labzuhu.text=reader[4].ToString();
break;
}
}
connection1.Close();
}
}
3.3 社区单元导航定位功能
社区内导航定位功能使用户能够准确地定位社区每个单元的位置。该系统的位置导航功能有两种:一种是通过下拉框的形式,准确定位社区中每栋单元楼的位置,以第一人称的视角带领用户沿着最近路线走到单元楼下;另一种是通过鼠标直接点击目的地,系统会直接导航到终点位置;最终实现导航定位功能。
主要功能代码如下:
private UnityEngine.AI.NavMeshAgent agent;
public UILabel pop;
private string lab;
public GameObject pos1;
public GameObject pos2;
public GameObject pos3;
void Start () {
agent=GetComponent
}
void Update () {
if(Input .GetMouseButtonDown(1) )
{
Ray ray=new Ray();
Ray=Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray, out hit))
{
Vector3 pos=hit.point;
pos.y=transform.position.y;
agent.destination=pos;
}
}
if(pop.text=="fiveth")
{
Ray ray=new Ray();
ray=Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray, out hit))
{
agent.destination=pos2.transform.position;
}
}
if(pop.text=="ninth")
{
Ray ray=new Ray();
ray=Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray,out hit))
{
agent.destination=pos3.transform.position;
}
}
}
}
3.4 社区语音智能介绍
在Unity 3d平台上,通过播放一段关于金城湾社区的背景语音说明,从而能够更加具体地了解该小区,并且能够给人们一种听觉上的享受(手动按键盘“B”键为语音的播放键,“P”键为语音的播放暂停键)。
主要功能代码如下:
if(Input.GetKeyDown(KeyCode.B))
{
Sound.instace.PlayBG("ef2");
}
if(Input.GetKeyDown(KeyCode.N))
{
Sound.instace.PlayBG("bg2");
}
if(Input.GetKeyDown(KeyCode.KeypadPlus))
{
Sound.instace.BGVolume+=0.1f;
}
if(Input.GetKeyDown(KeyCode.KeypadMinus))
{
Sound.instace.BGVolume-=0.1f;
}
if(Input.GetKeyDown(KeyCode.P))
{
Sound.instace.BGMute();}
3.5 功能实现与概述
系统主要设计了社区每个单元和路灯的智能导航及属性信息的显示、智能语音介绍等功能,在Unity中做好发布的准备后点击Build按钮,选择发布的位置,Unity会在相应的文件夹下生成一个数据文件夹和一个.exe可执行的文件。点击.exe文件运行生成金城湾社区智能社区三维展示系统,系统可以很好地运行,而且操作界面友好。
以下是智能社区三维展示系统的相关功能展示。
(1)路灯位置查询功能。
输入要查询的路灯ID,系统即可自动定位到目标的路灯位置。例如,路灯004的位置定位效果,如图4所示。
(2)路灯属性信息查询功能。
在找到的目标路灯上,右键点击路灯,即可查询路灯的编号、功率、生命周期和上次更换的时间等相关信息。例如,路灯005的属性信息查询,如图5所示。
图4 路灯004的位置查询
图5 路灯005属性查询
(3)社区单元住户信息查询功能。
在需要查询的单元住户信息的单元上,直接通过鼠标点击社区楼栋社区中的单元楼,即可查询该楼栋单元的单元ID、业主名字、老人数量、小孩数量以及租户数量等。图6所示为9号单元楼的住户信息。
图6 9号单元楼的住户信息
(4)社区单元导航定位功能。
一种通过下拉框的形式,准确定位社区中每栋单元楼的位置,以第一人称的视角带领用户沿着最近路线走到单元楼下;另一种通过鼠标直接点击目的地,系统会直接导航到终点位置;最终实现导航定位功能。
(5)智能社区语音介绍功能。
运行系统后,系统会自动播放金城湾社区的语音介绍背景音乐,增加系统的趣味性。
4 结束语
通过使用Photoshop图片处理软件处理纹理贴图,3ds Max三维建模软件制作社区建筑物、地形、树木等社区的三维模型,Unity 3d三维引擎软件对整个场景进行后期编辑、导航定位、属性查询功能开发,构建智能社区三维展示系统。该系统不但可以让用户在计算机上通过地面浏览进行漫游,还可以实现对社区楼栋每个单元住户的信息显示和路灯位置属性信息的查询及显示,使用户在虚拟漫游系统中有很强的真实感。该系统一定程度上减轻了管理人员的工作强度,提高了工作效率,但仍需对系统的界面和功能进行进一步的改进和完善。