基于HRBFs的人体与服装模型碰撞检测和处理方法

文档序号:25220370发布日期:2021-05-28 14:21阅读:212来源:国知局
基于HRBFs的人体与服装模型碰撞检测和处理方法

本发明涉及基于hrbfs的人体与服装模型碰撞检测和处理方法。



背景技术:

在虚拟试衣系统中,服装模型具有丰富的褶皱细节、且极易变形,不可避免的会与人体模型产生碰撞、互相穿透,因此碰撞检测和处理是决定试衣效果的关键因素。如何快速检测出服装与人体模型之间的碰撞并做出符合物理规律的响应是影响试衣体验的关键问题。

碰撞检测实质是判断服装模型与人体模型的基本组成元素在三维空间是否相交,一般分为连续碰撞检测和离散碰撞检测。

1、离散碰撞检测方法:主要是检测某一时刻t的两个静态模型是否发生穿插,并返回具体的碰撞信息,如穿插深度、发生穿插的多边形网格的序号等。目前常用的经典算法有基于层次包围盒的碰撞检测算法、基于空间分解的碰撞检测算法、基于图像空间的碰撞检测算法。

2、连续碰撞检测方法:主要是检测两个模型在一段时间间隔的运动过程中有没有碰撞,如果发生碰撞就返回第一次碰撞的具体信息。

碰撞处理是通过改变发生碰撞的基本元素的位置,来矫正服装与人体模型的相交、穿透,并尽量使变形的服装模型符合实际现象。针对动态,静态的物体模型有不同的处理方式。

1、基于物理模型的碰撞处理方法:运用物理学原理来实现仿真,如质点-弹簧法、有限元法、无网格法等。

2、基于几何模型的碰撞处理方法:本质是将发生碰撞的基本元素在三维空间移动,直至无碰撞,在此基础上改进的优化网格变形算法则是同时考虑了非碰撞元素的随动情况。

近年来,有大量学者在研究碰撞检测算法。有学者对刚性体的碰撞检测进行了研究,通过求解碰撞方程判定是否发生碰撞,但求解过程耗时。manocha等人提出给基本图元标记特征三角对,避免重复测试。国内学者提出通过基于层次剔除的碰撞检测来减少不必要的精确计算,提高柔性织物模拟中的碰撞检测效率。又有学者研究根据三维模型的拓扑信息构建层次包围盒,可以排除大多数没有发生碰撞的三角对。

大多数碰撞处理方法是基于历史的,不能处理预先存在的碰撞。空气网格方法就是一种基于历史的碰撞处理模型,它能记住预处理时的无碰撞状态。然而,预先存在的碰撞经常出现在虚拟试衣系统和服装合成等应用中,由于没有无碰撞的初始状态供参考,因此需要进行预处理。volino等人提出了一种交叉轮廓最小化方法,它既不依赖于历史也不依赖于方向,可以处理任何类型的轮廓。然而忽略了在没有历史记录和方向的情况下,将两个碰撞表面分开经常会表现出不可预测的收敛行为。有学者提出使用三角形法线判断一个顶点是否穿透其他物体,但没有给出实现细节。还有学者提出了一个非常详细的算法,致力于解决如何将穿透人体的布料顶点移出人体的问题。对于每个布料碰撞点,找到与它最接近的人体模型顶点,然后将布料碰撞点沿着该人体模型顶点的法向量方向移动。因为仅处理碰撞点而不考虑全局,此方法不稳健,但值得参考改进。



技术实现要素:

发明目的:本发明所要解决的技术问题是针对现有技术的不足,提供基于hrbfs的人体与服装模型碰撞检测和处理方法,该方法以三维服装、人体模型为对象,利用hermit径向基函数对多个三维模型进行碰撞检测,结合网格形变算法进行碰撞处理,最终通过布料仿真来实现计算机中三维人体试衣的效果。该方法的主要步骤包括:利用人体特征尺寸和关节点信息生成三维人体模型;对所有选择的服装模型和人体模型进行碰撞检测和处理;对服装模型进行布料仿真,并展示人体试衣效果。本发明能够使互相穿透的人体、服装模型达到无碰撞的效果,不需要进行手动调整,具有一定的通用性和实用性。

基于hrbfs的人体与服装模型碰撞检测和处理方法,包括以下步骤:

包括如下步骤:

步骤1,根据骨架参数构建人体模型;

步骤2,构建人体隐式曲面函数;

步骤3,构建人体、服装模型层次包围盒树;

步骤4,进行服装与人体间的碰撞检测;

步骤5,进行碰撞处理和网格变形;

步骤6,布料模拟并展示渲染结果。

步骤1包括:

读取人体骨架关节点和特征尺寸的文件,将人体划分成静态区块和动态区块。

静态区块是使用插值样条曲面建立的适合于人体尺寸的三维曲面模型,以关节点为基准,根据特征尺寸和骨架比例关系,采用插值样条曲面对人体静态区块构建曲面模型,同时获得人体各部位模型生成点的法向量;

动态区块是根据关节点位置以及对应两端静态区块的端口截面来生成的一系列连接截面,这些沿着骨骼方向的一系列连接截面最终构成连接各静态区块的网格模型;

在静态和动态区块构建完成后,将其拼接得到一个闭合的三维人体模型,进一步对拼接处进行平滑优化处理,得到最终的三维人体网格模型。

步骤2包括:

三维人体网格模型有n个顶点,将所有顶点作为采样点,在三维空间中,有n个已知的hermite数据xi是采样点的坐标,ni是顶点的法向量,每个hermite数据带有一个值fi,该值描述了采样点和隐式曲面的位置关系;

接下来的目标是要找到一个隐式曲面函数f来描述三维人体曲面模型,必须满足如下条件:有f(xi)=fi并且找到一个使能量函数最小的解,即最小广义插值函数f*,并且这个最优解是唯一的,形式如下:

其中,是f(xi)的导数,x表示空间中的任意一点,ψ(x)=φ(‖x‖)是径向基函数;其中未知的标量系数和向量系数由f*(xi)=fi这两个插值条件唯一确定:

其中h是hessian算子,xj是第j个顶点;(h)ij代表h的第i行第j列元素;

接下来需要求解αi和βi得到f*的具体表达式,通过组装相关矩阵得到形如aα=c(这里没有意义,是线性方程组的形式)的形式:有:

然后解线性方程组就能求得未知系数αi和βi

将系数带入(1)得到人体的隐式曲面函数f*(x),f*(x)=0即隐式曲面函数的0等值面描述了人体模型的网格表面;对于空间中任意一点x,f*(x)>0说明点在曲面外部,f*(x)<0说明点在曲面内部,由此能够判断一个点和人体三维网格模型的位置关系。

步骤3包括:读取服装模型文件,并指定服装类型,服装模型是由三角面片组成的网格模型,三角面片的法线指向模型表面外侧;服装模型是流形;服装模型文件为obj格式;

根据服装模型的类型初始化服装模型的基本信息;

自上而下的构建人体、服装模型的18-dops层次包围盒树,18-dops包围盒是一种由一组半空间hi确定其面的封闭几何空间,18个固定的方向集(d1,d2,……,d18)决定了半空间的外法向;选取方向完全相反且共线的向量对作为固定法向,则只使用了9个方向,正方向为(1,0,0)、(0,1,0)、(0,0,1)、(1,1,0)、(1,0,1)、(0,1,1)、(1,-1,0)、(1,0,-1)、(0,1,-1),反方向为(-1,0,0)、(0,-1,0)、(0,0,-1)、(-1,-1,0)、(-1,0,-1)、(0,-1,-1)、(-1,1,0)、(-1,0,1)、(0,-1,1),用矩阵形式来表示半方向集d:

将一个三角面片的三个顶点与半方向集d中第一个方向(1,0,0)分别做点积,得到的最大值就是该方向上的最大延伸。例如一个三角面片的三个顶点坐标分别为(2,1,4)、(6,2,3)和(4,6,2):

(1,0,0)·(2,1,4)=2

(1,0,0)·(4,6,2)=4

(1,0,0)·(6,2,3)=6

最大值为6,所以该三角面片在第一个方向(1,0,0)上的最大延伸是6。

计算半方向集中每一个方向的最大延伸得到一个三角面片的包围盒。

选择自顶向下的方法来构造层次包围盒树,层次包围盒树是一棵二叉树。将一个三维网格模型的全部三角面片称作全集s,从全集s开始,将其当作根结点,然后根据整个集合的特征递归的进行左、右结点划分,直到每个结点中只有一个元素;左、右结点的划分方法为,取当前包围盒9个固定方向中的最长轴线的中点进行划分,计算当前包围盒中每个三角形的重心属于划分后的哪一部分,对每一部分重新计算包围盒;对新结点继续进行划分,直到包围盒中只有一个元素;树的根节点记录整个模型(是任意模型,在本发明方法里既要构造人体模型的包围盒树,也要改造服装模型的包围盒树)的包围盒以及所有三角面片、顶点信息;树的子结点记录了其所包含的三角面片、顶点信息以及这部分模型的包围盒。

步骤4包括:将碰撞检测分为宽阶段和窄阶段:

宽阶段是包围盒碰撞检测,比较人体包围盒树(步骤3自上而下的构建人体、服装模型的18-dops层次包围盒树)的根结点与服装包围盒树的根节点重叠与否,如果不重叠返回没有发生碰撞的信息;如果重叠,沿着服装模型的包围盒树向下遍历左右子结点,当子结点只包含一个三角面片,再用所述三角面片遍历人体模型的包围盒树,直到结点中都只有一个三角面片,得到可能发生碰撞的三角面片对以及可能在人体内部的服装模型顶点集;

随后进入窄阶段的碰撞检测:窄阶段需要逐一检测服装模型顶点集中的顶点是否在人体内部,将每个可能在人体内部的服装模型顶点x,带入步骤2求得的人体隐式曲面函数计算f*(x),f*(x)<0的点就是在人体内部的点,即碰撞点。

步骤5包括:根据碰撞点函数值来进行碰撞处理,首先利用2元合成算子实现隐式解缠,描述了与人体模型无碰撞的服装模型曲面,通过二元合成算子来构造

其中碰撞点是服装模型网格顶点,所以是碰撞检测窄阶段求得的隐式曲面函数值;

将碰撞点沿梯度方向投射到的零等值面上,实现将人体内部的服装模型顶点移出人体。

步骤5还包括:结合arap网格变形(as-rigid-as-possiblesurfacemodeling,类似刚性网格变形)算法来进行优化,具体包括:

arap网格变形的过程中,每个顶点和与其相邻的边构成一个变形单元,在变形过程中,每个变形单元只进行旋转变换,使得变形过程中每个点在其1-邻域中的相对位置不发生改变,即对点vi和其每个相邻点vj,旋转矩阵ri,满足:

v′i-v′j=ri(vi-vj)

其中,vi是第i个点,vj是vi的第j个相邻点,v′i、v′j是vi、vj移动后的新位置;

给定变形约束,对每一个顶点,定义能量损耗函数f(v′,ri):

其中ri为每个顶点的最优旋转矩阵,wij为边ij的权重,则变形前后整个网格的能量损耗函数为:

其中,v是顶点集,ni是vi的1-邻域点的索引集合;

通过最小化上述能量损耗函数实现最优变形,上式中需要求解的未知量为所有非约束顶点的v′i和r,将r和v′i依次看作已知量进行求解,r已知时,只需对v′求偏导,使偏导值为0,得到最优v′;当v′已知时,求出从任意初始v′开始,依次固定v′、r′,直至能量损耗最终收敛,最终得到的v′即为变形结果;

将碰撞点作为变形的控制点,将碰撞点的k邻域作为变形的固定点,控制点和固定点组成移动点,将控制点的目标位置和固定点的当前位置作为变形约束,根据所述arap网格变形算法计算出移动点的新位置,得到变形后的服装模型。

步骤6包括:将服装模型加入flexclothwrapper容器,将人体模型加入flexcolliderwrapper容器,设置布料相关参数运行动态仿真,计算得到下一帧的服装模型顶点位置;对人体模型和下一帧服装模型进行碰撞检测,如果发生碰撞转到步骤5,如果没有碰撞就展示所有模型的渲染结果。

本发明具有如下有益效果:

(1)将碰撞检测分为了宽阶段和窄阶段,在宽阶段利用特性简单的包围盒包裹复杂模型来简化并加速碰撞检测,快速排除大量不相交区域,提高了检测效率,减少了窄阶段的计算量。

(2)碰撞检测窄阶段利用隐式曲面方程表示模型表面,不仅可以精确的检测出顶点在模型的内部、表面还是外部,还能得到具体的相对位置关系。隐式曲面函数的一阶导数表示了曲面上点的梯度方向,是碰撞处理需要的关键信息。

(3)结合hrbfs的碰撞处理能够通过提取不同的等值面表现出服装模型的厚度;并且改用多元合成算子后能够处理多模型的相交解缠。

(4)结合arap的模型形变能够保证服装模型不发生扭曲突变,同时保持一定的细节特征。

本发明方法实现了一个完整的虚拟试衣流程,具有一定的通用性和实用性。

附图说明

下面结合附图和具体实施方式对本发明做更进一步的具体说明,本发明的上述和/或其他方面的优点将会变得更加清楚。

图1是本发明方法流程图。

图2是碰撞检测流程图。

图3是虚拟试衣流程图。

图4a、图4b、图4c是效果图。

具体实施方式

如图1、图2、图3所示,本发明提供了一种用于计算机虚拟试衣的碰撞检测和处理方法,包括如下步骤:

步骤1,根据骨架参数构建人体模型:

读取人体骨架关节点和特征尺寸的文件,将人体划分成形变上静态、动态的多个区块。静态区块是使用插值样条曲面建立的适合于人体尺寸的三维曲面模型,以关节点为基准,根据特征尺寸和骨架比例关系,采用插值样条曲面对人体静态区块构建曲面模型,同时获得人体各部位模型生成点的法向量。动态区块则是根据关节点位置以及对应两端静态区块的端口截面来生成的一系列连接截面,这些沿着骨骼方向的截面最终构成连接各静态区块的网格模型。在静态和动态区块构建完成后,将其拼接得到一个闭合的三维人体模型,为了使得整体网格光顺,进一步对拼接处进行平滑优化处理,得到最终的三维人体网格模型。这种建模方法效率更高且具有更高的灵活性,通过骨架关节点的改变可以改变人体姿势,通过特征尺寸的改变可以改变人体体型,为更加方便地控制和改变人体提供了可能。文献1:熊昌泰.面向虚拟试衣的实时三维人体建模及系统实现[d].南京大学,2018对三维人体建模做了详细介绍。

步骤2,构建人体隐式曲面函数:

根据人体网格模型中的顶点和顶点法向量信息,构建人体隐式曲面函数。

隐式曲面可以用来表示三维几何形体,径向基函数(rbf)是隐式曲面重建算法中被广泛运用的一种,rbf隐式曲面重建本质是一个插值过程,hrbf是基于rbf对一阶hermite数据的插值方法,一阶hermite数据是包含点和相应法向量的数据,使得不用额外引入偏移点就能得到非平凡解。

三维人体网格模型有n个顶点,将所有顶点作为采样点。所以在空间中,有n个已知的hermite数据xi是顶点的坐标,ni是顶点的法向量,每个数据带有一个值fi,该值描述了采样点和隐式曲面的位置关系。因为顶点在人体模型表面,所以fi=0。

接下来的目标是要找到一个隐式曲面函数f来描述三维人体曲面模型,必须满足如下条件:有f(xi)=fi并且这样的函数不是唯一的,但可以找到一个使能量函数最小的解,即最小广义插值函数f*,并且这个最优解是唯一的,形式如下:

x表示空间中的任意一点,xi是采样点,ψ(x)=φ(‖x‖)是径向基函数。其中未知的标量系数和向量系数由f*(xi)=fi这两个插值条件唯一确定:

其中h是hessian算子,

接下来需要求解αi和βi得到f*的具体表达式,通过组装相关矩阵得到形如aα=c的形式:

然后解线性方程组就能求得未知系数αi和βi

采用紧支撑径向基函数:

将系数和径向基函数带入(1)得到人体的隐式曲面函数f*(x),f*(x)=0即隐式曲面函数的0等值面描述了人体模型的网格表面。对于空间中任意一点x,f*(x)>0说明点在曲面外部,f*(x)<0说明点在曲面内部,由此可以方便的判断一个点和一个三维网格模型的位置关系。

步骤3,构建人体、服装模型层次包围盒树

读取服装模型文件,并指定服装类型(上衣、裤子、连衣裙、短裙)。本发明中要求服装模型必须是由三角面片组成的网格模型;三角面片的法线指向模型表面外侧;模型必须是流形;模型文件为“.obj”格式。

根据服装模型的类型初始化服装模型的基本信息。例如读取的是“sweater.obj”文件,类型为上衣,将模型网格数据存入cgal::surface_mesh类中。surface_mesh类是半边数据结构的实现,它是基于索引的,使用整数索引作为顶点、半边、边缘和面的描述符,由于索引是连续的,因此它们可以用作存储属性的向量的索引。半边数据结构最大特点是半边,把一条边保持长度不变,形式上分为两个半边,每个半边都是一个有方向,方向相反。如果一个边被两个面共用,则每个面都能各自拥有一个半边。如果一个边仅被一个面占有(边界边),则这个面片仅拥有该边的其中一个半边。半边数据结构的三个重要的数据结构分别是顶点、半边、面片。顶点包含出半边的指针或索引;半边包含起始点、邻接面、下一条半边、上一条半边的指针或索引;面片包含一条起始边的指针或索引。根据半边数据结构的特性,可以容易的找到网格模型的边缘,从而得到上衣模型的领口、袖口、下摆的位置。

自上而下的构建人体、服装模型的18-dops层次包围盒树,,核心在于利用特性比较简单的几何空间包裹住复杂的三维网格模型,加速碰撞检测。18-dops包围盒是一种由一组半空间hi确定其面的封闭几何空间,18个固定的方向集(d1,d2,……,d18)决定了这些半空间的外法向。为了方便,选取方向完全相反且共线的向量对来作为固定法向,所以实际上只使用了9个方向。正方向为(1,0,0)、(0,1,0)、(0,0,1)、(1,1,0)、(1,0,1)、(0,1,1)、(1,-1,0)、(1,0,-1)、(0,1,-1),反方向为(-1,0,0)、(0,-1,0)、(0,0,-1)、(-1,-1,0)、(-1,0,-1)、(0,-1,-1)、(-1,1,0)、(-1,0,1)、(0,-1,1)。可以用矩阵形式来表示半方向集d:

一个三角面片的18-dops包围盒可以通过计算固定方向集d中每一个方向与三角形顶点的最大点积得到,其中的最大值作为模型各方向上的最大距离,最小值作为最小距离。计算有n个顶点的三维模型的k-dops包围盒可以在o(kn)时间内完成。例如三角形t的顶点坐标分别为(2,1,4)、(6,2,3)和(4,6,2)。通过依次计算d中的每一个方向向量和三角形三个顶点的点积得到这个三角形的包围盒。例如,要找到方向(1,0,0)上的最大延伸,计算三个顶点的点积:

(1,0,0)·(2,1,4)=2

(1,0,0)·(4,6,2)=4

(1,0,0)·(6,2,3)=6

最大值为6,所以x在(1,0,0)上的最大延伸是6,同时(-1,0,0)是d中和(1,0,0)方向相反的向量,所以x的顶点与(1,0,0)的点积的最小值就是x在(-1,0,0)上的最大延伸。通过计算固定方向集d其它方向上的点积,可以很容易得到点的包围盒。

选择自顶向下的方法来构造层次包围盒树,核心是要把一个模型划分为若干不相交的子集。层次包围盒树本质是一棵二叉树,从模型全集s开始,将其当作根结点,然后根据整个集合的特征递归的进行左右结点划分,直到每个结点中只有一个元素。左右结点的划分方法为,取当前包围盒9个固定方向中的最长轴线的中点进行划分,计算当前包围盒中每个三角形的重心属于划分后的哪一部分,对每一部分重新计算包围盒。对新结点继续进行划分,直到包围盒中只有一个元素。树的根节点记录整个模型的包围盒以及所有三角面片、顶点信息。树的子结点记录了其所包含的三角面片、顶点信息以及这部分模型的包围盒。

步骤4,服装与人体间的碰撞检测。

将碰撞检测分为宽阶段和窄阶段。

宽阶段主要是包围盒碰撞检测,比较人体包围盒树的根结点与服装包围盒树的根节点重叠与否。如果不重叠返回没有发生碰撞的信息;如果重叠,沿着服装模型的包围盒树向下遍历左右子结点,当子结点只包含一个三角面片,再用该三角面片遍历人体模型的包围盒树,直到结点中都只有一个三角面片,得到可能发生碰撞的三角面片对以及可能在人体内部的服装模型顶点集。

随后进入窄阶段的碰撞检测。窄阶段需要逐一检测顶点集中的顶点是否在人体内部,得到精确的碰撞点信息。将每个可能在人体内部的服装模型顶点x,带入步骤2求得的人体隐式曲面函数计算f*(x),f*(x)<0的点就是真正在人体内部的点,即碰撞点。

步骤5,碰撞处理和网格变形:

根据碰撞点函数值来进行碰撞处理。首先利用2元合成算子实现隐式解缠。描述了与人体模型无碰撞的服装模型曲面,通过二元合成算子来构造

其中碰撞点是服装模型网格顶点,所以是碰撞检测窄阶段求得的值。

然后将碰撞点沿梯度方向投射到的零等值面上,实现将人体内部的服装模型顶点移出人体。为了保持服装模型的细节特征和模型表面光顺,还需结合arap网格变形算法来进行优化。

arap变形的过程中,每个顶点和与其相邻的边构成一个变形单元,在变形过程中,每个变形单元只进行旋转变换。使得变形过程中每个点在其1-邻域中的相对位置不发生改变。即对点i和其每个临点j,旋转矩阵ri,满足

v′i-v′j=ri(vi-vj)

实际上,由于不同顶点的相互影响,每个顶点的最终位置由多个临点构成的多个旋转单元共同决定。给定变形约束,对每一个顶点,可定义能量损耗函数:

其中ri为每个顶点的最优旋转矩阵,wij为边ij的权重,本文使用余切权重。则变形前后整个网格的能量损耗为

arap变形的核心思想即为通过最小化上述能量损耗函数实现最优变形。

上式中需要求解的未知量为所有非约束顶点的v′i和r。常使用两部迭代法,将r和v′i依次看作已知量进行求解。r已知时,只需对v′求偏导,使偏导值为0,得到最优v′;当v′已知时,可求出从任意初始v′开始,依次固定v′、r′,直至能量损耗最终收敛,最终得到的v′即为变形结果。

将碰撞点作为变形的控制点,将碰撞点的k邻域作为变形的固定点(本方案将k设为3),控制点和固定点组成移动点,将控制点的目标位置和固定点的当前位置作为变形约束,根据上述arap变形方法计算出移动点的新位置,得到变形后的服装模型。

步骤6,布料模拟并展示渲染结果:

服装布料模拟阶段借助flex提供的框架实现的服装仿真。将服装模型加入flexclothwrapper容器,将人体模型加入flexcolliderwrapper容器,然后设置布料参数,将拉伸刚度设为1.0,弯曲刚度设为0.6,弹性系数设为0.6,运行动态仿真,计算得到下一帧的服装模型顶点位置。对人体模型和下一帧服装模型进行碰撞检测,如果发生碰撞转到碰撞处理步骤,如果没有碰撞就展示所有模型的渲染结果。图4a、4b中,左边一列是初始状态互相穿透的服装、人体模型;中间一列是使用本方法碰撞检测和处理以后的人体、服装网格模型,可以看到人体、服装不再互相穿透;右边一列是渲染结果。图4c左边一列是初始状态互相穿透的服装、人体模型;右边一列是使用本方法碰撞检测和处理以后的人体、服装模型渲染结果,人体、服装不再互相穿透。

本发明提供了一种用于计算机虚拟试衣的碰撞检测和处理方法,具体实现该技术方案的方法和途径很多,以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。本实施例中未明确的各组成部分均可用现有技术加以实现。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1