于 海 霞
(合肥职业技术学院,安徽 合肥 230000)
室内设计是当前比较热门的行业,传统的室内设计大多是以电脑效果图、样板间或沙盘模型等形式向用户展示设计效果,但它们都有不易修改的缺陷。如果用户提出不同的设计意见,设计师无法进行实时修改,增大设计师工作强度[1],且除了样板间,其他设计方式缺少身临其境之感。如何解决这些不足,成为设计行业面临的共同问题。
虚拟实境技术的不断发展和成熟为室内设计的转型提供了更好的平台和发展空间,利用虚拟技术进行室内设计是一种新的尝试[2]。Unity3-D引擎是由Unity Technologies公司开发的能够支持多平台发布的专业虚拟现实引擎,可使开发周期大幅度缩短[3]。
本文介绍基于Unity3-D的虚拟室内设计展示系统的设计理念、主要功能的实现及运行效果,在该平台上可以进行室内漫游,根据用户要求对室内设计效果实时进行修改,提高用户体验度和满意度,同时提高设计公司的工作效率,降低工作成本。
虚拟室内设计把传统的设计图纸变成看得见的虚拟物体和环境,使以往传统的设计模式提升到数字化的所见即所得的完美境界。三维立体造型画面感逼真,立体感和真实感强烈,大大提高了设计和规划的质量与效率[4-6]。
虚拟室内装饰展示系统应用Unity 3-D引擎进行开发。设计者可以完全按照用户的构思构建和装饰虚拟的房间,并可以任意变换用户在房间中的位置,观察设计效果,实时更改直到满意为止,既节约了时间,又节省了做模型的费用[7-9]。
虚拟室内装饰展示系统注重交互,用户可在虚拟空间中进行漫游查看设计效果,并可以通过点击进行交互操作。系统的主要功能如图1所示。
漫游功能提供了自动漫游和主动漫游2种方式。自动漫游是系统按预先设定好的路线引导用户进行室内浏览,不需要用户操作;主动漫游是用户通过键盘操控按照自己的意愿进行浏览。
交互功能为用户提供了与室内设计交互的接口,用户可以按照自己的喜好对现有的设计结果进行调整,包括更换房屋的壁纸或地板样式、改变家具摆放的位置或摆放方式及移除不喜欢的家具、添加心仪的家具。
交互设计是一种目标导向设计,所有的工作内容都围绕着用户行为去设计。目的在于让用户更沉浸、更方便、更有效率去完成他们预期的操作,获得愉快的用户体验。交互设计不仅丰富了室内设计的样式,更提高了用户的体验感,与家具的交互更是能让用户如身临其境,在虚拟样板间中设计出心目中的家,真正感受到对房间的掌控权,感受拥有真实房间的日常生活状态。
图1虚拟室内设计系统功能 图2虚拟室内装饰展示系统设计流程
虚拟室内装饰展示系统设计流程如图2所示。
首先根据户型图使用3-D MAX进行模型的创建,将3-D MAX单位改成m或cm,有利于建模时对真实距离的掌握[10],完成系统建模和贴图,并导出FBX文件。
进入Unity3-D导入模型,贴图并布置好灯光,进行场景渲染,然后进行系统功能设计,包括设置摄像机、创建UI布局、编写交互及UI功能脚本。最后进行测试,通过后发布。
漫游系统是虚拟现实的灵魂,是用户接触的第一视角。系统提供了自动漫游和主动漫游2种方式。自动漫游不需要用户操作,系统按设定好的路线引导用户观赏。主动漫游即用户通过键盘光标键或WSAD4个键控制漫游方向,实现对室内场景多角度、全视野的游览。
无论哪种漫游方式,碰撞交互是必要的属性之一,主要防止摄像机的穿模、自主下落及弹性碰撞等。因此需要设置1个虚拟碰撞体,用来检测摄像机碰到墙壁、家具等其他模型的一些物理反应[4]。
用户在漫游的过程中,可以根据自己的需要或喜好对室内装饰进行变动,包括更换墙纸或地板的样式、家具的位置或摆放方式,也可以移除家具或添加一些家具。
2.2.1 更换墙纸或地板
用户在需要更换的墙纸或地板上点击鼠标,弹出是否需要变更的对话框,确定后,就可以在弹出的样式中选择喜爱的样式,从而更换风格(图3)。
图3 更换墙纸和地板样式前后对比
以更换墙纸为例,为了实现上述功能,需要完成以下操作。
第一步:设置1个bool型全局变量button_down和take用于判定。
当button_down为true,则说明用户正在普通操作,当前可以对墙壁进行单击操作,如果单击墙壁后,令button_down的值为false,禁止其他操作,take的值也更改为false,表示更换墙纸时,家具不可以被更改。用户退出更换墙纸行为后,button_down、take值再恢复为true。
第二步:创建射线碰撞来单击触发的功能。
创建UIset的c#脚本,设置camera参数来获取主摄像机,单击墙壁后,为了不对用户的操作进行干扰,需令摄像机静止,不能再随着用户的控制而改变。设置GameObject型数组,用于存放即将调用的UI。从鼠标发射1条射线,射线所接触到的当前碰撞tag为wall时,则获取当前碰撞的物体,将摄像机固定,弹出是否更换墙纸询问对话框,确认更改后进行第三步。
第三步:创建ChangeWall的c#脚本。
设置GameObject类型数组,用于获取需要交互的壁纸模型,设置Texture类型数组,用于存储可更换的贴图。执行UISet.objects.GetComponent
2.2.2 移动或旋转家具
如果用户对某个家具的摆放位置不满意,可在家具上点击,在弹出的快捷菜单中选择“移动”或“旋转”后,按住鼠标拖动或旋转家具,满意后点击“确定”就可以变动家具的位置或摆放方式(图4)。
图4 移动家具前后对比
当鼠标移动到可交互的家具上时,改变鼠标光标。单击当前可交互家具后,关闭更换地板和墙纸的功能,获取当前单击鼠标的位置,并在当前位置绘制快捷菜单,当单击“移动”或“旋转”时,调用相应代码,并执行。以移动家具为例,首先获得鼠标在空间中的坐标,求出被移动家具与鼠标物体在空间中的偏移量,将鼠标坐标加上偏移量作为被移家具新的位置坐标,重复鼠标按下动作,直到释放鼠标为止。主要代码如下
MouseScreenSpace=new Vector3(Input.mousePosition.x,Input.mousePosition.y,TargetScreenSpace.z);
Offset=trans.position-Camera.main.ScreenToWorldPoint(MouseScreenSpace);
while(Input.GetMouseButton(0)){
MouseScreenSpace=new Vector3(Input.mousePosition.x,Input.mousePosition.y,TargetScreenSpace.z);
TargetWorldSpace=Camera.main.ScreenToWorldPoint(MouseScreenSpace)+Offset;
trans.position=TargetWorldSpace;//更新目标物体的世界空间坐标
yield return new WaitForFixedUpdate();//等待固定更新
}
2.2.3 添加家具
用户点击“添加家具”菜单,在弹出的子菜单中选择需要添加的家具或装饰物,将选中的物品添加到当前房间中(图5)。
图5 添加家具前后对比
事先在引擎中设定距离参数distance,设定家具与摄像机之间的距离,创建一个用于获取家具的物体cube,定义x、y变量,用来获取鼠标单击时的位置参数。clickP用于获取家具出现位置,通过调用Instantiate(GameObject,position)方法,在指定位置克隆出新的家具。主要代码如下
Void Update(){
.......
X=Input.mousePosition.x;
Y=Input.mousePosition.y;
clickP=Camera.main.ScreenToWorldPoint(new Vector3(x,y,distance));
Cube=GameObject.Find(“jj_name”);//jj_name为家具模型的名称
Instantiate(cube,clickP,Quaternion.identity);//在clickP位置处克隆出新的物体
}
2.2.4 删除家具
如果用户对现有的家具不满意,可在家具上点击鼠标,在弹出的快捷菜单中选择“删除”,确认后即可删除当前家具。只要停止渲染该家具就可以实现删除家具的效果(图6)。
图6 删除家具前后对比
虚拟实境技术是通过计算机将现实的物体虚拟化来构造世界,本文通过将室内设计与虚拟现实技术结合起来,开发了虚拟室内装饰展示系统,对室内设计效果进行仿真,设计效果良好,场景逼真,用户在使用过程中如身临其境。系统主要包括漫游和交互功能,重点模拟了用户与室内家具的交互过程,用户可按自己的要求随时变换设计的效果,进而提升用户的体验度与沉浸感,提高设计公司的工作效率,降低开发成本。
本系统功能只是对虚拟室内展示功能的初探,还有许多提升的空间,如增加家具的实现算法、可供选择的家具或地板墙纸的展示方式、家具在移动过程中的流畅性等,这些都是在后续工作中需要完成的任务。