动态优化骨骼蒙皮权重

动态优化骨骼蒙皮权重

现在最流行的静态骨骼蒙皮技术为热传导蒙皮算法和测地线体素蒙皮算法,但它们对动态姿势不一定最优,当运动幅度较大时,可能会出现明显的异常变形。

通过对一系列姿势逆向分解成最优的骨骼权重是一个研究方向,GitHub上EA的开源项目Dem Bones实现了《Smooth Skinning Decomposition with Rigid Bones》论文,我粗略看了一下它的命令行用法,需要提供一系列不同姿势的模型序列(abc格式)作为输入,并且每一个姿势只能旋转一根骨骼,条件很苛刻,无法实用。

所以我想,如果要从头实现一个动态优化骨骼蒙皮的算法,该怎么做呢?

为简单问题,先只考虑一个顶点,假设这个顶点受到三根骨骼的影响,这三根骨骼都各自旋转了不同的角度,驱动这个顶点移动到新位置,如果已知这个新位置,能否反向求出三根骨骼的权重?

我想应该是可以的,从解方程的角度,三个未知数,给定三个独立的条件,有唯一解。用线性代数的术语来说,就是三个独立的列向量的线性组合可以张成整个三维空间,如果已知了三个列向量和它们的线性组合,那么权重系数是唯一确定的。

如果用一种平滑算法,比如著名的Delta Mush平滑算法,去纠正原始的骨骼蒙皮算法在大幅度运动时带来的异常变形,就可以让这个顶点在两种算法的双重作用下移动到最优位置,根据上面的分析,我们可以从这个最优位置反过来推出最优骨骼权重。

分析了三根骨骼的情况,如果一个顶点受到更多的骨骼影响呢?比如四个、五个、六个,甚至八个,怎么办?从解方程的角度看,如果未知数的个数增加了,给定的条件也应该增加,才能有解。增加姿势就相当于增加条件,每增加三个未知数需要增加一个独立的姿势。如果独立姿势的数量超过了所需,即存在许多冗余的姿势,方程组仍然有解,可以用最小二乘法得到满足所有姿势的近似最优解。

一个骨架包含的骨骼数量一般在200以内,通常不超过400。如果按300算,那么就需要100个独立的姿势,我们再多提供1倍的姿势来保证方程一定有最优解,那么就需要200个独立的姿势,因为一个姿势本身就是3维的,所以实际线性方程的数量为姿势的3倍。

线性方程组表示为Ax=b,其中,A为600x300的矩阵,x为1x300的矩阵,b为600x1的矩阵。

这还只是一个顶点的运算量,如果模型有成千上万个顶点,运算的速度可想而知会有多慢。

奇异值分解可以起到加速的作用,我们可以对A进行奇异值分解,只保留前N个最大的奇异值,因为影响顶点的骨骼数通常不超过8,矩阵的秩应该也不超过8,所以我们可以假设N不超过8,运算量会减少到原来的(8/300)*(8/300)= 0.0007,大约为0.01%,能加速10000倍;如果骨骼的数量为80,(8/80)*(8/80)= 0.01,为原来的1%,能加速100倍。

从上面的分析来看,用奇异值分解的办法解线性方程组,可以加速100倍以上,还有什么加速的办法呢?能否减少冗余姿势的数量?从而减少方程的个数?

如果要减少冗余姿势的个数,就要保证,每一根骨骼的旋转在每一个姿势中都是尽量不同的,这显然很难做到,即使是动态捕捉的数据也无法保证这一点。

有一个解决办法,我们可以用随机数为每一根骨骼在绑定姿势的基础上生成小范围的随机旋转量,每一个姿势看起来就是所有的骨骼都在绑定姿势附近随机抖动。

另一个加速途径是减少待优化的顶点数量,因为大部分顶点是不需要优化的,只有少数异常变形的顶点才需要处理,所以我们可以检测平滑前后的位置差,过滤掉大多数位置变化较小的顶点,只针对位置明显变化的顶点做优化,假设只有1%的顶点需要做优化,我们又可以在原来的基础上加速100倍。

如果人为限制顶点受影响的骨骼范围,排除掉距离远的骨骼,比如头部的顶点肯定不受腿骨的影响,连奇异值分解都省了,速度更快。

按测地线距离过滤是一个办法,但测地线需要体素,从而引入更复杂的问题;如果用欧式距离,也有问题,左腿的骨骼可能会影响右腿的顶点。

所以,人为限制顶点受影响的骨骼范围的方法,还是暂不考虑吧。

我能想到的就是这些了,希望能启发大家的思路。

后续:

经过两周的努力,终于实现了这个功能,是用Python+Numpy开发的,奇异值分解有点出乎意料,最多只能压缩30-50%,可能是因为稠密矩阵的原因。

最后采用了伪逆求解线性方程组,因为比奇异值分解快一点,也没有人为限制骨骼数,所有骨骼都参与运算,效果还是不错的。

最后奉上链接:http://www.mesh-online.net/bake.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值