APP下载

一种用于实时模拟布料与流体交互的算法研究

2020-05-09宛月茶吴德阳

小型微型计算机系统 2020年2期
关键词:碰撞检测质点布料

唐 勇,赵 伟,宛月茶,赵 静,吴德阳

1(燕山大学 信息科学与工程学院,河北 秦皇岛 066004)2(河北省计算机虚拟技术与系统集成重点实验室,河北 秦皇岛 066004)

1 引 言

布料与流体的运动过程在物理上具有不同的特征,各自遵循着其物理规律,交互时,它们的相互作用更是增加了彼此运动的复杂性,其中比较常见的问题就是流体与布料和布料自身的穿透,利用深度学习改进布料精度较低的问题,使布料自身的准确度大幅度提高[1],但在一些应用程序中,布料与流体的交互不仅强调的是准确性,更要求达到实时.所以要满足上述需求,就必须对传统的碰撞检测方法进行修改或提高计算效率.

对布料与流体交互的运动学进行研究,其中碰撞问题占了很大一部分,它分为布料与流体之间的碰撞和布料的自碰撞.对于基于粒子的流体,通常将可变形体也转化为粒子来实现与流体的耦合.2004年Müller等[2]使用SPH方法模拟流体,并将虚拟边界粒子放置在可变形物体的表面,通过Lennard-Jones势能来模拟排斥力和黏附力,但是这种方法需要很小的时间步长来确保流体粒子不会穿过固体;Akinci等[3]扩展了流体与可变形体的耦合方法,引入了自适应边界采样,以避免变形时网格的过采样和欠采样,并解决了时间步长小的问题;Harada等[4]通过计算由粒子构成的流体和由多边形构成的布料之间的距离来解决碰撞问题,此距离是通过找到粒子所属体素最近的布料多边形之间的近似距离,但是当布料流体形变较复杂时,会导致流体粒子在表面的堆积;Yang等[5]为生成的虚拟粒子属性动态地分配内存,克服了粒子的堆积问题,此外,生成的粒子的属性最终恢复到基于网格的模型状态,然而,该方法严重依赖于用于处理相互作用的附加粒子,需要更多的存储器,并且对于额外的粒子处理而言是耗时的,无法达到实时状态;2012年Du等[6]提出基于布料厚度的膨胀式连续碰撞检测方法,用于检测基于SPH的流体粒子与布料之间的碰撞,通过Lennard-Jones势来描述两个粒子之间的相互作用,实现布料与流体粒子的碰撞检测;2015年孟云等[7]通过为每个流体粒子建立粒子/网格索引表和邻接表,在仿真过程中通过计算发生碰撞粒子的周围粒子对该粒子的作用力,并对作用力进行累加得到碰撞时的接触力,最后将算法过程流映射到GPU上,提高了算法的准确度和效率;2018年臧惠等[8]改进布料的重复采样问题提高布料流体间的碰撞检测速度,通过计算流体粒子与采样粒子之间的作用力来更新布料与流体的位置,但这些方法都未考虑布料的自碰撞问题.

针对以上问题,本文提出一种用于实时模拟布料与流体交互的方法来解决流体穿透布料和布料自碰撞的问题.首先,结合质点弹簧模型与基于位置的动力学方法对布料进行建模,其次,通过膨胀式连续碰撞检测方法检测布料与流体之间的碰撞,使用基于惩罚的接触力处理布料流体之间的碰撞响应,并引入交互因子记录布料与流体的首次接触时间,采用基于k-DOPs的层次包围体[9]对布料自碰撞进行检测,最后,根据对约束动力学和碰撞力的数值计算,对布料和流体的位置和速度进行更新.

2 布料流体建模

2.1 质点弹簧模型+基于位置的动力学

结合质点弹簧模型与基于位置的约束方法对布料进行建模,取消质点之间弹簧的拉伸和弯曲的弹性力,只进行约束作用,可以更快速稳定地模拟布料受力之后的变形以及发生穿透后的处理,提高布料自碰撞响应的效率.

质点之间取消结构弹簧的作用力,引入距离约束来建模拉伸力,它只与质点间的位置有关,保证了布料上的三角形结构不会被过度拉伸;对于布料上每一对相邻三角形,取消质点间弯曲弹簧的弹力作用,引入弯曲后的角度为弯曲约束,它们被分别定义为:

Cstrech(x1,x2)=|x1-x2|-l0

(1)

Cbend(x1,x2,x3,x4)=arccos(n1·n2)-φ0

(2)

其中,方程(1)中x1和x2为质点的位置,l0为质点之间的初始距离;方程(2)中两个相邻三角形弯曲后的夹角实际上是这两个三角形法线的夹角,如图1所示,设相邻的两个三角形为T1(x1,x2,x3)和T2(x1,x2,x4),n1和n2分别为T1和T2的法向量,φ0为两个三角形夹角的初始值,方程(1)和方程(2)类型均为等式约束.

图1 弯曲后的二面角Fig.1 Dihedral angle after bending

2.2 流体建模

本文使用光滑粒子流体力学(SPH)[10,11]模拟流体,SPH的粒子包含着所有物理量的信息,具体某处粒子的物理属性是由周围粒子的函数值进行插值得到,位置r处的物理属性为:

(3)

其中,mj是相邻粒子的质量,ρj是密度,W是光滑核函数,h是光滑核半径,rj表示的是核半径h范围内的所有流体粒子,fi(r)为累加后的粒子的物理属性.通过计算流体粒子的密度ρj、压力Ρi和黏度νi,并与外力fi一起代入到纳斯-斯托克斯方程中,通过牛顿第二定律求解得到流体粒子的加速度:

(4)

3 碰撞检测与处理

3.1 引入基于k-DOPs层次包围体的自碰撞检测与响应

传统的布料与流体交互模拟的实验中并没有考虑布料自碰撞检测,极易产生穿透.为避免这种现象,本文引入基于k-DOPs的层次包围体对布料进行自碰撞检测.

布料是由三角形网格组成,所以对布料的自碰撞检测就是对三角形-三角形之间进行相交检测[12].采用扩张的k-DOPs包围体层次结构来检测布料自碰撞,布料被构造成一棵二叉树,并将每一个上层节点拆分成左、右包围体子树,从而检测左、右包围体子树的碰撞.

自碰撞响应对于已经检测到的自碰撞,应给予正确的碰撞响应,避免布料自身发生穿透.对于自碰撞响应也是通过增加约束的方法来控制质点的运动,此约束为:

Cself(p,x1,x2,x3)=(p-x1)·n-h

(5)

图2为布料与流体交互后出现的自碰撞效果,其中图2(a)为悬挂的布料在受到流体的作用力后发生自碰撞后产生穿透;图2(b)为引入自碰撞检测后穿透问题解决的效果.

图2 布料自碰撞Fig.2 Cloth self-collision

3.2 改进的膨胀式连续碰撞检测方法

传统的连续碰撞检测方法只能检测碰撞发生在某一帧内,并且检测的准确精度有限,无法确定接触发生的具体时刻,如图3所示.本文通过引入交互因子λt来记录发生接触的最早时刻,解决连续碰撞检测时间准确度要求高的问题,并在发生接触时调用布料自碰撞模块,交互因子λt的计算是利用接触时点与三角形共面的特性来计算的,流体粒子p和三角形T(x1,x2,x3)共面的计算方式如下所示:

(6)

进一步求出:

(px1+λtν1)×(px2+λtν2)·(px3+λtν3)=0

(7)

求出λt,对接触的4个点进行近似性测试,若它们的距离足够小并且小于布料厚度h,则说明检测到接触,此时即可调用布料自碰撞检测模块,进行k-DOPs包围体层次结构的自碰撞检测.若出现多个λt,则取λt的最小值作为接触发生的时刻.

(a) (b)

基于惩罚的接触力

考虑布料厚度后可以根据流体粒子的穿透深度更准确地估计碰撞后的接触力,通过上述方法计算出的碰撞点和碰撞时间,可得到对于任何在两位置之间相互穿透并沿连续路径移动的特征对,基于惩罚的接触力应该由法向量的方向和碰撞点的相对速度决定.

本文接触力的计算是根据文献[7]引入的接触力定理得到的:

(8)

其中Q为流体粒子p在布料上的碰撞点,nc为在碰撞时刻t的三角形法向量,k为刚度常量,δt为碰撞的时间间隔,得出接触力后重新计算布料的运动,防止出现穿透现象.

4 实验结果

为验证本文方法的有效性,在硬件系统为Intel i7-4790 的CPU和显卡为 NVIDIA GeForce GTX 750 Ti上进行仿真实验,使用Unity物理引擎并结合c#语言,开发完成了布料与流体交互的实验.

图4 文献[4]与本文方法对比Fig.4 Different collision methods′s simulation

图4分别展示了文献[4]和本文方法模拟的不同量的流体流向布料的效果,两种方法的流体粒子数量分别为45k和65k,由于文献[4]中需要计算粒子与布料之间的距离,计算代价高,平均速率为19fps,而本文采用质点弹簧与基于位置的方法结合对布料建模,加快了碰撞检测速度,平均帧速为37fps,达到了布料流体交互场景的实时模拟要求.

图5展示了文献[8]和本文方法中把布料4个角固定住后,流体粒子洒向布料的效果,但文献[8]未考虑布料自碰撞.本文在流体与布料碰撞检测的基础上引入布料自碰撞检测,图5(c)为固定3个角时布料与流体的交互,解决了布料与流体粒子和布料自身的穿透问题,模拟效果更加真实.

图5 文献[8]方法与本文方法对比Fig.5 Different collision methods′s simulation

图6展示了文献[6]和本文方法中流体流向两块布料的效果.本文方法在文献[6]的基础上进行改进,确定碰撞的具体时刻,使检测更加精确,且模拟时速率为32fps.从视觉上可以看出,本文的方法在解决流体穿透布料的同时还能更好地模拟布料的褶皱现象,真实的展示布料的物理特性.

图6 文献[6]方法与本文方法对比Fig.6 Different methods of simulation

本文在布料与流体交互过程中增加了布料撕裂现象的模拟.对装满流体粒子的布料球进行撕裂,流体粒子会发生溢出,由于布料与流体的双向耦合,溢出的流体粒子会迫使布料向后运动,并产生自碰撞的效果.其中图7(a)展示的是流体粒子的效果,图7(b)是对粒子进行渲染后的效果.

图7 通过撕裂布料球来释放流体Fig.7 Cloth tearing and releasing fluid

表1描述了本文方法的性能和与文献的数据对比,通过表格数据可以看出,在粒子数和布料分辨率相近的情况下,本文方法速率高,具有明显的实时性.本文方法不仅可以模拟布料与流体的交互,还在实验中考虑了布料撕裂和自碰撞的现象,使模拟效果更加真实,仿真效率更高.

表1 实验场景的总体性能表Table 1 Experimental scene performance

5 结 论

本文在膨胀式连续碰撞检测方法的基础上引入交互因子检测布料流体的碰撞时间,解决了连续碰撞检测方法不能准确确定碰撞时刻的问题;并采用基于k-DOPs的包围体层次结构对布料进行自碰撞检测,避免了布料自碰撞时发生穿透;通过取消布料质点间弹簧的内力,引入拉伸和弯曲约束来控制质点的位移和速度,加快了处理布料流体之间和布料自身的碰撞响应速度,从而保证了实时性.今后会继续将本文的方法放到GPU上进行并行加速计算,进一步提高仿真速率,并改进对流体的渲染.

猜你喜欢

碰撞检测质点布料
预制构件混凝土布料机自动预标定应用
基于动力学补偿的机器人电机力矩误差碰撞检测
全新预测碰撞检测系统
巧用“搬运法”解决连续质点模型的做功问题
基于SPH方法的流体粒子与软体碰撞检测①
基于Virtools的虚拟灭火系统碰撞检测设计与实现
质点的直线运动
质点的直线运动
洗水soft fabric
小裁缝