Babybus-u3d技术交流-基于Unity3D的虚拟水流墙系统的设计研究
来源:[第三维度
作者:张锡英,韩吉烨
单位:东北林业大学信息学院
** 摘要
针对现有水流墙系统中水流真实性不高、可移植性不好等问题,开发一套新的基于[Unity
3D虚拟水流墙系统。该系统采用SPH算法对水流墙系统中的水流加以优化,使其能够达到模拟真实水流的效果,真实地模拟了水流的视觉效果和物理特性。利用C#语言编写的画线代码可以完美地在屏幕上画线改变水流的路线。同时采用了以线段代替点的全新存储结构,减小存储压力,从而提高性能。
该项目成果可大量发布于Windows、Android、IOS、Linux等多系统中供用户进行体验,并且对硬件需求不高,无需绑定硬件,一般配置都可以完美运行,支持发布到多种操作平台,以便满足多平台的需求,使用户可以得到更真实、更全面、更方便的体验效果。
虚拟水流墙系统是一款对现实中水流的各种物理特性进行模拟的[虚拟现实
系统
。随着[虚拟现实
技术在各领域的广泛应用,基于[Unity
3D的[虚拟现实
研究已经成为当前研究的热点。初级版本的虚拟水流墙系统现在已存在于许多城市科技馆、科技主题公园等公众场所用于展示与用户体验,但这些初级版本的虚拟水流墙系统中存在着许多缺点和不足。针对这些问题,笔者开发了一款全新的虚拟水流墙系统。
** 1 水流墙的设计与实现
在水流墙项目系统中,水流是项目的主体。在程序启动时,会有虚拟的水流从屏幕顶端流出。
** 1.1 [Unity3D [Unity3D是一款基于.NET的游戏开发引擎。作为一款成熟的3D游戏擎,[Unity
3D为游戏设计者提供了许多游戏开发所必要的功能。这些强大的功能为开发该水流墙项目提供了可行性保障。同时大大降低了开发成本,缩短了开发周期并降低了风险。
由于[Unity
3D可以充分、实时地处理大量的三维模型和数据,并能够提供高效的性能和高质量的保证等特点,长期被用于三维显示、
实时交互的项目开发设计项目中。Uni-ty3D还有一个很重要的特点是跨平台开发,它实现了一次开发、一键式发布的方式发布到多种平台的功能,目前支持发布到Android、Windows、Linux、Mac、IOS、Web和Flash等平台。这个特点为在多平台发布和项目实现可移植性提供保障。
** 1.2 粒子系统
粒子系统是一种用于模拟不规则物体或自然场景的方法,这些不规则物体的特点是动态性和随机性。粒子系统中的每个粒子都具有形状、大小、颜色、透明
度、运动速度、运动方向、生命周期等多种属性,而且这些粒子随时间的推移不断变化,在时间和空间上具有动态分布特性,从而尽可能真实地模拟出具有复杂运动规律的动态特效。粒子系统的基本开发流程包括以下几个步骤。
1.2.1 确定模拟对象的粒子模型。
在利用粒子系统进行模拟之前,首先要对待模拟对象的运动规律进行分析,从而选择合适的粒子模型进行模拟。
1.2.2 初始化粒子系统。
根据上一步骤确定的粒子模型对粒子系统进行初始化,包括设置粒子数量、大小、形状、颜色、初始位置等属性。
1.2.3 设置粒子运动规律。基于要模拟的对象设置粒子的运动规律及相关公式。通过粒子的协同运动模拟对象的运动。
1.2.4 粒子状态更新。
粒子系统开始运行之后,需要根据粒子的运动规律按一定频率更新粒子状态。
1.2.5粒子的消亡。
每个粒子完成一个生命周期的所有活动之后便会进入消亡阶段,此时需要将消亡的粒子及时删除,以免耗费过多的系统资源。
** 1.3 SPH算法
SPH算法是典型的拉格朗日视角,基本原理是通过粒子模拟流体的运动规律,然后转化成网格进行流体渲染。SPH算法的基本思想是将连续的流体分解为无数个细小的颗粒,这些颗粒相互影响,共同形成复杂的流体运动,其中每个单独的流体粒子都遵循牛顿第二定律。
SPH算法的基本运算流程包括以下几个步骤。
(1)初始化粒子,为每个粒子添加初始值。包括粒子的初始位置、初始速度等。
(2)根据公式[图片上传中。。。(1)]计算出每个粒子的密度。其中,m为每个粒子的质量,h为相互作用的两粒子间的距离,ri、rj分别为两粒子的位置,ρ(ri)即为ri点处粒子的密度。
(3)根据公式P=K(ρ-ρ0)计算出每个粒子的压强。其中,ρ0是流体的静态密度,K是和流体相关的常数,只跟温度有关。计算结果P即为所有粒子压强。
(4)根据公式计算每个粒子的加速度。
(5)根据临界条件来调整加速度。
(6)根据加速度计算每个位置的速度变化。
(7)根据速度计算粒子的位置变化。
(8)重新绘制粒子位置。
(9)返回到步骤2重新计算粒子密度,直到粒子加速度为0,位置不再发生变化为止。
** 2 画线的设计与实现
该项目的基本目的是用户可以在一个虚拟的有水流的环境下进行画线、删除等操作,所画的线会与虚拟水流中的水滴发生碰撞,改变水流的流动路径。基本思想是基于C#语言进行编码实现画线部分,使得画出的线具有碰撞盒,可以实现刚体碰撞。
** 2.1 画线操作的设计
开发过程中发现,实际操作中并非需要对每个点都进行存储,因为项目实际运行时应该是在触摸屏幕上运行的,而此时所需要的最小的长度单位应该是手指的宽度,而非屏幕像素中的每个点。所以在画线过程中并没有存储鼠标动作的每一个点,而是采用线段代替点作为画线过程中的最小长度单位,不需要将鼠标遍历过的所有的点都进行存储,而是仅仅存储满足条件的线段的起点和终点,并存储在结构体内,建立与之相对应的对象并将结构体存储在链表中。这样做有几个好处。
(1)由存储点变为存储线段,显然是减小了存储的压力,提升了程序性能。
(2)方便管理。并非将每个点都存进链表,而是利用有限的线段代替,每个线段对应一个对象,根据对象添加碰撞盒,减小了添加碰撞盒的难度。
(3)方便删除。在删除操作时,并不需要考虑每次删除的点在链表中的什么位置,
而是仅仅知道删除的点在哪条线段上,直接将该线段删除,并删除对象即可。
(4)设计的常量可以随时变更,更加灵活,以便适应更多的环境要求。这种用线段代替点的算法是项目相对于已有的系统的创新点之一。
画线算法基本流程如图1所示。
图1 画线算法基本流程
** 2.2 删除操作的实现
删除操作是该项目中的又一个重点,也是难点。项目在实际运行中,不可能因为某次画线出现错误而重新启动项目并且重新画线。作为娱乐、展示的项目的,其操作人员并非都是专业人士,所以一定要有类似删除、重做等容错功能。这就使得删除操作必须存在。
在删除操作时,首先需要寻找要删除的点在哪个对象中,这部分是调用C#内部函数处理的。
删除操作算法流程如图2所示。
[图片上传中。。。(4)]
** 2.3 碰撞设计
碰撞由碰撞检测、速度调整、位置调整3个部分组成。该研究中碰撞分为粒子间碰撞、粒子和所画线段之间的碰撞两部分。对于粒子间的碰撞,需要进行碰撞检测,根据牛顿第二定律调整速度,进而调整粒子位置。而对于粒子和所画线段的对象之间的碰撞,仅需要在检测之后调整粒子的速度和位置即可,线段对象不发生形变和位移。实现方法是实现水流的同时为粒子系统中的所有粒子添加碰撞盒,使其能够具有真实水流的物理特性。画线的同时为所画的线段添加碰撞盒。使其在与水滴碰撞的同时发生刚体碰撞,实现阻挡、改变水流流向的目的。碰撞盒的大小是根据画线过程中每个对象的长短来确定的,以保证运行时所画的线可以完全阻挡水流。
** 2.4 成果展示
基于[Unity
3D的水流墙系统已经实现,图3分别为系统运行时的静态图、系统开始时水流流出图、采用画笔画线改变水流流向图、采用橡皮擦擦除线段图。如图3所示,系统要求已经基本达到,并可以随时进行发布。
[图片上传中。。。(5)]
** 3 结语
基于[Unity
3D的水流墙系统的设计,采用SPH算法对粒子系统加以控制,使其能够达到模拟真实水流的效果。真实地模拟了水流的视觉效果和物理特性。利用C#语言编写的画线代码可以完美地在屏幕上画线改变水流的路线。该项目成果可大量发布于Windows、Android、IOS、Linux等多系统中供用户进行体验,并且对硬件需求不高,一般配置都可以完美运行,无需绑定硬件,使用户可以得到更真实、更全面、更方便的体验效果。
** 参考文献
[1]赵沁平.[虚拟现实
综述[J].中国科学F辑:信息科学,2009,39(1):2,46.
[2]邱建松.基于[Unity
3D的实时虚拟仿真系统的研究与实现[J].电子制作,2012(12):15
[3]倪乐波,戚鹏,遇丽娜,等.[Unity
3d产品虚拟展示技术的研究与应用[J].数字技术与应用,2010(9):54-55.
[4]陈晓青,王少伟.基于[Unity
的[虚拟现实
技术在教育中的应用[J].软件导刊(教育技术),2012(12):76-78.
[5]吴继承,江南.[虚拟现实
中粒子系统的设计与应用[J].计算机仿真,2005,21(11):137-140.
[6]王功明,郭新宇,赵春江.粒子系统的优化技术研究[J].计算机应用研究,2008,25(2):495-497,500.
[7]熊耀.基于[Unity
3D粒子系统的三维影视特效开发研究[J].软件导刊,2012,11(11):134-136.
[8]金阿芳,买买提明·艾尼.论光滑粒子流体动力学(SPH)方法[J].新疆大学学报:自然科学版,2006,23(2):188-193.
[9]李会珍.采用SPH方法的拉格朗日方式流体运动模拟[D].合肥:安徽大学,2013.
[10]郑兴.光滑质点流体动力学(SPH)算法研究[D].哈尔滨:哈尔滨工程大学,2005.
[11]何水艳,丁沂.粒子系统与碰撞检测的研究[J].轻工科技,2012(6)