Efficient elasticity for character skinning with contact and collisions部分翻译(碰撞检测部分)

7 约束和碰撞

我们使用点约束(point constraints),这样一方面施加软体约束(例如bone attachments),一方面解决物体之间的碰撞/自碰撞。特别地,我们在规则网格(lattices)上放一些代理点(proxy points),在这些点上记录力,并用三次插值法把这些力分配回六面体网格节点上(hexahedral cells)。[Sifakis et al. 2007]展示了这种方法的效率。

碰撞检测

对碰撞的响应(collision response)由一系列代理点决定,它们大致覆盖了碰撞表面。我们使用一种基于惩罚项(penalty)的响应方式,这个惩罚项取决于代理点处的穿透深度,以及该点的法向。对于刚体而言,我们直接用level set表示它,就能计算出代理点处的穿透深度。对于自碰撞(self-collision),由于物体迅速形变,导致难以每一步都精确地算出一个有向距离函数(signed distance function).

自碰撞穿透深度计算

在每个代理点处,我们先计算出来,它目前所处的那个,变形后的六面体格子。这一步可以用一个沿坐标轴对齐的(axis aligned)包围盒(bounding box)树结构来完成,其每个叶子节点包含一个变形后的六面体格。为了避免假阳性,我们不在物体坐标系(material coordinates)下去找周围一圈27个六面体格。在代理点附近的每个六面体格,都被切分成四面体(tetrahedralized),以计算出重心坐标,确定代理点在物体上的位置。对于每个物质点,我们查询之前储存的,静息状态下的level set值[latex]\phi_0[/latex].如果有多个负值,我们就取其中最接近零的那个[latex]\phi_0[/latex],来计算最接近静息状态下,表面上与之最接近的点。然后我们去找这个表面上的点,在变形后的位置,用来计算穿透深度[latex]|x_s-x_p|[/latex],其中[latex]x_s[/latex]是变形后的表面最近点,[latex]x_p[/latex]是代理点。

碰撞响应

对于自碰撞和互碰撞两种场景,我们都采用同样的方式处理。即:“生成”一个静息长度(rest length)为零的弹簧,一头连接代理点,一头连接表面最近点。其杨氏模量可以是各向异性的,突出法向。特别地,其能量函数为:[latex]\Psi(x_p,x_s)=k(x_p-x_s)^TM(x_p-x_s)/2[/latex],其中[latex]M=(1-\alpha)nn^T+\alpha I[/latex],其中[latex]\alpha\in[0,1][/latex].如果[latex]\alpha=1[/latex]那就是传统的各向同性弹簧。如果[latex]\alpha=0[/latex]那么就是标准的,点斥力(point repulsion).这种stiffness的各向异性,允许物体沿平面运动(垂直于穿透方向)。在实践中,我们发现[latex]\alpha\in[0.1,0.5][/latex]对自碰撞效果最好,而[latex]\alpha=0[/latex]对物体之间的互碰撞就足够了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注