实时渲染(第三版):第四章 转换 4.4 顶点混合

来源:互联网 发布:网络机顶盒无电视猫 编辑:程序博客网 时间:2024/05/21 12:41
 

4.4 顶点混合

想象一下动画一个数字角色的胳膊的情况,使用两个部分,前臂和上臂,如图4.10所示。可以对它们使用刚体转换进行动画操作。但之后这两个部分之间的关节就不像是真实的臂肘。这是因为使用了两个单独的对象,而关节由这两个单独对象的重叠部分组成。显然,使用一个对象会比较好。但是,静态模型部分不会解决关节的灵活问题。


图 4.10 左侧,对组成胳膊的两个单独的部分(前臂和上臂)使用刚体转换进行动画操作。关节看起来不真实。而右侧,使用的是顶点混合,针对的是单一的对象。右侧中间的胳膊演示直接使用简单的皮肤连接两个部分覆盖臂肘时发生的情况。最右边的图像使用了顶点混合,一些顶点被用不同的权重进行混合:(2/3,1/3)表示使用上臂的2/3转换,前臂的1/3转换。该图像也显示了顶点混合的一个缺陷:臂肘内弯的折叠。使用更多的骨骼,选择更适合的权重可以获得更好的结果。

    顶点混合是解决该问题的一个可行方案。该技术有其他几种叫法,如蒙皮(skinning),包络(enveloping),子骨骼空间变形等。虽然此处介绍的算法的确切起源不明,但定义骨骼并让皮肤对改变做出反映在计算机动画中已是一个很老的概念。以其最简单的形式,前臂和上臂如前各自动画,但在关节处,两个部分通过弹性的“皮肤”进行连接。这个弹性部分,拥有两组顶点,其中一组被前臂矩阵转换,另一组被上臂矩阵转换。这就导致一些三角形,它们的顶点可能由不同的矩阵转换。参考图4.10。这种基本的计算有时也叫拼接(stitching)。

    更进一步,可以让一个顶点被几个不同的矩阵转换,为产生的结果位置标上权重,然后混合到一起。这需要赋予动画对象一个骨架,每块骨头的转换都会按照用户指定的权重影响各个顶点。整个胳膊是弹性的(如,所有的顶点都可能被一个以上的矩阵所影响),整个网格通常叫做皮肤(在骨头之外)。参考图4.11。许多商业建模系统拥有这种相同的骨骼建模特性。尽管它们的名称,骨头并不需要一定是刚性的。例如,Mohr 和 Gleicher 介绍了一种思想,添加额外的关节以产生肌肉隆起之类的效果。James 和 Twigg 讨论了使用可以压缩和拉伸的骨头的动画蒙皮。


图 4.11 顶点混合的真实示例。左上角的图像显示了胳膊的两个骨头。右上角显示了网格,其中的颜色表示顶点属于哪块骨头。下方是着色后的胳膊网格。

    数学上,这表示为公式4.56,其中p是原始顶点,u(t)是转换后的顶点(其位置依赖于时间t)。影响p位置的有n个骨头,p用世界坐标表示。矩阵Mi将初始骨头坐标转换为世界坐标。通常,一块骨头在其自身坐标系的原点拥有控制关节。比如,前肢骨头移动其臂肘关节到原点的同时,也被动画旋转矩阵绕着关节旋转。Bi(t)矩阵是第i个骨头的世界转换(该转换随着时间而改变,以动画对象),它通常是若干个矩阵(如上级骨头的转换和局部动画矩阵)的串联。Woodland 深入讨论了一种维护和更新Bi(t)矩阵动画函数的方法。咀咒,wi是骨头i的权重。顶点混合公式为:

各个骨头转换顶点到一个相对于其自身参照系的位置,最终的位置根据这些计算出来的值进行插值。矩阵Mi在一些蒙皮讨论中没有明确显示,而是作为Bi(t)的一部分。我们此处介绍它,是因为它是一个有用的矩阵,几乎总是矩阵串联过程的一部分。

    实际应用中,我们为每个骨头、每个动画帧串联矩阵Bi(t)和Mi-1,并使用结果矩阵转换顶点。顶点p被不同的骨头的串联矩阵所转换,然后使用权重wi混合--这就是顶点混合。权重是非负数值,和为1,因此,发生的事情是,顶点被转换到一些位置,然后在这些位置中插值。如此,转换后的点u将位于凸包(Bi(t)Mi-1p,i=0...n-1,t为定值)中。法线通常也可以使用公式4.56转换。根据所使用的转换(如,骨头被拉伸或压缩了一个可观的数量),可能需要使用Bi(t)Mi-1的逆转替代,如节4.1.7所述。

    顶点混合很适合于GPU。网格中的顶点可以放置到一个静态缓冲(数据仅发送给GPU一次,但会被多次使用)中。每个帧中,只有骨头矩阵发生改变,用顶点着色器计算它们在存储的网格上的效果。通过这种方式,在CPU上处理和从CPU传送的数据的数量被最小化,让GPU可以高效地渲染网格。如果可以一起使用模型的整套骨头矩阵,则它是最简单的;否则,就必须分割模型,并复制一些骨头(DirectX提供了一个工具ConvertToIndexedBlendedMesh来执行这种分割)。

    当使用顶点着色器时,指定范围在[0,1]之外且和不为1的几组权重也是可以的。不过,这仅当使用其他的混合算法(如变形目标,参考节4.5)时才有意义。


图 4.12 左边显示了使用线性混合蒙皮时关节处发生的问题。右边,使用双四元组的混合改善了外观。

    基本顶点混合的一个缺陷是可能发生不期望的折叠、扭曲和自相交。参考图4.12。最好的方案之一是使用双四元组。这个执行蒙皮的技术有助于保留原转换的刚性,避免了四肢的“糖果包装”扭曲。计算量小于1.5×的线性皮肤混合消耗,而结果更好,这也是该技术被快速采用的原因。