唐 勇,张 颖,陶建新,郭慧玲,3,张 思
1(燕山大学 信息科学与工程学院,河北 秦皇岛 066004)
2(河北省计算机虚拟技术与系统集成重点实验室,河北 秦皇岛 066004)
3(河北省环境工程学院信息工程系,河北 秦皇岛 066102)
由于随机性、细节复杂等特性,流体中的火焰一直是计算机图形学领域最具挑战性的课题之一,火焰与障碍物的交互实现更为复杂.另外,在虚实融合场景中建立真实的火焰模拟也是一个挑战.因此在虚实融合场景中完成火焰交互运动的实时仿真困难重重.
火焰模拟,从Stam与Fedkiw等[1]人开始,人们在提升流体模拟的真实感与实时性方面上做了大量研究.2013年,Fedkiw等[2]提出一种网格结构实现火焰等流体的动态追踪,展现了火焰燃烧过程的细节,提高了实时性,但只能用精细网格追踪一个目标对象.2013年戴青等[3]提出一种基于GPU的流体动力系统,使用GPU模拟和渲染烟雾,提升了计算能力,但实时性仍不强.2013年吴晓月等[4]人提出一种投影方法,减少计算时间却产生与传统投影方法类似的视觉效果,但在流固界面上会造成一些交互缺陷,影响烟雾效果.2013年唐勇等[5]实现了N-S方程和体渲染结合的火焰实时模拟,完成加入障碍物和风力的火焰真实模拟,但在交互细节上还是有所欠缺.2016年,清华大学的Yan等[6]人扩展了现有多相流体SPH框架,展示了一种新的方法来模拟流固耦合,该框架实施简单且能够模拟多个固体和流体交互、溶解效果等现象,但对纯弹性材料效果不理想.
另外,利用人的手势动作来操作设备的用户界面近年来逐渐引起人们关注.2015年乔体洲等[7]人实现在无标记的情况下不对称的跟踪人手及其所有关节的位置和姿态,将基于Kinect的手势控制应用在虚实融合场景中烟源交互实时模拟仿真中.2016年Ing-Jr Ding等[8]人提出一种自适应隐马尔可夫模型的手势识别方法,利用Kinect获取用户的手势信号,驱动机器人来模拟人的控制命令.
综上可知,当前的火焰模拟,主要针对火焰细节上的模拟有很大的进步,但在虚实融合场景中进行火焰交互的研究略为匮乏.鉴于此,提出一种在虚实融合场景中与虚拟火焰交互运动的实时仿真方法.
火焰模型的建立分为基于粒子系统和基于N-S方程的欧拉网格模型两种.基于粒子系统建立的火焰,虽然在边缘细节上丰富自然,真实感更强,但庞大数量的粒子,在处理上耗费大量时间,在交互性控制上也非常困难.而基于N-S方程的火焰模型,通过控制火焰每个网格的单独属性,达到控制火焰和火焰交互的效果,优势更明显,所以本次实验选择基于N-S方程建立的火焰物理模型:
(1)
(2)
公式(1)和公式(2)分别是质量守恒连续方程、动量守恒方程.其中,u为速度,ρ为流体密度,v是动量粘性系数,p为压强,fbouy表示热浮力,热浮力为:
fbouy=-αρX+β(Tfire-Tenv)X+εl(N×ω)
(3)
(4)
(5)
公式(1)中f=fd+fwind,fd是扰动力,fwind是风力.
为了表现出火焰燃烧中的跳动,在求解fd的过程中,引入Perlin噪声函数生成随机数R=μPerlinNoise(t),R作为设置的恒定力的作用参数,进而产生一个随机大小的作用力,对火焰造成随机扰动,从而创造随机风场.
建立火焰物理模型过程中,由柏林噪声函数创造的随机风场,实现火焰因气流波动而跳动的逼真效果,增强了虚拟火焰的真实感.
实现虚实融合场景中与火焰的交互,将虚拟和现实的数据相融合,适配最佳控制系数,保证手势指令的鲁棒性,确保交互的真实与实时.
Kinect是3D体感摄影机,具备即时动态捕捉,影像辨识等功能,它能够不使用任何控制器,仅依靠相机就可捕捉三维空间中人的运动,因此本文采用Kinect来获取手势动作完成与火焰的交互.Kinect借助SDK采集各项数据进行计算处理,并利用红外摄像头获取现实原始视频.我们在真实场景中定义标记火焰位置,将真实场景和虚拟火焰进行虚实注册,然后将注册信息进行虚实叠加,融合虚拟和现实场景中的物体,将融合的视频显示到显示器上,在显示器上呈现出真实情景与虚拟火焰融为一体的场景,在场景中可通过手势对火焰达到操控的效果.
为了能够准确识别场景中人的手势指令,在手势定义上,本文以分类准确和高效率为前提,手势特征保证特征易于提取、区分度高,稳定且动作互不干扰,提升手势交互时的鲁棒性.由上,定义如表1所示的手势指令集及其算法.其中L和R分别是左手和右手的简称.↑、↓、←和→分别表示手掌垂直向上、向下、水平向左和向右运动.
表1 手势指令集定义表Table 1 Difinition of gesture instruction set
为确保手势指令的鲁棒性,在手势的交互中引入控制系数,减少时间异步,并且保证移动距离成正比.
3.2.1 减少时间异步的灵敏度系数α
手势控制物体与火焰交互过程中,获取手掌三维坐标值Rhand=(X,Y,Z),则假设在Δt内手在坐标轴上的偏移量为ΔM(其中M分别为X,Y,Z),在坐标轴上设置移动阈值为ΔMmove,设定手势幅度大于一个移动阈值,则调用手势算法,即ΔM>ΔMmove时,调用手势指令算法,火焰发生交互效果.
为实现在场景中人与火焰的实时准确交互,在调用指令算法中适配最佳灵敏度系数α(α>0),提高手势识别的灵敏度.通过手的三维坐标值的增长值来计算在坐标上速度的增长因子Ux,Uy,Uz,计算如公式(6)所示.
(6)
假设原始坐标为Sorig=(X1,Y1,Z1),经过Ux,Uy,Uz的转化,可得物体的最终坐标为Sfina=(X2,Y2,Z2):
M2=M1+Um×(t2-t1)
(7)
其中,M分别为X,Y,Z.
3.2.2 火焰偏移量的控制系数Φ
为实现火焰随手势摆动的真实效果,在指令算法中引入控制系数Φ,利用手势挥动距离控制风力大小,将风力添加到火焰上.当:
(8)
时,手挥动偏移量大,风力越大.其中|ΔX|是手移动距离.
假设网格中风速恒定,根据大气动力学计算空间中x点t时刻的风力得:
(9)
其中ρair是空气的密度,v(t)为t时刻的风速.考虑到阻力,引入风力衰减因子,假设空气阻力fresi为定值,则:
fresiΔt=mv(t′)-mv(t)
(10)
其中Δt=t′-t,m是质量.由于Δt特别小,忽略不计,则认为Δt内风速不变,那相对于t时刻的相对位移ΔS为:
ΔS=v(t)Δt
(11)
由公式(10)和公式(11)整理可得:
(12)
整理以上方程,获得任意时刻的风力为:
(13)
引入风力衰减因子后,真实地反映了风场的变化.
在手势定义算法中引入α和Φ后,提升了手势识别的灵敏度和准确度,提高了手势识别率,确保手势指令的鲁棒性.实现手挥动,识别手势指令并判断风力大小的交互效果.
火焰与障碍物之间的交互是基于流体与障碍物之间的单向耦合作用,为在交互界面上的细节更加真实自然,深入两者的作用机理,建立他们之间的耦合方程模型.
图1 流体与球体碰撞的矢量图Fig.1 Vector of flame and fluid's collision
如图1所示,1904年德国人普朗特提出边界层理论:边界层的流体用N-S方程表示,流体与障碍物接触并有相对运动时,边界层会因阻力使流体速度减小,产生边界脱离现象.流体的流动速度减为0时,流体反向流动,在障碍物的表面某处分离,产生大量的旋涡.
基于此理论,建立如下火焰与障碍物之间的耦合模型.
将4.1节的理论分析应用到火焰与障碍物之间的单向耦合作用力分析上,即可得:
在交互边界上,障碍物受到k个网格压力的矢量和为:
(14)
则由边界单元网格压力所产生的加速度abound为:
abound=M-1τp
(15)
式中M是移动障碍物的质量;另外,考虑到移动障碍物本身的加速度,边界处总加速度aout为:
(16)
(17)
耦合前后火焰保持不可压缩性,故下一时刻速度散度为0:
(18)
对公式(18)进行变形,得到:
(19)
将火焰与移动障碍物的运动结合起来,得耦合线性方程:
(20)
其中D代表散度;在边界上b=usolid,A=abound.
通过对流固之间耦合作用力分析,建立其流固耦合方程,保证火焰与障碍球交互面上的细节更加真实自然流畅.
在Windows平台下建立基于Kinect的虚实融合场景,结合Unity3d建立了虚拟火焰模型,进行了与火焰的交互实验与对比,验证在虚实融合场景中与火焰交互的真实感和实时性.硬件环境:Intel(R)Core(TM)i7-4790 CPU @3.60GHz,8GRAM,显卡为 ATI Radeon R7250(2G).
图2是用本文方法模拟出的酒精灯火焰和真实酒精灯火焰的效果图对比.图2(a)和图2(b)分别展示了利用本文建立的火焰物理模型对酒精灯火焰的模拟和真实酒精灯火焰.与图2(b)相比,图2(a)中的火焰有真实火焰由于气流产生的跳动和不规则形状火焰边缘的特征与细节.
图2 酒精灯火焰的模拟及对比Fig.2 Simulation and comparison of alcohol flame
如图3所示,图3(a),图3(b)分别是本文火焰与文献[4]
图3 火焰与障碍球的交互效果图Fig.3 Interaction between flame and sphere
烟雾和障碍物的交互效果.图3(a)障碍球上方有因火焰遇到障碍物耦合交互产生的旋涡,在火焰与障碍球之间交互界面上的交互细节真实自然;而图3(b)的烟雾遇到障碍球,无旋涡,交互细节也很粗糙.另外,图3(b)中烟雾的模拟和渲染是在GPU上进行的,实现了实时性,而本文的交互不仅在帧率上能够达到120帧左右,实时性强,且在交互细节上真实自然.
图4是Kinect识别手势指令与火焰交互的效果图,其中ΔX的正负表示手摆动方向.图4(a)-图4(d)分别展示了无指令,L←,归位,L→的交互效果.分析可知,火焰摆动的方向与手势指令的方向一致.且由图4(e)-图4(h)可知,火焰摆动与手势指令不仅方向一致且与挥动距离成正比.
图4 手势控制火焰摆动Fig.4 Flame of gestures controling
图5是移动球与火焰或烟雾交互的效果图.其中图5(a)-图5(d)是本文识别手势指令控制小球与火焰流体的交互效果,图5(e)-图5(h)是文献[5]中烟雾与移动小球的交互效果.文献[5]中提升了烟雾细节,但在烟雾与小球交互界面上细节不清晰,本文中小球跟随手势指令摆动,且两者的交互细节丰富自然.
图5 手势控制小球与火焰交互及其对比图Fig.5 Interaction and comparison of gestures controlling sphere and flame
表2是对手势识别实验的数据分析.由表可知,同样100次实验,单手手势控制火焰的交互运动的识别率相对于双手手势控制的实验要高,平均识别率可达到98%.而双手手势控制火焰的实验,识别率为90%-92%.究其原因,实验过程中人对火焰进行控制时,Kinect识别双手指令的不准确性,对实验造成了干扰,导致双手手势的识别率有所降低;另外,根据Kinect的深度摄像,人与Kinect之间的距离也是有影响的.多项实验表明,手势识别算法能够满足虚实融合场景中人与虚拟火焰交互的实时真实模拟的要求.
表2 每个手势的数据分析Table 2 Analysis of every gesture
本文通过分析对比粒子系统与欧拉网格的火焰模型,选择了交互性较强的欧拉网格火焰模型.针对火焰控制问题,利用Kinect将真实场景与虚拟火焰进行深度交互,实现了人对虚拟火焰的交互控制,达到逼真的人机交互效果.求解N-S方程过程,引入柏林噪声函数创造了随机风场,建立了真实跳动的火焰模型;在虚实融合场景中,定义手势指令集及映射算法,并在算法中引入灵敏度系数和控制系数,保证手势指令的鲁棒性,同时提升了手势识别率和准确性;确定火焰与障碍物之间耦合关系,建立之间的耦合模型,实现了交互细节上的更加逼真的效果.通过多个实验效果图的分析和对比可知,本文在虚实融合场景中实现的各种交互效果真实自然流畅.但Kinect本身最大帧率是30fps左右,在虚实融合场景中的帧率还不是很高;另外,Kinect不能识别较为复杂的动作,故不能准确实现复杂的交互动作.提高复杂手势的识别和准确率将会是我们下一步的工作.