一般的机械拆卸模拟用来培训演示,例如大型机械的拆装都是非常耗时的,需要一个软件来模拟下拆装的步骤,给不熟练的工人演示注意事项等等。应用非常广泛。因此设计一个通用的框架,可以很好适应变化的需求。
使用unity可以很方便的开发虚拟现实类的软件,程序部分只需要普通的程序员即可完成整个项目。
机械的拆装模拟是最近两年比较常见的项目,大量的订单和需要制作的模拟。阿亮在大二的时候也是接到了一个这样的单子。就是对某大型机械设备进行拆装,维修演示。
先说一下这个项目的常规方案(一开始我也是这么做的),就是利用unity的动画系统,制作每个零件的动画,如位移,旋转等。制作完成后,通过程序去调用播放零件的动画,来实现拆装的演示。
这个方案的缺点是非常明显的,一是,零件繁多,制作动画本身就是个耗时较长的活,总体下来制作时长。二,动画系统的不完善和平滑过渡的调整,都将困扰开发者,使动画的制作不稳定,效率低下。三,动画做完后,动画的修改,如移动的速度,位置,角度等调整,又是一个庞大的任务,而代码并不能帮上忙,这对项目的维护是非常要命的。四,扩展性极差,如果有新的零件填进来,或者新的动作都将考验系统的适应能力,而动画系统下的架构是难以适应这一变化的。
总之,除非你做的模拟零件比较少,而且一切都是固定的,可以采用上述方案。否则,你的项目就算成功了,也花费了大量的时间和精力,这些都是金钱。
一般的机械模拟,零件断然不会少,动作繁多,有先后的顺序。移动的方案也是不确定的,例如零件的位置,放置的角度等等。零件的移动速度有时也是有要求的。例如小零件移动的快,大零件移动的慢。
基于以上要求和特点,关于机械的模拟,应该使用transform来实现。底层写好零件的移动,旋转,速度等接口。同时旋转也是不确定轴向的,有时候旋转的轴并不在物体身上(不规则零件),所以底层接口应该考虑到这些。如果不想写,可以借助ITween,并封装好相关函数。
本文不会提供源码,只提供开发的方案和思路,如果想要源码,可以联系我,当然那并不是免费的。(实际上方案才是最贵的)
接着说,底层实现移动是第一步,接下来是设计的第二步,第一步中普通的程序员完全可以胜任。
因为有大量的零件,你不可能为每个零件都写一个移动方法。所以我们需要定义一些通用的规则,例如移动,旋转等,并生成相应的字段。或许你已经猜到了,第二步就是做一个数据持久层,关于这个数据库的设计,我就不详谈了,看个人需求。定义零件的移动,旋转,位置,速度等参数,然后存起来,运行程序时读取。这样的好处是,可以动态的修改零件的动作。即使不会编程,不懂unity的也可以通过直接修改数据达到改变机械模拟的“动画”。关于这部分的设计还是比较简单的,看具体需求而定。关于数据库,一般本地数据库足矣。现成的数据库有sqlite,但是跨平台不好。Xml,简单方便,跨平台。具体可以看我以前的博客。
第三步,算法结构的封装。这个层次主要负责零件操作的设计,提供零件的各种操作方法,如添加动作,修改动作等等,无外乎一些位置,角度,速度的访问等等。这个类一般的程序员也能做好,关键是看各位的具体需求了。
第四步,做个UI,一个可视化的“动画”编辑器。此动画编辑器非unity的动画编辑器。可以理解为,对前三步的方法的调用。如果直接在数据库中修改参数,没有直观的感受,调参数也是非常麻烦,每次改完重新打开程序才看到效果,因此需要制作一个零件的动作编辑器来完成。
具体的做法是,在一个场景中,加载所有的零件,然后通过鼠标点击获取零件。完成这个功能很简单,所有的零件加个meshcollder,然后使用射线碰撞就行了。因为零件数量较多,我们可以动态的添加collder组件,这个过程比较缓慢,极容易卡顿,建议使用协程。选定零件之后,就可以对零件的动作进行编辑了。具体的UI如何设计就看大家的需求了,但是功能无外乎,移动(选择轴向),旋转(选择轴向),速度参数等等。为了方便查看还可以添加预览功能,编辑完成后就可以查看零件的移动轨迹了。话说这个功能也是很好完成的,使用一个表,存储起点位置,然后读取一下移动参数就行了。
当然快捷键也可以加入UI设计中,其目的就是方便零件动作的设计。到后期,还可以模拟unity引擎对物体的操作,鼠标拖拉零件,通过类似的锚点,存储关键点,设置速度等等,一个简单方便的“动画”编辑器就很完美了。
动画编辑器可以作为高级功能,让用户自定义零件的动作,模拟拆卸动画的同时,还能实时修改。这样的话,软件拥有更好的灵活性。同时,还可以方便的添加新零件。不仅如此,在面对一个新的模拟项目时,无需再修改代码,直接让美工做好的模型放到指定的文件夹下就ok了。这要看你的资源加载设计了。
本文连接:http://www.cnblogs.com/jqg-aliang/p/4825460.html,转载请申明出处,谢谢!