游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1575|回复: 0

线性蒙皮分解算法及其在游戏中的应用

[复制链接]

1万

主题

1万

帖子

3万

积分

论坛元老

Rank: 8Rank: 8

积分
36572
发表于 2020-3-4 14:59:19 | 显示全部楼层 |阅读模式
v2-eb663652af3f349edcee2c95fc1d86c3_1200x500.jpg

2K20开发终于又进入了尾声,我也就又来更新文章了!

今天给大家介绍一种线性蒙皮分解算法,简称SSDR(Smooth Skinning Decomposition With Rigid Bones)。SSDR模型可以从一系列动作中分解出线性蒙皮数据,从而通过一定数量的骨骼和顶点权重图来近似拟合出模型的形变。

为什么要分解和使用线性蒙皮?线性蒙皮(Linear blend skinning)这个概念对于做游戏或者动画专业的同学必然不会陌生。因为其简单,高效相比去对偶四元数蒙皮(Dual Quaternion Skinning)更加广泛的被工业界使用。这个概念在Maya里被称作Smooth Skinning, 在3D studio Max里叫做Bones Skinning, 以及在Blender里叫Blend Skinning。在游戏开发中,blendshape或者simulation cache这些顶点动画对于无论GPU还是内存都是极其昂贵的。

举个例子:如果这样一组83个表情进入游戏,每个表情需要记录5000个顶点位置,那么总共我们需要记录 83 * 5000个位置。但是如果我们可以将这么多表情分解成X个骨骼驱动的蒙皮动画,我们就只需要存储一张顶点权重图和83 * X个位置了。


1 (1).gif
blendshape表情

结合动画压缩技术以及硬件加速渲染的技术,如果可以通过SSDR模型将这一系列形变分解出蒙皮动画,这可以大大帮助游戏的性能优化的。

先上结果:

2 (1).gif
200个骨骼的线性蒙皮结果

3 (1).gif

除了应用在人物表情上,SSDR模型还可以将各种simulation的结果转化成骨骼驱动的蒙皮,比如衣料模拟,肌肉模拟,水面模拟等等。

4 (1).gif
衣料模拟:右边是simulation结果,左边是SSDR模型解算出的蒙皮结果

线性蒙皮的实现方法:在介绍SSDR的实现方法之前我先简单描述下线性蒙皮的原理。 线性蒙皮是由一系列骨骼驱动的。每个顶点会根据顶点权重图和相应的骨骼关联。根据骨骼在当前位置相对于静止位置的变换矩阵以及此顶点相对于该骨骼

的权重,我们可以计算出该顶点在该骨骼影响下的位置。假设Wij是第j个骨骼对于第i个顶点的权重,Pi是第i个顶点在静止位置的坐标,|B|是骨骼的数量, Rjt和Tjt分别是第j个骨骼在第t个位置下的旋转矩阵和位移矩阵。综上Vit, 在第t个姿势下第i个顶点的位置可以表述为:

5.jpg
公式1

同时注意在线性蒙皮中, 权重Wij是大于等于零,并且所有骨骼对于顶点i的权重相加的和是1。

代码如下:

6.jpg

线性蒙皮分解算法:SSDR模型是通过一系列已知的形变数据,反向解算出线性蒙皮数据的算法。假设有一个有t个目标姿势,|V|个顶点的模型,在第t个目标姿势中第i个顶点,我们记做Vit. 那么SSDR模型将所有顶点的位置, {Vit: t=1...|t|, i=1...|V|}当做输入数据,将其分解为骨骼变换矩阵和顶点权重图

输入数据Vit可以考虑成一个|V| x |t|的矩阵,其中每个元素是个3 X 1的向量代表每个顶点在目标姿势下的空间坐标。同样,在静止位置下P是|V|个顶点的空间坐标。算法的输出结果是骨骼-顶点权重W={wij}以及骨骼的变换矩阵B ={Rjt, Tjt}。其中权重W是一个|V| x |B|矩阵,其元素均为非负数且每一行元素的和为1。

7.jpg
计算输入输出数据

这里将SSDR模型可以理解为一个线性回归模型,我们选择使用带约束的最小二乘法对参数进行估计。

8.jpg

服从于 Wij >=0

9.jpg

所有骨骼对于一个顶点的权重之和应当为1

10.png
确保Rjt为旋转矩阵

这里就不赘述如何求解这个非负数的最小二乘法解法了。我这里使用了scipy库的nnls(non-negative least squares)帮助求解。通过nnls得到初始值后,使用minimize函数增加约束,使得求解系数(权重)的和为1。

11.jpg
使用minimize函数实现稀疏约束

在解算出理想权重后,我们可以考虑时候根据当前权重重新计算骨骼的形变矩阵。这里我就不进一步解释如何计算骨骼形变矩阵了,大概方法是需要理解一些 cloud point mapping的知识:通过Singular Value Decomposition (SVD)来寻找最优旋转值。

总结此算法的最终流程:

输入:

12.png

在第t个姿势下第i个顶点的空间坐标,静止姿势下顶点的空间坐标
输出:

13.png

  • 顶点骨骼权重图,骨骼变换矩阵
  • 初始化骨骼变换矩阵
  • 重复一下步骤
  • 更新顶点骨骼权重图
  • 更新骨骼变换矩阵
  • 直到收敛或者达到预定的迭代次数
  • 更新静止位置


最后SSDR还可以用于快速生成蒙皮信息,这无非对于Rigger是很好的消息。在Maya里面通过将delta mesh变形器的结果分解生成权重图:

14 (1).gif
外国大神通过SSDR实现的快速蒙皮框架

总结,我认为在未来的游戏开发流程中,随着对更加精细的动画技术,和离线模拟技术的依赖SSDR模型会越来越多的被使用。烘焙成简单高效的蒙皮动画可以提高游戏性能,同时也可以将宝贵的性能留给更需要的地方。

SSDR相关论文(感谢评论):http://graphics.cs.uh.edu/ble/papers/2012sa-ssdr/


作者:王滕昊
专栏地址:https://zhuanlan.zhihu.com/p/78377681

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-3-29 01:36

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表