游戏开发论坛

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

建立下个时代的高清游戏美术资源生产管线(六):表情篇

[复制链接]

4万

主题

4万

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
84092
发表于 2024-6-11 08:49:28 | 显示全部楼层 |阅读模式
本文首发知乎,GameRes获授权发布。

在上一篇文章中介绍了绑定的基本概念,建立下个时代的高清游戏美术资源生产管线(五):绑定篇-绑定基本概念 ,文末预告了下一篇文章写表情,这次就来补完表情篇。表情也算国内ACG行业的重灾区了,这篇文章就从原理到制作详细剖析计算机图形学中的表情是怎么一回事,看完这个有耐心相信你也能开发一套自己的表情系统。

一、表情捕捉原理

关于表情捕捉的研究在业内也有一些年头了,最早表情捕捉技术是应用于影视与动画行业,好莱坞在上个世纪90年代开始在影视特效制作中尝试使用表情捕捉。随着技术的发展,表情捕捉技术也开始大规模应用在游戏,直播,短视频,人脸识别等领域。

表情捕捉的原理很简单:

  • 在脸上生成一定数量的标记点(landmark),
  • 预设N组标记点坐标位置(例如苹果是52个)
  • 计算当前标记点坐标与预设表情标记点坐标的差异,也就是两组坐标系的近似值,转化成权重信息,映射至0-1范围。0为完全不匹配,1为完全匹配。这个权重值就是表情系数
  • 用这个权重值驱动虚拟角色的表情动画曲线。

微信图片_20240611084235.JPG

这也就是为什么我们看好莱坞的特效大片的幕后花絮中,演员表演的时候会在脸上画那些标记点。同时为了效果好,我们需要保证摄像头始终能拍到演员的面部,所以需要一个带支架的头盔戴在演员头上,保证摄像头能和演员头部一起运动,始终正对演员面部。

微信图片_20240611084241.JPG

影响表情捕捉效果的关键点有两个,一是表情权重计算,二是虚拟角色的表情动画制作。如果是实时表情捕捉,权重计算会更加复杂。影视行业的landmark是人工标记的,只服务特定的面孔,可以很方便的对比当前表情标记点位置与预设表情标记点位置的差异(演员事先摆出需要的表情pose记录下来作为预设)。如果是做泛用性的实时面部捕捉,因为预设表情都是基于标准landmark位置制作的(例如mediapipe的400多个点作为标准landmark),就需要解决不同面孔的差异化问题。人脸相貌的差异会大大干扰捕捉精度,可能经常会把眼睛小的人识别为闭眼....这一点上目前做的最好的是苹果,但是苹果的预设表情太少了,只有52个,作为玩具玩玩可以,不能满足更高要求的表情捕捉效果。

计算表情权重早期比较常见的算法是用RBF计算,这方面论文很多,这里随便贴几篇:

CN103198508A - 人脸表情动画生成方法 - Google Patents
https://patents.google.com/patent/CN103198508A/zh

JG2019ysm.pdf (zhiyongsu.github.io)
https://zhiyongsu.github.io/Pub/JG2019ysm.pdf

目前的主流做法是引入机器学习的概念,通过人脸识别给面部进行自动标记,或者使用双目摄像头或者红外线将面部的landmark替换为精度更高的点云信息,通过大数据训练结果来计算表情权重,这方面做得比较好的目前是国内的facegood和epic的metahuman animator。

二、FACS

FACS指表情编码系统,最早在上个世纪70年代由某位我不记得名字的心理学家创建,用来分析人类情绪。有部知名美剧 lie to me就是以此为灵感创作。现在的ACG行业和计算机图形学行业主要用这套玩意做表情拆解和重建。

FACS相关文献非常多,想仔细了解可以自己去查,这里不啰嗦了。

因为人类面部肌肉运动非常复杂,我们不可能把一个虚拟角色能做出所有表情都制作一遍,那样可能要做几千个模型,工作量巨大。FACS把人类面部42块肌肉运动范围进行了归纳总结,我们可以基于肌肉运动来拆分组成人类表情的最小单元,这样只需要制作最小几十种肌肉运动单元就可以组合出丰富的表情效果,要想更好的效果可以进一步细化至300——600多个,拆这么细主要是为了减少表情重叠,这一步主要牵涉到blendshape制作。

三、blendshape拆分

blendshape一般是maya和unity的叫法,max和unreal叫morph target,指的都是同一回事。上篇文章中已经讲过不再赘述。与身体形变制作不同的是,表情blendshape的主要制作难点有下面两个:

  • 保证数字形象表情自然生动
  • blendshape拆分设计

写实角色保证表情生动的方式很简单,上扫描。靠美术同学手工雕刻表情不是不可以,但是效率太低,而且效果不可控,表情运动时联动影响的肌肉皮肤太多,美术功底不够做出来都很挫,制作成本昂贵。所以一般人工制作流程只用于细节较少的非人形角色和风格化的角色。扫描流程可以看我第一篇关于摄影测量建模的文章。建立下个时代的高清游戏美术资源生产管线(一):摄影测量建模

通常会拍摄30组左右演员的复合表情,然后通过摄影测量重建模型,美术人员再人工修复模型的拓扑,补全细节,修正偏移,保证表情效果的连贯性。做完这些工作,就会进入下一步表情拆分环节。

微信图片_20240611084242.JPG
扫描模型重拓扑

微信图片_20240611084243.JPG
扫描模型导入ZB

微信图片_20240611084244.JPG
修正后的扫描模型

目前主流的拆分方式有苹果的52个和虚幻metahuman375(我自己数的,不一定对)个。拆分表情单元主要目的是将面部肌肉块的运动方向都拆解出来,便于组合。比如眉毛有向上,向下,向内三个方向,根据左右脸区分可以拆分成至少6个表情单元,进一步区分开重叠区域,可以分为眉内,眉外12个。拆分得越细,重叠影响越少。但是重叠影响是无法消除,因为有些表情使用的是同一部位的肌肉,所以当两个表情同时存在的时候,表情之间会互相影响,尤其是嘴部。metahuman的做法是使用第三个表情修正这个影响,这也是他的bs数量很多的原因。

四、表情传递

人的脸型千变万化,我们不大可能为每个虚拟角色都扫描一套表情来还原这副面孔的表情效果。常见的做法是使用一套基础表情库,然后传递到不同的脸型上。表情传递常见做法有BS传递,包裹传递,RBF传递,拉普拉斯传递。

BS传递最简单,将新的脸型作为一个变形目标体添加到旧脸型上即可。这种做法需要保证两个脸型拓扑一致。算法就是简单的加法。

包裹传递主要用于不同拓扑的脸型,先将无表情的脸型拓扑成有表情的脸型模样,然后用有表情的脸型的BS包裹算法驱动无表情的脸型的形变,保存下每个表情,在变形回原始模样,本质上和BS传递是一回事,只是多了个包裹驱动的步骤。为了能得到比较好的包裹驱动结果才需要把两个脸型的外观修改到一致。

RBF传递:基于RBF算法传递表情,重新计算每个顶点位置,通用性高,也可以适用于不同拓扑的模型,确定是不准。

拉普拉斯传递:与RBF一样都是基于算法重新计算顶点位置。比RBF效果更准,缺点是只能用于相同拓扑。

目前也有用机器学习训练表情传递的,这个领域我不大熟,就不班门弄斧了。

所有的表情传递方案都无法解决表情效果与真人的吻合问题,要完全还原真人表情必须为每张脸单独做一套。

metahuman使用的是最简单的BS传递。

五、表情修正

表情修正主要用于处理表情叠加现象,这也是得到良好的表情捕捉效果非常重要的一环。苹果的52个表情没有处理表情叠加,这也是他上限比较低的原因之一。虚幻的metahuman花了大量精力处理表情叠加,所以能得到比较好的表情驱动结果。

举个简单例子可以说明表情叠加的现象。我们制作了一个张嘴的表情,这个时候我们又引入了一个吹气的表情,那么现在的表情就是张嘴+吹气,会叠加出不正常的姿势,这样的结果显然不是我们想要的,这个时候我们就要想办法修正这个状态。

微信图片_20240611084245.jpg
张嘴

微信图片_20240611084246.JPG
吹气

微信图片_20240611084247.JPG
张嘴+吹气,叠加出不正常的唇形

metahuman的做法比较暴力,当A表情与B表情同时存在并出现了不正确的表情状态时,引入一个修正表情C表情修复这个情况。修正表情是人工制作的,这样做效果最好但是制作起来也最繁琐。因为需要遍历所有表情单元的叠加状态并手动制作修正表情。叠加状态并不是只在两个表情单元之间存在,也可以多个表情单元同时叠加,这是一个巨大的工作量。metahuman修正表情的驱动方式为表情A权重*表情B权重=表情C权重值。metahuman一共制作了70多个修正表情。

我们也可以用数据驱动方式修正,将表情BS转成骨骼,遍历每个骨骼位移的最大值,然后限制骨骼位移的最大值。这样当两个表情值同时存在时候,叠加值不会超过正常范围。不过这样只能防止一部分叠加现象,我们还是要手动修正一些表情叠加。比如人不能在鼓腮帮子的时候同时张嘴,那我们为了防止出现这样诡异的表情数据,就需要人工进行一些权重过滤,在故腮帮子的表情权重变大的时候同时缩小张嘴权重。做法也很简单,用1减去这个系数即可。1-鼓腮帮子=张嘴

微信图片_20240611084248.JPG
错误的鼓腮帮子表情,张嘴+鼓腮出现了不好的叠加结果

微信图片_20240611084249.JPG
正确的鼓腮帮子表情,鼓腮=1,张嘴=0

表情修正是适用于所有表情方案的。虽然苹果的面捕方案没有提供表情修正功能,但我们可以自行增加表情数量提高苹果的表现上限。

六、3lateral与snapper

3lateral与snapper都是业内做游戏表情与实时表情捕捉比较知名的公司。国外有很多这种专注细分领域的公司,所以国外的3A产业链相对健全,游戏开发公司不用花大量精力处理与游戏内容无强关联的技术,需要的时候只用购买其他产业链环节上的公司研发好的成熟方案即可。国内游戏行业缺少这样中间件供应商,游戏美术外包只能提供简单的模型或动画制作服务,无法解决复杂的技术美术问题。所以国内公司往往需要投入大量成本自行消化这些和游戏设计无关的复杂技术,无谓的增加开发成本,效果还不好。因为不可能做到别人几十年如一日的深耕细分领域的专业程度。更可悲的是思想上的落后,这些并不是什么游戏开发的技术壁垒。大部分国内公司的领导和管理层却意识不到这些技术都是可以买的。

3lateral就是epic收购的技术供应商,在为虚幻引擎制作了siren demo后,epic直接收购了3lateral团队为虚幻引擎开发metahuman方案。我们从3lateral的早期方案中可以看到metahuman的影子。

十多年前,xbox的首发护航大作罗马之子的表情方案就是3Lateral提供的。演示如下:

Ryse Facial Performances - YouTube
https://www.youtube.com/watch?v=reByZLSncco&t=3s

我们可以从控制器设计和骨骼分布看出,十多年前3L的方案就和现阶段的metahuman几乎没什么区别了。

微信图片_20240611084250.JPG

基础思路就是骨骼负责表情驱动,blendshape负责细节修正。

微信图片_20240611084251.JPG

3L关于罗马之子表情方案的技术分享:

Stumbling Toward 'Awesomeness'Multi-Resolution Facial Rigging
http://www.chrisevans3d.com/pub_blog/multi-resolution-facial-rigging/

snapper也是一家专注表情与角色绑定的服务商,相信国内不少人看过他们的demo演示:

【绑定】Snappers Facial Rig演示合辑-高级面部绑定演示——就……跪着看呗?
https://www.bilibili.com/video/BV185411G7h5

最近参与的项目是unity的异教徒demo和数字人demo,以及木卫四协议中的主角,负责其中数字人主角绑定和表情。

微信图片_20240611084252.JPG

snapper的绑定方案与3lateral刚好相反,bs负责表情驱动,骨骼修正细节。BS的拆分逻辑与苹果的52个表情一致,只是细化成了660个bs。

snapper一套表情绑定收费大概rmb30万,这是两年前我们给他们发外包时的报价,现在不知道有没有变过。

七、metahuman拆解

虚幻的metahuman正在成为行业角色方案标准,metahuman提供了一套简单易用的角色自定义生产方案和自动化的表情生成方案。让用户可以以极低的成本解决数字形象的生产和表情驱动问题。但是metahuman也有一些问题导致用户用起来不是很顺手,比如必须使用metahuman的拓扑网格,角色造型不够好看,不符合亚洲人的审美习惯,表情库是基于欧美人建立的,套在亚洲脸型或者唯美脸型上都有些怪异。另外不能自定义身体,无法修改身材,只能用他那个7头身的角色,脑袋捏出来总会大一圈等等....所以要想把metahuman系统用到商业化生产中,需要进行一番改造。

在上篇文章的背后,我说了要对metahuman进行详细拆解,描述如何从0开始制作一套metahuman或者snapper的表情绑定系统,彻底抛弃UE的DNA节点限制并实时驱动。这里就来分析一下metahumen是如何设计的。

metahuman的面部blendshape只是干扰项,并不负责面部表情运动,只是用来弥补骨骼没有做到的表情细节。肌肉的挤压拉伸,皮肤褶皱这些。

微信图片_20240611084254.JPG

metahuman的真正表情是这些曲线,数据记录在dna节点中,有些作用不大,但还有70多个修正表情曲线是隐藏在dna节点中的,只有两个表情同时存在时才被使用。

微信图片_20240611084255.JPG

一部分曲线是用来驱动细节bs的,作用不大

  • 第一步我们需要扫描角色的面部表情。我们采集了30个面部表情,然后处理,这是我们的基础表情库,用来替换metahuman的表情库
  • 第二步基于FACS拆分表情。因为是复刻metahuman,直接使用他们的拆分规范就可以。需要提取出metahuman的所有表情曲线,转成blendshape动画,基于我们的脸型创建和metahuman一摸一样的骨骼,然后使用ssdr解算骨骼权重和动画。看不懂的部分可以看我以前的文章。
  • 第三步将所有metahuman表情存成骨骼动画,在引擎里转为poseasset。
  • 第四步用蓝图重写一遍DNA的驱动关系,这样可以完全干掉DNA节点。unity和blender也可以使用。

DAN的驱动关系其实比较简单,主要是三大类,第一是每个表情的数据,metahuman在dna节点里存储的是每个骨骼对应表情的坐标,转化为曲线读取。所以我们可以直接用poseaset代替。第二个是控制器的驱动关系,这个也很简单,控制器系数曲线驱动表情动画pose曲线,maya里直接搬过来就行。要是觉得metahuman控制器不好用可以自己换一个。第三个是修正表情的驱动,这个比较麻烦,要手动检查。逐个复现表情之间的叠加和修正关系。

梳理清楚metahuman的设计逻辑,我们就可以用自己的表情库替换metahuman表情库,并且摆脱模型拓扑、引擎的限制,将metahuman应用到所有的引擎和DCC软件中。也可以对meta human进行扩展,增加实时面部修改,身体修改等功能。

总结

简单来说,表情捕捉如果想准确驱动数字形象的面部表情,那么他的表情权重系数计算规则和虚拟形象的表情绑定方案必须是是高度耦合的。也就是通过标记点计算出的表情系数需要与虚拟形象拆解出的表情单元完全对应,苹果是52套landmark坐标对应52个表情模型,如果想实时驱动metahuman的表情,至少需要建立258个landmark坐标预设,与metahuman的258个基础表情一致.人脸识别,建立脸部landmark标记点,表情权重系数计算属于算法部分,数字角色的表情拆分,驱动关系建立,表情修正属于美术部分。算法决定了表情驱动效果,反过来,表情单元的拆分又定义了表情标记点的位置规范。只有算法和美术完美结合,彼此都知晓对方的工作内容,工作原理,才能开发出完美的效果。

下一篇写动作捕捉,对游戏开发技术有兴趣的也可以加群908353590交流

相关阅读:

建立下个时代的高清游戏美术资源生产管线(一):摄影测量建模
建立下个时代的高清游戏美术资源生产管线(二):材质与纹理规范——场景篇
建立下个时代的高清游戏美术资源生产管线(三):细节与质感
建立下个时代的高清游戏美术资源生产管线(四):角色服装篇
建立下个时代的高清游戏美术资源生产管线(五):绑定篇-绑定基本概念

文/潘翔
原文:https://zhuanlan.zhihu.com/p/656107400

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

本版积分规则

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

GMT+8, 2024-7-13 09:14

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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