前言
在工业设计和制造领域,零部件的拆装技术是一个重要的应用场景,比如我们在工程训练课程中经历的摩托车发动机拆装课程,是机械类学生的必修课程。虚拟拆装系统模拟和仿真了模型的拆装过程,虽然SolidWorks等机械设计软件能够解决特征配合的装配方式,但交互性不足。我们在Unity虚拟引擎中建立一个交互式拆装训练系统,拆装操作简单,并有图文引导提示,适合学习者了解拆装过程。
如果一个拆装项目要实现比较完善仿真功能,比如需要仿真实体特征、装配精度等,则需要进行更加详尽的架构设计。但如果仅仅实现基本功能,且项目要在短时间(一周)内完成,那么按我目前的想法写下本专栏的笔记,大致可以完成。
1. 系统总体设计
完成整个系统大约要完成下图中这些工作,*为加分项。核心模块为3D模型的准备以及拆装功能的实现,这两个部分后面会详细说明。
2. 装配功能实现的详细设计
2.1 装配顺序
发动机模型的包括活塞、曲柄、离合器等几大部分,零件数量有200多个,彼此存在依赖关系,因此需要根据其构造和原理,安排拆装工序。按发动机功能区域分,可以讲拆装顺序分为如下图的装配分组,其中每个子装配体都包含了若干零件,因篇幅有限,仅展开比较重要的变速箱装配体:
在系统设计过程中,模型按上图的分组建立子装配体,并先分别完成每个子装配体,最后总装。
2.2 装配思想实现的难点
(1)碰撞干涉问题
虚拟世界中需要模拟实体零件的特性,否则容易发生零件穿透失去真实的效果。可以旋转Unity系统中较常用的几种碰撞器来制造碰撞效果,但这里需要注意几个问题:
1)如果使用MeshCollider包围整个零件表面,碰撞效果比较真实,但是系统资源占用较大,尤其是齿轮这些三角面较多的模型;
2)如果使用BoxCollider这类碰撞器时,容易造成视觉上还未碰到模型,而已经产生碰撞效果的现象,不复合现实世界客观规律。可以使用下图分段式碰撞器包裹物体的方式,系统资源消耗较少,又有MeshCollider的效果。
(2)装配路径约束
发动机装配中,大部分都是轴向装配路径,因此需要对孔和轴之间的配合进行约束,以体现实际装配中的方位和路径。考虑用采用以下方法:零件在当前位置O时,可以自由移动;当拖拽到轴端面位置时,制定一个零时位置T,从这个位置向目标位置P移动时,锁定y,z方向,约束零件在轴方向上移动。
(3)零件装配过程的流程设置
下图是大致的装配动作实现过程,其中没有考虑的问题有:
1)判断装配方向;
2)装配完成后,父子关系改变(如果后续需要通过运动执行来演示装配效果,就需要考虑这个问题);
3)装配工具选择(背包); 4)游戏奖励制度。
这些可以在制作过程中预留接口,以便于后期扩展。
3. 场景实现中的难点与解决
3.1 相机控制
在场景中,相机会有多种应用要求,比如在实现场景漫游功能时,需要以第一或第三人控制的方式,让相机实现360°场景旋转。但在装配过程、教学认知过程中,都需要相机在小范围移动,或干脆固定不动,解决的方法有很多种,比如:
1. 载入不同场景实现不同功能
比如漫游为一个场景,装配功能放在另一个场景,通过场景间的切换实现不同功能。
2. 建立多个相机,通过改变相机的Depth数值,切换主副相机。UI可以建立专门的UI相机。
另外,在装配场景中,可以将相机旋转中心设置为装配体的位置,让相机始终跟随装配体旋转和移动。
3.2 零件的拖拽和旋转
首先要建立零件的层(Layer),只有在这个层里的物体才会被鼠标射线选中拖拽,防止其他物体干扰;其次,使用鼠标射线拖动和旋转的代码很多,借鉴一下大神们的基本都没有问题。
3.3 装配位置提示
考虑实现是功能是:当选中一个零件准备装配时,这个零件的正确装配位置会有一个同样的零件形象忽明忽暗地提示,如下图1。大致的思想如下图2。
总结
在制作过程中还有一些小细节需要不断完善,比如需要规范管理那么多种类的文件、UI的层叠结构等,在本专栏中的后续文章会有过程记录。