APP下载

拉伸、碰撞情景下布料撕裂的实时仿真模拟

2019-12-04刘宇涵贾江凯陶建新张金钟任小霞

小型微型计算机系统 2019年11期
关键词:风场质点数据结构

刘宇涵,贾江凯,唐 勇,陶建新,张金钟,任小霞

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

1 引 言

布料模拟在计算机图形学中占很大的比重,但在游戏中,模拟布料撕裂的效果严重失真.相比布料其它运动行为的模拟,布料撕裂导致网格结构的改变以及撕裂轨迹的难以捉摸,使得布料撕裂模拟的研究更具有挑战性.

20世纪80年代开始,大量科学家致力于计算机模拟布料撕裂的研究.1998年,Terzopoulos和Fleischer等人[1]在展示了一种撕纸和模拟布状材料的技术,给布料撕裂模拟研究提供了借鉴.2007年,Sifakis等人[2]使用虚拟节点法,在虚拟元素中嵌入裂缝,降低布料的稳定性,然而这种方法限制了裂缝传播的准确性,需要规定撕裂轨迹.2009年,kaufmann等人[3]嵌入XFEM可以准确地解决规定撕裂轨迹的问题,但是对轨迹的几何形状进行了限制,且计算代价太大.2009年,Metaaphanon N 等人[4]使用标准连续表单模型和纱线级模型,模拟出逼真的布料撕裂边缘的磨损效果.正是因为两层模型的使用,实验模拟速度达不到实时.2014年,Souza M S等人[5]提出一种使用Half-edge结构的查找方法解决布料的撕裂模拟,提高了计算速度,但是降低了真实感.国内方面,2016年,唐勇等人[6]提出一种多形态布料与物体实时碰撞与检测的方法,成功处理了布料与物体之间的碰撞问题.同年,Bi W 等人[7]研究了人体视觉对不同属性的布料感知的恒定常数,主要分析视觉系统在抵消了外力的影响后,对布料属性的感知,但对于不同属性的布料在风场中的模拟缺乏真实感.2017年,Camille Schreck等人[8]提出了一种交互式建模背景下的撕纸方法,通过几何信息来自动检测撕裂路径上潜在的撕裂点,但是只能用于模拟低分辨率网格的纸片,不能有效地处理高分辨率的网格.同一年,Vassilev T I[9]改进质点弹簧模型,并将其运用在虚拟人体穿衣的系统中.2018年,Li J等人[10]提出一种用于自适应布料模拟摩擦、碰撞的解算器,应用于虚拟人体穿衣.2018年,Oh Y J等人[11]将层次模拟与深度神经网络相结合来模拟布料的摩擦、碰撞,计算布料碰撞的同时降低了时间成本,但未考虑底层网格对顶层网格质点的自适应变化.所以目前的层次模型不适合布料撕裂的模拟.

综上,布料撕裂模拟时,通过预先规定撕裂轨迹的模型其适应性较差,高分辨率网格计算消耗过大,实时性较差.本文通过使用基于位置动理学方法并引入撕裂率,以几何方法计算破损点周围质点撕裂率,准确预测下一个被撕裂质点的位置,避免规定撕裂轨迹的问题;优化Half-edge查找算法,提高布料撕裂模拟速度.

2 布料物理建模方法(基于位置动力学建模方法)

在计算机图形学中,尤其是在计算机游戏中,通常希望直接控制网格的对象或顶点的位置.经典的布料建模方法有:有限元法、质点弹簧模型以及基于位置动力学.有限元方法能够精确地模拟布料运动效果的同时,计算消耗大,远达不到实时性的要求;质点弹簧模型难以权衡精度和速度的追求,不适合高分辨率的实时模拟;基于位置动力学方法,使用各种约束方程跳过速度的计算,直接对质点位置起作用,使得布料系统在实时交互模拟方面占有巨大优势.

基于位置动力学方法的核心是布料内部受力保持线性动量公式(1)和角动量守恒公式(2).

(1)

(2)

其中,mi为质点的质量,pi为单位时间内位置的变化量,ri为质点的旋转半径.满足约束方程C(p+Δp)=0后,即可预测下一帧质点位置的变化量△p.由泰勒展开得公式(3).

C(p+Δp)≈C(p)+pC(p)·Δp

(3)

本文引入基于位置动力学方法跳过速度层,直接操纵质点位置的变化,提升了布料模拟的速度,更适合高分辨率布料网格的实时模拟.在保证布料模拟实时性的同时,模拟出更加逼真自然的撕裂效果.

3 布料撕裂算法

3.1 拉伸、碰撞引起的网格质点分裂模型

布料模拟中,其撕裂现象与摩擦、碰撞的区别在于布料网格的改变.当网格边受力超过指定的阈值时,选择分裂其相邻的两个质点,如果两个质点都可以被分裂,那么选择分裂质量高的质点,完成布料网格撕裂效果.而拉伸与碰撞由于受力方向不同,对于网格质点分裂也有区别.

如图1所示,在布料受到拉伸力引起的布料撕裂时,拉伸力与布料的处于同一平面上.在分裂质点确定之后,分裂出一个质点便可以达到布料撕裂的效果.

如图2所示,当布料与物体碰撞时,受力与布料处于不同的平面.在分裂质点确定之后,质点共享的面片数量确定需要分裂的质点数量.

3.2 破损点周围的撕裂

初次撕裂中网格质点分裂后,被分裂与分裂出的质点被称为破损点.张力持续在破损点附近增加时,撕裂倾向于继续扩大已撕裂的部分.破损点周围的质点在撕裂过程中受到影响,抗撕裂值降低.

图1 拉伸引起的网格撕裂Fig.1 Mesh tear caused by stretching

预先规定撕裂轨迹的原因是不能有效预测下一个撕裂质点的位置.本文通过计算破损部位周围质点撕裂率(tearValue),预测下一个最可能被撕裂质点位置.其原理是找到与力垂直方向角度相近边,这条边是力的主要对抗边.本文将力方向的垂直轴近似为撕裂线p2-p1,然后根据点积计算相邻粒子被撕裂的概率,如公式(4)中所示.

(4)

其中p1和p2是撕裂边缘矢量的两个顶点,p1是当前步骤的撕裂点,vicinity是p1周围的质点,(vicinity-p1)是可用的下一个撕裂边缘矢量.在撕裂过程中,下一个边与撕裂边缘之间的角度越大,其撕裂发生概率随tearValue线性增加.确定质点tearValue最大值之后,修改该质点的抗撕裂值(tearRes),方法如公式(5)中所示:

tearRes*=1-tearDeb

(5)

图2 碰撞引起的网格撕裂Fig.2 Mesh tear caused by collision

3.3 布料撕裂查找算法

本文通过引入Half-edge数据结构查找算法,为网格面片提供快速邻接查询,解决布料撕裂模拟中计算消耗大的问题,提升布料撕裂模拟速度.如图3所示为Half-edge结构图.

边e由e1和e2组成,每个边(He_edge)的结构体中包括相应的边和下一条边以及半边所在的三角面.Half-edge数据结构包括He_vert、He_edge以及He_face三种结构体.

实验数据表明:Half-edge数据结构的表示方法形成的结构体数量过多会增加计算开支.本文对Half-edge数据结构进行优化:将Half-edge数据结构中He_edge、He_face的结构体抽取融合,来减少运算中生成的结构体.本文将融合后的数据结构定义为ModEdge,如表1所示.

ModEdge数据结构抽取出了Half-edge半边数据结构的主要信息,减少布料模拟过程中生成结构体的数量,达到提升布料的撕裂模拟运算速度的目的.

图3 Half-edge结构图Fig.3 Half-edge Structure diagram

4 实验结果与分析

本文在Windows 10操作系统,Unity3D上使用C#实现了本文所述的算法,硬件系统:Intel(R)Core(TM)i7 CPU 4790 3.60GHz,8G RAM和NVIDIA Geforce GTX1060.本文已经进行了各种实验来分析所提出方法的性能.

表1 ModEdge 数据结构
Table 1 ModEdge deta structure

ModEdge数据结构structModEdge{intp1;inttriangleId1;intp2;inttriangleId2;intid;booltear;intpair;floatrest_length;}

表2以评估分裂顶点程序的性能记录了本文方法与文献[5]中拉伸造成的撕裂模拟实验数据对比,数据表明:当分辨率提高后,本文的方法在平均时间消耗上更少,在100*100的网格模拟中,减少一半的时间消耗.

表2 性能测试对比
Table 2 Performance test comparison

三角面数量方法 平均时间(ms)20∗2040∗4060∗6080∗80100∗100文献[5]15183762本文方法1213151730

图4中,a1…a5是文献[5]的实验效果,b1…b5是本文的实验效果.由布料褶皱的多少可以看出,本文实验所用的布料分辨率更高,撕裂效果更逼真自然.

图5中网格质点数为2540,实验模拟拉伸力造成布料的撕裂效果.固定布料的两边,并拉动布料的左侧.布料在极短的时间内破裂,并发生回弹的现象.使用改进的布料撕裂的算法,能够实时模拟逼真的撕裂效果.

通过以上实验可以看出:本文方法使用高分辨率网格模拟布料由于拉伸引起的撕裂,且能满足实时性的需求.

图6(a)是文献[11]布料在风场中受风力影响抖动的模拟,图6(b)是本文模拟风场中布料的撕裂过程.因为布料在风场中受到的风力始终在风向的小幅度内变动,所以布料在风场中受到垂直风场方向的切割,引发布料撕裂的现象.图6(a)文献[11]中布料褶皱的模拟僵硬、不自然;图6(b)为本文方法,使用3600个质点模拟了布料抖动现象的同时,加入撕裂效果.

图4 布料拉伸的撕裂Fig.4 Cloth stretch tear

图5 双边固定布料拉伸的撕裂Fig.5 Bilateral fixed fabric stretch tear

图7是模拟刚体与布料的交互效果,图7(a)模拟单个球体与布料的碰撞.图7(b)展示两个邻近的球体与布料的碰撞,模拟出两个球体碰撞生成一个撕裂轨迹的效果.图7(c)模拟不同位置、不同碰撞时间造成的撕裂效果.多组实验数据表明:本文方法在受到风场切割以及刚体碰撞的条件下,都能生成自然的布料撕裂效果.

图6 风场中布料的撕裂Fig.6 Tearing in the wind field

由以上实验数据可以看出,在布料拉伸、碰撞情境下,能够实时模拟出逼真、自然的撕裂轨迹.

5 结 语

本文通过优化Half-edge数据结构查找算法,并计算破损点周围质点的撕裂率值,成功完成拉伸、碰撞下布料撕裂的实时模拟.基于位置动力学方法规避了速度层的计算,直接控制布料质点的位置,大大缩减了布料质点和场景的交互时间,提高了布料模拟计算速度;利用几何法预测破损点周围最可能被撕裂的顶点,成功解决了撕裂轨迹不真实、需要提前规定撕裂轨迹的问题;考虑到布料撕裂模拟过程中,质点查找算法的重要性,在Half-edge的基本思想下,融合边、面结构体,减少撕裂模拟过程中生成的结构体数量,提升撕裂模拟速度.今后的研究中,我们将继续探索撕裂过程中不同属性布料的撕裂效果,进一步增加布料撕裂模拟的真实性.

图7 碰撞下的布料撕裂模拟Fig.7 Fabric tearing simulation under collision

猜你喜欢

风场质点数据结构
基于FLUENT的下击暴流三维风场建模
基于ADS-B的风场反演与异常值影响研究
Meteo-particle模型在ADS-B风场反演中的性能研究
巧用“搬运法”解决连续质点模型的做功问题
2021年天府机场地面风场特征分析
数据结构线上线下混合教学模式探讨
重典型应用,明结构关系
为什么会有“数据结构”?
质点的直线运动
质点的直线运动