夏禹 胡以怀 方云虎 张成 芮晓松
摘要:针对船舶机损事故在现实中难以重现的特殊性和危险性,通过建立船舶机损事故现场模型,综合利用3dsMax和Unity3D软件设计开发了船舶机损事故案例虚拟仿真软件,以3D虚拟播放的方式展现各种机损场景。着重介绍了虚拟仿真软件的开发技术和实现过程,包括场景搭建和缸套碎裂制作、软件特效开发、场景漫游和渲染设置等,简化了UI界面设计和视频播放自动化的方法,起到了很好的船舶事故教学培训效果。
关键词:Unity3D;船舶机损事故;3ds Max模型;虚拟仿真
中图分类号:TP391 文献标识码:A
文章编号:1009-3044(2021)10-0001-03
1 背景
在船舶系统中主机舱设备是事故发生率最高的部位,且其故障而引发的事故往往是较大事故,会造成较大的经济损失[1]。2015年12月3日,东莞市海龙疏浚工程有限公司所属的无动力工程船“海龙浚1号”轮由“大跃”轮拖带从山东潍坊驶往辽宁盘锦,在大连普兰店湾附近水域抛锚避风期间,“海龙浚1号”轮进水沉没。据调查,事故原因与该工程船遭遇大风浪,通风管没有及时关闭,海水通过通风管灌入机舱致使船舶储备浮力丧失有关。另外还存在拖带人员处置经验不足、应急预案不全面的问题。船舶机损事故类型多,成因复杂,应对和处理难度大,受场地、时间等因素制约且不存在真实的船舶应急事故处理的训练现场(如主机起火与机舱进水等)。如果能建立一套船舶机损事故案例虚拟仿真软件,用于船舶机损事故的案例教学和应急训练,使船员通过事故案例重演的方式从以往的机损事故中获得经验教训,以掌握船舶机损事故现场情况和应对处理流程,可以实现船舶应急情况分析和机损事故处理工作的高效化、科学化,这也说明了开发一套船舶机损事故虚拟仿真软件的必要性[2]。
近年来,针对船舶虚拟仿真系统的研究主要有:李治军[3]实现了虚拟舵机舱室的漫游与交互;江恒[4]开发和设计了无人艇视景系统;Ye Ting等[5]引入虚拟现实技术来构建一套船舶火灾模拟训练系统;何隽[6]设计开发了船舶损管虚拟仿真训练系统;王雨生[7]实现船舶航行状况模拟、船舶驾驶舱和轮机舱虚拟漫游,以及船舶入港停靠等功能;陆冬青等[8]为船舶操纵的教学训练和科学研究提供了有效手段。
上述研究主要针对虚拟机舱和虚拟航行,较少涉及对多种类型船舶机损案例进行虚拟仿真的研究。本软件采用基于Unity3D的虚拟现实开发技术[9],并具有兼容操作系统、跨平台发布并部署、人机交互功能强大等特点的Unity3D三维虚拟引擎[10],侧重船舶机舱各系统机损事故的情景再现,并利用语音播报配合文字提示与视频播放三者同步进行,实现生动、有效的船舶机损事故的虚拟仿真和案例教学。
2 软件功能
2.1 功能概述
船舶机损事故虚拟仿真软件分为机舱系统选择、事故类型选择、开始自动播放三个部分,如图1所示。机舱系统选择按照船舶主机舱系统分为七个软件模块,分别是启动系统、调速系统、燃烧系统、换向系统、燃油系统、滑油系统、冷却系统。每个系统模块下包含不同的事故类型选择。选择不同的故障类型可以开始自动播放机损事故的发生经过、分析與处理的流程,结合视频解说还原事故现场。
2.2 整体设计
以一艘5000TEU集装箱船为外形,使用3dsMax软件进行三维建模。同时建立船员与轮机长人员模型,进行第一人称行走动画制作。再搭建出主机舱、机房、驾驶室和集控室等三维实体模型,利用3dsMax自带的粒子系统和大气装置制作真实机损事故现场。利用3dsmax的摄像机进行画面捕捉,必要时在摄像机上加上动画使捕捉的画面更全面真实,使用渲染设置进行.avi格式视频导出。再利用Unity3D软件,制作软件的UI界面,构造便于教学的操作方式。利用C#语言功能,提供文本、语音、视频三者同步自动播放的实现。
本机损事故案例虚拟仿真软件中所包含的事故类型多,不同的故障类型所采用的仿真手法也不一样。现以冷却系统中机舱大量进水、缸套破裂和燃油系统中高压油管燃油漏泄为例,阐述喷射粒子系统、水面特效和火焰特效的开发技术,以及渲染设置方法和自动播放的实现方法。
3 场景搭建和缸套碎裂制作
场景搭建是虚拟现实技术研究的基础,整个软件以海上航行的整个船体作为主场景,然后选择主机舱作为机损事故发生的次场景。当故障发生的部件在主机上时,可以将场景缩小到整个主机来减少不必要的场景给工作站带来的负担。首先使用3dsMax按比例完成主机舱的三维模型和内部船用柴油主机模型的制作。制作主机缸套破裂时,先按Alt+Q隐藏缸套之外部分,选择修改器中的ProOptimizer,对缸套顶点进行优化,可以保留50%的顶点数,在减少面的情况下,布线和结构基本没有大的改变,然后创建切割用的平面调整大小放在产生裂缝的位置,将长度宽度分段加高到100,且添加Noise修改器,将比列调到80,强度Z调到40mm,选中缸套后使用ProCutter,将切割完的元素分离开来,保留切割后的碎块,点击拾取原料对象按钮,选中平面,切割完成后点击选择按钮避免再次切割,然后为左边切割后的一半添加Bend修改器,调整弯曲角度为30度,可以锁住尺寸编辑面板方便观察,选择Y轴为弯曲轴将方向调为90度,限制开裂上限为1000mm,即可拖动Y进行开裂。噪波平面和切割效果如图2所示。
4 软件特效
本软件特效实现主要依赖与粒子系统,粒子系统最早在1983年由ReevesWT[11]提出,是当今较好地模拟不规则运动的算法之一,能较真实地还原火、水汽、烟、水流等自然现象。3dsMax粒子系统中粒子的行为参数包括粒子生成速度、粒子初始速度向量、粒子寿命、粒子颜色、在粒子生命周期中的变化以及其他参数等,可以模拟随时间不断产生、生长和消亡的动态粒子效果。
4.1 喷射粒子特效
以机舱大量进水故障类型中主海水泵出口阀体泄漏为例,选择粒子系统‘Particle Systems中的超级喷射‘Super Spray并点击按钮在阀体漏水的位置创建,创建时选择顶视图确定喷射中心,通过旋转180度调整发射器指向向下,创建完成后在修改面板调整粒子分布为轴扩散30度和平面扩散70度,选择发射器隐藏,粒子百分数为80%,粒子数量为70,发射从0帧开始到100帧结束,寿命为20帧,选择粒子形状为球体,粒子大小为40mm。即可渲染出0~100帧的漏水动画。漏水效果如图3所示:
4.2 水面特效
为模拟机舱大量进水特效,需制作舱内水面缓缓上升的效果。在顶视图创建一个平面,其宽度和长度略大于进水舱,将长度与宽度分段为100,添加噪波‘Noise修改器,调整噪波参数,缩小比例为50,增大Z方向的强度为230mm,勾选动画噪波,设置频率为1.0。如图4a为机舱进水特效,图4b为排水特效。
4.3 火焰特效
由燃料着火所形成的火灾可分为自着火和强迫着火两种方式。在主机舱场景中,燃油与可燃性气体如甲烷、乙烷、丙烷、天然气、氢气等泄漏,遇金属摩擦撞击产生的火星,就可能生成气体火,属于强迫着火。以燃油系统中主机高压油管燃油漏泄为例,模拟缸盖上喷油器与高压油管接头处的一股火焰在燃烧,首先在辅助对象里下拉选择大气装置‘Atmospheric Apparatus,点击球体Gizmo后勾选半球在顶视图确定燃烧中心点创建,然后在环境和效果面板中添加火效果,进行火效果参数‘Fire Effect Parameters设置,选择火舌,拉伸1.0,规则性0.3,火焰细节为5.0,密度为30,勾选烟雾,点击拾取Gizmo对之前创建的半球进行拾取,再对其添加FFD 4×4×4修改器,切换自动关键点模式对其控制点进行动画制作,所渲染的火焰效果如下图5所示。
5 场景漫游实现与渲染设置
本软件场景漫游采用摄像机视野捕捉漫游,首先以机损部件为目标创建一台摄像机,在视图选择中选择摄像机视图,通过3dsMax界面右下角的缩放、视野、平移、环绕四个主要按钮来调控摄像机视野大小与方向,通过Ctrl+Alt+鼠标右键来调整帧数条范围,开启自动关键点捕捉来设置关键帧视角,可以简单实现漫游动画。
本软件所用的渲染器由3dsMax插件公司Chaosgroug开发的Vray渲染器[12],是以插件的形式和3dsMax相匹配的,Vary自带的灯光系统和材质库,后期渲染时与之配合会得到更快更好的渲染效果。在渲染设置窗口中选择时间输出为活动时间段,输出大小自定义为800×600,渲染输出格式选择.avi且设置如图6所示,可以快速导出样本视频。成品视频导出操作前面与样本视频操作一样,只是在导出时选择格式为Jpeg格式,设置如图6所示,3dsMax会自动按顺序渲染成序列帧,在后期软件如Alias、Premier或Ae等将当前序列帧合在一起输出成动画。
6 同步自动播放的实现
在Unity3D中将软件的UI界面制作完成后,为了达到语音、文字、视频三者同步自动播放的效果,我们以文字播放速度配合语音,以视频播放速度配合文字,通过C#语言的功能来进行协同控制。
6.1 语音播放控制
依据机损事故案例的发生经过、分析与处理流程而录制好mp3格式的语音播报,在Unity3D场景中的主摄像机‘MainCamera上建立AudioSource控件,勾选Loop和PlayOnAwake,将音频拖入AudioClip框中。这样刚进入场景就会开始循环播放语音解读。
6.2 文字播放控制
首先以text.text = ""来清空界面文本框内的文字,文字开始播放的时间通过代码yield return new WaitForSeconds(startPause)中的startPause来控制,文字弹出速度代码设计如下:foreach (char letter in word.ToCharArray()){
text.text += letter;
yield return new WaitForSeconds(letterPause)}
這样就可以通过文字开始弹出的时间和一个一个弹出的速度来进行和语音播放同步化控制。
6.3 视频播放控制
利用在UI中的RawImage上添加VideoPlayer控件来进行视频播放控制,同样勾选Loop和PlayOnAwake,AudioOutputMode选择Direct模式,获取场景中的对应组件后,通过代码rawImage.texture = videoPlayer.texture将VideoPlayerd的视频渲染到UGUI的RawImage,赋值当前视频的播放时间后,通过videoTimeText.text = string.Format("{0:D2}:{1:D2}:{2:D2} / {3:D2}:{4:D2}:{5:D2}",currentHour, currentMinute, currentSecond, clipHour, clipMinute, clipSecond)把当前视频播放的时间显示在 Text 上,通过代码videoTimeSlider.value = (float)(videoPlayer.time / videoPlayer.clip.length) 把当前视频播放的时间比例赋值到 Slider 上,通过将当前的 Slider 比例值转换为当前的视频播放时间,代码设计如下:private void SetVideoTimeValueChange(){
videoPlayer.time = videoTimeSlider.value * videoPlayer.clip.length;
}
語音、文字、视频三者通过同一按钮控制播放与暂停代码设计如下:
void OnSoundClick(){
if (music.isPlaying) {
videoplayer.Pause();
text_playorpause.text = "播 放";
Time.timeScale = 0;
music.Pause();
}
else{
videoplayer.Play();
text_playorpause.text = "暂 停";
Time.timeScale = 1f;
music.Play();
}
}
这样,我们在选择完机损事故案例点击进入场景后,就会自动开始同步播放语音、文字和视频,且通过一个按钮控制三者同步开始与暂停。
7 结束语
船舶机损事故案例的主机舱内部系统的场景搭建和机损部件模型建立,可以利用3dsMax构建高效、高质量的视频渲染体验,且可以在Unity3D中实现自动控制语音、视频、文字同步播放的效果。该软件用于学员的船舶机损事故案例教学,可以节约教学成本,提高教学效果,有良好的应用前景。
参考文献:
[1] 胡以怀,陈宝忠,邹建军.船舶机损案例的人为因素失误分析[J].中国航海,2004(3):3-6,17.
[2] 胡以怀.船舶机损事故分析及安全评估[M].北京:人民交通出版社,2013.
[3] 李治军.基于Unity 3D的船舶舵机舱虚拟现实设计与研究[D].大连:大连海事大学,2014.
[4] 江恒.基于Unity3D的无人艇视景系统开发研究[D].武汉:武汉理工大学,2016.
[5] Ye Ting,Chen Feng,Wang Wenqiang,et al.Design and Realization of Ship Fire Simulation Training System Based on Unity3D[C].IOP Conference Series: Earth and Environmental Science,2018,108(5).
[6] 何隽.Unity 3D船舶损管训练虚拟仿真系统的设计与实现[J].电脑知识与技术,2019,15(17):246-248.
[7] 王雨生.基于Unity 3d的虚拟船舶仿真研究[D].舟山:浙江海洋大学,2019.
[8] 陆冬青,邱云明,辛金强.基于Unity的船舶操纵运动仿真[J].船舶工程,2019,41(S2):19-22.
[9] 谢韬.基于Unity3D粒子系统的游戏特效实现[J].现代计算机(专业版),2015(24):30-32.
[10] 赵艳坤.基于Unity3D的栾川三维城市地理信息系统研究[D].郑州:郑州大学,2014.
[11] William T.Reeves.Particle systems—a technique for modeling a class of fuzzy objects[J].ACM SIGGRAPH Computer Graphics,1983,17(3):91-108.
[12] 李利明.3DMAX中常用渲染插件特点解析[J].漯河职业技术学院学报,2013,12(2):68-69.
【通联编辑:谢媛媛】