基于手持移动设备的虚拟装置教学系统
摘要:作为虚拟现实的应用,虚拟装置教学系统已经在各领域得到了广泛的应用。鉴于移动设备飞速发展的趋势,该系统根据PRT格式导出的机械模型,通过3DMAX转换后,使用Unity3D、SQLite等一系列工具建立了面向移动设备的虚拟装置教学系统。最终,该系统能够在iOS端以及任意能够访问网页的浏览器上使用。用户获得虚拟现实身临其境的体验、丰富的交互的同时,移动化的访问让用户的学习达到了随时随地访问、充分利用碎片时间工程目标。
关键词: Unity 3D; 虚拟现实; 教学系统; iOS系统; WebGL
A Device-Training System Based웃 on Mobile Platform
LU Le,WEI Gang
(College of Electroniบc and Information Engineering, TongJi university, Shanghai 201804, China)
Abstract:As virtual reality applications, virtualization means teaching system has been widely used in various fields. Given the trend of rapid development of mobile devices, the system according to the mechanical model derived PRT format, through 3DMAX conversion using Unity3D, SQLite and some other tools to creat Key words: Unity 3D; VR; training system; iOS system; WebGL 1 引言 随着互联网技术的不断发展,人们获取信息以及学习的方式已经受到了巨大的影响。信息爆炸、现代社会化竞争压力增大等因素导致人们开始倾向于追求碎片化、实时性的交互方式。近年来,各领域已经展现出由已个人电脑为主转变到了今天以移动设备为主的趋势。另一方面,一直以来由于我国人口众多,基础教育资源不足等原因,实验教学在我国教育发展中相对薄弱。 此时,虚拟现实(Virtual Reality,VR)技术的出现,为教学提供了一种新的方式。虚拟现实技术已成为计算机应用行业的研究重点[1]。基于虚拟现实的虚拟装置教学,目的是在三维的虚拟空间中,对产品的结构、部件之间的关系等进行展示,并且提供可以人机交互的界面。不但增强教学的趣味性,还降低了设备、人工和场地等的成本。 2 虚拟现实技术相关软件 本项目主要使用的软件有Unity3D、Visual Studio 2010等。开发环境如表1所示。 Unity3D技术[2][3]可以让设计者轻松地创建一个三维视频,是一个建筑可视化,创建动画和其他类型的实时三维互动内容集成的多平台游戏开发工具,是一个完整专业的游戏引擎。Unity3D平台既可以创建工作流,同样也可以直接运行工作流,是一个一站式的解决方案平台。Unity3D的开发人员提供了看似简单的专业创意组合,但采用最先进的3D游戏引擎,你可以创建一个简短的令人惊叹的3D作品。Unity3D支持所有主要文件格式,支持JavaScript脚本语言和编程语言还支持IOS和Android平台的扩展,真正实现了跨平台。 SQLite[4]是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。 其特点是高度便携、使用方便、结构紧凑、高效、可靠。 NGUI是严格遵循KISS原则并用C#编写的Unity(适用于专业版和免费版)插件,提供强大的UI系统和事件通知框架。其代码简洁,多数类少于200行代码。这意味着程序员可以很容易地扩展NGUI的功能或调节已有功能。对所有其他用户而言,这意味着更高的性能、更低的学习难度和更加有趣。℉ PrimitivesPro是Unity Assets Store中协助程序建模的一个高级插件包。它包含18个程序脚本,可以实现高性能网状切割机和布尔运算功能。其中没有预制体,直接由代码产生所需的功能及GameObject。用户可以在运行时检查和修改参数。 3 系统总体框架设计 3.1 需求分析与模块设计 根据装置教学的需求,本系统可分为设备浏览、零件浏览、子部件局部视图和剖切模块。 3.1.1 设备浏览、零件浏览模块 用户可以选择某个特定的设备进行拆装、浏览,查看介绍,并对设备各个零部件学习。本项目采用以下操作浏览设备模型: 1. 滑动鼠标滚轮对模型设备放大缩小 2. 鼠标移动到某部件对其进行高亮处理 3. 鼠标左键选中某部件可以对其进行平移 4. 鼠标右键可调出对应该部件的菜单 3.1.2 子部件局部视图模块 对于用户想要深入观察的子部件,可将其单独拿出至另一个界面观看。在观看时,可对子部件中的每个小部件进行自由移动、旋转、拆装。在这个模块,用户可以深入学习这个子部件的结构。 3.1.3 零件信息展示和编辑模块 在主视图中,通过鼠标右击,可选中子部件并观看、修改其属性。当用户选择“部件属性”时,我们使用NGUI控件绘制一个可交互的窗体。在这个窗体用户可以浏览学习这个部件的属性。点击“编辑”按钮进入编辑界面。对这个部件的属性进行修改,并存入数据库中,以便后期查阅。 3.1.3 剖切模块 剖切功能借助Unity插件PrimitivesPro实现,需要目标GameObject包含meshfilter。用户右键点击指定部件,在其右键菜单中选择剖切,可以进入到部件的剖切功能。用户可以通过参数设置,选择三点来形成固定剖切面,也可以选择一点,随机生成一个通过该点的任意剖切面,通过参数修改可以调整剖面的位置。对于切割后的部件,用户可以设置切割部分之间分开的间距,也可隐藏其中一部分,便于观察切面细节。 3.♪2 技术路线 本项目的开发难度主要集中在复杂机械模型的加工和处理上。由于用户提供的样本模型“390多流体接头”的格式不能被Unity3D正确地打开,在本工程中我们把格式转化成通用模型格式FBX。导入Unity工程后,为了让经过转换的模型变得可操作,我们还需要对其做进一步预处理。得到处理过的模型以后,采用软件工程的思想进行Unity3D开发,在PC端调试完成后,做最后的移植工作。 4 虚拟装置教学系统实现的关键技术 4.1 模型的导入和预处理 FBX的模型导入到Unity工程中,产生的主要问题有:1. 装置的锚点偏移。2. 转换后的模型中,层次嵌套层数非常多。 于是,我们对模型进行手工的预处理。第一步,是对于本工程不需要的逻辑层级进行剔除。只保留原来模型中有Mesh render的部分,并且大幅减少他们的层次嵌套关系。第二步,根据对390多流体接头的特性分析,我们选择了约60个合适大小的子部件进行分类,作为用户鼠标单击选择的最小单元。第三步,为了能够对子部件进行操作,我们需要为子部件加入Colider和Mesh Render属性。对于Colider属性,我们采用手工添加的方法,保证每个子部件的Colider的大小比较接近模型实际大小。对于Mesh Render属性,由于这是支持模型高亮和剖切的关键属性,手工添加的方法不能满足要求。我们使用遍历每个最小的零件,然后从模型的角度,将它们拼合,成为一个单独的Mesh。 4.2 模型的拖动、旋转等交互功能的实现 对于用户通过鼠标点击来对模型、以及模型的零部件进行操作,我们通过从鼠标的位置发射一条射线,并检测射线与部件的碰撞Colider实体是否接触。 于是我们需要为单个部件增加Box Colider属性,并调整期大小,使之跟用户看到的模型大小匹配。对于子部件,我们选取比较大小的颗粒度,把一部分有逻辑联系的子部件合成为一个部件,为其增加Box Colider属性。 给所有需要点击的模型加入Box Colider后,我们为这些部件增加Click Move、Click Rotate等脚本,让它们支持鼠标选择。对于用户点击后动态生成的子部件,我们在点击的动作中,动态为其加入这些功能性脚本。Click Move脚本主要的任务除了得到当前物体,另外一个任务是用户看到的屏幕和鼠标2D坐标和实际的3D空间坐标以及方向的转换。限于篇幅,仅展示Click Move脚本核心代码: [ IEnumerator OnMouseDown() { Vector3 ScreenSpace = Camera.main.WorldToScreenPoint(transform.position); Vector3 offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.m⌘ousePosition.x, Input.mousePosition.y, ScreenSpace.z)); while (Input.GetMouseButton(0)) { Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, ScreenSpace.z); Vector3 CurPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset; transform.position = CurPosition; yield return new WaitForFixedupdat } } ] 4.3 移动设备的移植 由于Unity3D的跨平台跨平台的特性,项目可以被导出、编译为移动设备可以执行的代码。通过Unity3D的工程编译页面,我们可以看到丰富的输出平台选择。只要我们在Unity3D安装时,选择了相应的依赖包,我们就可以把工程移植到对应的平台。对于手机端来说,主要有以下三点与普通的PC平台不同: 1. 屏幕分辨率不同。由于手机屏幕分辨率的多样性,在工程实施阶段需要考虑到比较小的分辨率的情况。在本工程中,我们把分辨率限制在1024*768的范围内,以兼容低端手机,确保在各个终端都有比较好的显示。 2. 输入方式不同。本工程在PC端主要使用鼠标与系统交互,而手机上的输入设备是触摸屏。于是,我们需要对鼠标的操作映射到触摸屏的相关操作上。在Unity3D中,调整相关设置,将触摸点击映射为鼠标左键,双指触摸映射为鼠标右键,即可完成适配。 3. 移动设备的计算能力不同。虽然本项目没有用到太多的计算资源,对于某些低端手机,仍然可能由于性能的不足造成一定的卡顿。所以,在移动设备上,我们降低了3D效果的质量,减少对设备性能的要求。实际测试来看,效果令人满意。 4.3.1 导出及编译iOS工程 Unity3D的扩展包帮助我们把C#的源代码以及项目需要的库函数编译成C++语言。编译后,工程被输出为以C++描述的Xcode工程。用Xcode打开编辑工程,仍需要对工程的包ID、代码签名、设备适配等进行进一步配置,如下图所示。编译这个工程并部署到iPhone以后,就可以正常运行了。 4.3.2 导出为WebGL网页 很多时候,网页的灵活性要比手机上的app更好,用户不需要特定的地方下载并且经历漫长的等待。只要打开链接,就可以尝试内容。所以,把项目移植到网页也是本项目的重要内容。 如上文所述,Unity3D可以简单地导出可用于本机打开的HTML文件包,运行效果如图8所示: 为了让用户能够在各地访问这个页面,我们需要组建一个Web服务器以供访问。 1. 本项目采用阿里云的ECS虚拟主机,由此我们可以得到一个唯一的公网IP地址。 2. 在虚拟主机上下载Apache网页服务器程序,并对其进行配置,让其默认载入本项目的index.html文件 3. 如有需要,可以为这个IP地址购买相应的域名服务,增加可维护性。本项目由于是企业内部使用,仍使用IP地址进行访问。 5 结束语 可以预见的是,随着移动设备计算能力以及人机交互技术的不断创新和增强,移动设备将会越来越成为人们工作、学习生活中不可或缺的角色。软件工程的项目在策划伊始就开始考虑对于移动设备的兼容将会是未来的趋势。本系统通过使用简单、画面精美的人机交互,展示了在移动设备上进行高难度机械设备教学的可能。让用户能够无论身处何地,都能利用自己的碎片时间进行设备浏览和学习,对虚拟现实的推广起到了积极作用。 参考文献: [1] 赵德彩. 山东科技大学三维虚拟校园系统设计与实现[D].青岛:山东科技大学,2013 [2] 于文洋,杨崇俊. 三维虚拟城市景观基础平台的设计与实现[J]. 计算机工程. 2006(02) [3] 徐伟,陈新. 三维可视化技术在现代医学中的应用[J]. 计算机与现代化. 2007(06) [4] 韩太东,卢秉亮,朱健,房玲玲. 嵌入式数据库SQLite在Windows程序中的应用[J]. 沈阳航空工业学院学报. 2009(04)