谢新慧 司占军 尚博
摘要:该研究实现了基于移动终端的家居互动展示系统。通过Auto CAD创建房屋的户型图,利用3d max创建建筑物以及所有家具的三维模型,并在Photo shop中对家具及建筑物贴图进行修饰,最后导入到unity中实现房屋漫游以及其他交互功能。在最终的展示系统中,用户可以任意进入家具城、品牌家具的网上展厅,并以第一人称的角度对家具城里的家具进行参观。同时,用户可以根据自己的意愿选择某个家具,对其进行移动,旋转等操作,实现近距离观看家具的功能。
关键词:虚拟现实;家具互动;房屋漫游
中图分类号:TP319 文献标识码:A 文章编号:1009-3044(2018)15-0209-03
随着科技飞速发展,人们的生活质量不断提高[1]。人们早已不能满足二维的平面世界,虚拟现实技术(VR技术)应运而生[2]。虚拟现实技术是把现实世界构建成一个新的3D虚拟立体模型,用户可以借用第三方设施或设备体验身临其境的处于所构建的3D模型中[1]。VR技术打破了很久以来的平面展示系统的限制,它利用自己所创建的立体仿真环境的优点在很多领域占有一席之地。比如现在的房地产业,客户看到的不仅仅是简单的户型图,或者是房屋的室内照片,而是以第一人称的视角,真正进入到自己喜欢的房屋内进行游览、观看。对房屋的各个部位和角落都可以清楚地了解。另外,对家具的摆放和布局也可以有一个清楚地了解。
基于移动终端的家具互动展示系统,顾名思义,就是把某一个户型和家具在移动终端上展示出来的系统[2],这里的移动终端可以是平板电脑,手机等。在向用户展示的过程中,用户可以完成与家具的简单交互,比如对家具进行简单的移动,旋转等。在该系统中,人们可以全方位地了解自己喜欢的户型,并且对户型里面的家具也可以有比较明确的了解。
1 开发环境与软件
制图环境: Windows 8系统,Intel(R) Core(TM)i7 CPU ,4G内存,64位操作系统
建模环境:Windows 8系统,Intel(R) Core(TM)i7 CPU ,4G内存,64位操作系统
开发环境:Windows 7系统,Intel(R) Core(TM)i7 CPU ,4G内存,64位操作系统
制作软件: Auto CAD 2014、3ds Max 2014、Unity 5.6.1f1 (64-bit)、Photo shop cc
2 设计思路
首先进行市场调研,了解虚拟家装的应用市场,确定所要建立的户型结构以及搜集相关的贴图素材。然后在3ds Max中进行建模并实现相应的渲染效果。在Unity3D中实现后期交互功能,并进行发布及性能的測试。
3 设计与实现
3.1 前期准备工作
对整个虚拟家装市场进行调研,根据市场需求制定出相应的策划方案。同时通过书籍的查阅和互联网查询来收集相关贴图和模型素材,并下载相关软件,储备相关知识,为后期制作做好充分准备[3]。
3.2 房屋模型的构建
房屋模型构建过程分为三部分,房子的户型建立、门窗的建立、家具及电器模型的建立。
房子的户型建立。首先在3D MAX设置毫米为基本单位。然后,将CAD户型图拖入3D MAX的透视图中,先描轮廓,并选择校准工具将描好的轮廓进行校准,使用捕捉工具将所有点的横坐标和纵坐标对齐到一个点上。将户型图描好并且校准之后,选中户型图,右键选择“转换为可编辑多边形”,然后选择“边”工具,随后选择“挤出”工具,将户型挤出为立体状,高度设置为2550mm,房屋的墙体则建立完毕。如图2所示。
门窗的建立。在建立门模型时,为了整个门呈现动态,需要制作为打开的状态,首先要选中这个门,利用“捕捉”工具,将门旋转,并且移动到门框的边上,即可实现。如图3所示。在建立窗户时,关键在于玻璃材质的参数设置,为了渲染出逼真的玻璃效果,在这里要指定Vray渲染器并选用Vray材质。具体参数如下:漫反射设置为116,141,196;反射参数为22,22,22;反射高光为0.95;折射参数为200,200,200;折射光泽度为0.9。
部分家具及电器模型的建立。为了在展示系统中呈现逼真的效果,家具的建模需要精细一些,对每个家具进行建模之前要了解其构造,进行有步骤有层次地建模过程。如图4所示是制作完成的椅子。
3.3 模型的贴图重建
在家具互动展示系统中,主要对以下四部分进行贴图:房屋内部墙体的贴图、门和窗户的贴图、所有的家具以及部分电器的贴图以及地面的贴图。贴图需要“材质编辑器”命令来实现。在3D MAX中可以执行“渲染”—“材质编辑器”命令,或者在主工具栏中单击“材质编辑器”命令按钮。目前材质编辑器有“材质编辑器”和“Slate材质编辑器”两种。在这里使用“精简材质编辑器”,然后将提前搜集好的贴图素材赋予不同的模型,实现最终的贴图效果。
3.4 场景设计与相关脚本的编写
将模型导入到unity中后,可能会存在贴图大量丢失等问题,这时就需要进行重新贴图。首先在assets文件夹的models文件夹下建立新的文件夹,命名为materials,然后把所有贴图素材放在文件夹里面,用英文名称命名。完成之后,将materials贴图文件夹复制到unity的根目录下,然后再导入由3D MAX生成的 fbx格式的文件,模型就自动恢复成先前的贴图。
建模过程和贴图渲染过程结束后,需要在Unity3D中实现房屋漫游和交互效果。房屋漫游是第一人称摄像机的自由移动过程,在该过程的设置中要注意的是房屋和家具要设置“碰撞”效果,这样可以防止人物的“穿墙”效果和“掉落”现象。交互过程是用户和家具的交互,用户可以通过点击家具实现家具的简单移动和旋转[4]。而漫游和交互功能需要通过编写脚本代码来实现,脚本如下:
1)漫游腳本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveObject : MonoBehaviour {
public Vector3 pos;
public Quaternion rot;
// Use this for initialization
void Start () {
pos = this.transform.position;
rot = this.transform.rotation;
}
}
2)交互效果脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour {
public GameObject OBJECTS, PROPS, target, btn_quit;
public Transform this_cam;
public Rigidbody this_rigid;
public EasyJoystick stick_move, stick_rotate;
public bool isMobileControl = false, canMove = true;
private Vector3 pos;
private Quaternion rot;
private float speed = 3.0f, sideSpeed = 1.5f;
// Use this for initialization
void Start () {
pos = this.transform.localPosition;
rot = this.transform.localRotation;
}
// Update is called once per frame
void Update () {
if (!isMobileControl)
MovePlayer ();
Shoot ();
}
private void MovePlayer(){
if (canMove) {
Screen.lockCursor = true;
if (Input.GetKey (KeyCode.W)) {
this.transform.Translate (Vector3.forward * speed * Time.deltaTime);
} else if (Input.GetKey (KeyCode.S)) {
this.transform.Translate (Vector3.back * speed * Time.deltaTime);
}
if (Input.GetKey (KeyCode.A)) {
this.transform.Translate (Vector3.left * sideSpeed * Time.deltaTime);
} else if (Input.GetKey (KeyCode.D)) {
this.transform.Translate (Vector3.right * sideSpeed * Time.deltaTime);
}
} else {
Screen.lockCursor = false;
}
}
private void Shoot(){
if (Input.GetMouseButtonDown (0)) {
Ray ray = new Ray();
RaycastHit hit;
if (!isMobileControl) {
ray = new Ray (this_cam.position, this_cam.forward);
} else {
ray = this_cam.transform.GetComponent
}
if (Physics.Raycast (ray, out hit, 100.0f, ~(1 << 5))) {
if (hit.collider.transform.GetComponent
target = hit.collider.gameObject;
OBJECTS.SetActive (false);
for (int i = 0; i < PROPS.transform.childCount; i++) {
PROPS.transform.GetChild (i).gameObject.SetActive (false);
}
target.SetActive (true);
btn_quit.SetActive (true);
canMove = false;
this_rigid.useGravity = false;
this_rigid.isKinematic = true;
stick_move.XAxisTransform = target.transform;
stick_move.YAxisTransform = target.transform;
stick_rotate.XAxisTransform = target.transform;
stick_rotate.YAxisTransform = target.transform;
} else if (hit.collider.tag == "UI") {
return;
}
}
}
}
public void QuitEditMode(){
target.transform.position = target.transform.GetComponent
target.transform.rotation = target.transform.GetComponent
target = null;
//this.transform.localPosition = pos;
//this.transform.localRotation = rot;
OBJECTS.SetActive (true);
for (int i = 0; i < PROPS.transform.childCount; i++) {
PROPS.transform.GetChild (i).gameObject.SetActive (true);
}
btn_quit.SetActive (false);
canMove = true;
this_rigid.useGravity = true;
this_rigid.isKinematic = false;
stick_move.XAxisTransform = this.transform;
stick_move.YAxisTransform = this.transform;
stick_rotate.XAxisTransform = this.transform;
stick_rotate.YAxisTransform = this_cam;
}
}
3.5 测试及发布
功能实现后在工具欄中点击“播放”按钮进行场景的初步测试,观察模型与贴图是否符合实际情况[5]。保存之后,使用快捷键“CTRL+ALT+B”, 导出“EXE”文件。然后运行“EXE”文件,测试软件是否能够正常运行,同时注意内容是否完整以及所有的功能是否都能实现。在检查无误后,选择文件左上角的file工具栏,点击Build Settings,然后点击Android,把作品发布到Android手机上。
4 总结
本设计利用Auto CAD 、3ds MAX、Unity3D软件对家具展示系统App进行设计及开发,实现了家具的虚拟交互展示[6]。在后续开发中,可以使用VR眼镜,达到更好的沉浸式的漫游体验。基于Android平台的App应用程序,让使用者可以更生动和直观的展示家具工艺、造型、装饰等艺术风格。
参考文献:
[1] 石宁. 浅谈建筑施工管理创新策略[J]. 房地产导刊, 2015(34).
[2] 赵鹏程. 虚拟现实中三维动画建模方法的研究[J]. 信息与电脑, 2016(19): 59-60.
[3] 张姣姣, 董明治, 司占军. 儿童三维互动读物的设计与制作[J]. 电脑知识与技术, 2017.
[4] 唐蕾, 林作新, 张亚池. 家具产品互动设计中的行为本质研究[J]. 家具与室内装饰, 2016(10): 20-23.
[5] 董春侠, 司占军. 基于Unity3D的虚拟校园App设计与开发[J]. 软件导刊, 2017(2): 94-96.
[6] 郭海新. 基于Unity3D的在线家具展示系统的实现[J]. 商情, 2017(47).