破CSDN的文章编辑器太难用了, 传个图要累死. 以后在知乎写完再转过来: https://zhuanlan.zhihu.com/p/28471808

关于游戏中的捏人系统, 很少有资料提到怎么做, 印象中只有《天涯明月刀》分享过. 前段时间关注了个VR资源分享的公众号, 经常推送HS的捏人作品, 所以才引发了我的好奇心, 决定一探究竟.

HS之所以能够有这么强的定制能力, 是因为第三方MOD工具的存在, 玩家可以自由导入导出游戏中的资源, 这也就为我们分析游戏的实现机制开了个后门.

上图中我们可以看到, 脸部有很多骨骼, 尝试把模型导出来, 对其进行分析:

针对鼻子上的骨骼, 进行平移/旋转/缩放, 嗯, 看起来捏脸就是这么回事了.

比如鼻翼骨骼影响这点顶点, 那我们对其调节就可以产生这样的效果:

再比如下巴

那骨骼都用来捏脸了, 面部的表情动画怎么办呢?

对模型资源的规格进行分析, 发现存在大量的morph动画. 也就是说, HS中的的头部骨骼, 全部是用于捏脸的, 表情动画使用MorphTargets驱动.

那身体总不能也用MorphTargets做动作吧?

对其模型资源进行析, 发现MorphTargets个数为0, 而骨骼数超越以往的经验值.

查看其蒙皮信息可以发现, 所有影响顶点的骨骼名字全部带有"_s_"字样, 其父骨骼都是不带"_s_"的同名骨骼. 也就是说, HS的身体骨架中, 父骨骼负责动画, 子骨骼负责蒙皮.

游戏中的女角色脸部有67项调节参数:

女角色身体共有34项调节参数, 其中2项为物理参数, 跟骨骼无关

我们来看看这些滑杆能不能跟骨骼一一对应上:

对于"鼻子整体上下"来说, 的确是只需要调节NoseBase的Y值就可以了, 我们需要做的就是根据滑杆在最大值和最小值之间进行线性插值.

对于"眉毛角度Z轴"的调节, 这时只调节一根骨骼就不对了, 需要左右对称着来. 也就是说, 有一些调节项需要同时调节左右对称的两根骨骼.

对于"眉毛左右位置", 如果在直线上两个端点之间进行插值, 很容易就跟面部三角形穿插了. 所以这里的插值路径只有最大值和最小值已经满足不了需求了, 而是需要按照曲线进行位置插值, 并且配合旋转插值贴合面部的法线方向. 也就是说, 一个调节项的插值可能是基于曲线(或多个关键帧), 而且可以同时影响骨骼Transform的多个分量.

眼睛的大小调节是最复杂的, 一共影响6根骨骼. 也就是说, 一个调节项是可以对应多根骨骼的.

我们总结一下, 脸型(或体型)调整原理就是:

  • 本质上修改的是骨骼的Local Transform(Translation, Rotation, Scale)
  • 一次只修改Local Transform的某个分量(或多个):Tx/Ty/Tz/Rx/Ry/Rz/Sx/Sy/Sz
  • 使用滑杆在预设的调节范围之间进行插值
  • 插值不一定是线性的, 可能是有多个关键帧
  • 每个调节项可能对应不只一根骨骼

以此为指导思想, 继续结合ILSpy对HS进行逆向分析, 终于找到了骨骼的配置数据.

首先是骨骼分类表:

  • 第1列, 类别编号: 每个编号代表UI上的一根滑杆. 重复出现的编号代表影响多根骨骼
  • 第2列, 骨骼名
  • 第3~11列, Transform Mask: 代表调节Bone Local Transform的哪些分量, 比如000000100代表只影响Sx, 即只缩放X轴

其次是骨骼调节关键帧表:

  • 第1列: 骨骼名
  • 第2~N列: 关键帧数据, 每一帧是9个float, 正好是一个Transform, 总共25帧.

可以说, I社的捏人系统, 最核心的就是这两张表格的数据了, 是他们这么多年捏人游戏的经验积累. 也正是这个原因, 他们舍不得每次新做一套骨架就重新调一版数据, 结果就是, 游戏中的骨架跟表格对不上:

游戏中的骨架, 不管是数量也好还是命名也好, 都跟表格对不上. 那这之间是怎么映射的呢?

原来是硬编码的, 真让人崩溃...好了, 那整个捏人的核心逻辑就搞清楚了:

  1. 根据骨骼分类表生成所有的调节滑杆, 并从预置的文件加载滑杆的默认值集合
  2. 如果滑杆值变了, 查分类表得到骨骼名(可能多个), 再根据骨骼名查关键帧表得到关键帧集合, 根据滑杆值插值出Local Transform
  3. 使用代码逻辑把老的Transform数据转换成新骨架能用的骨骼Transform
  4. 把骨骼Transform全部更新到模型上

尝试在UE4中使用PoseableMesh复刻了一下, 效果还不错:

PoseableMesh的问题是不兼容动画, 所以如果要修改SkeletalMesh的BoneTransforms话, 就只能在AnimationBlueprint里实现一个自定义的AnimNode了:

配上动画, 贴上材质, 效果就好多了:

(随便找了件衣服遮一遮)

最后, 顺便提一下捏人之外的东西, 因为对于角色的定制来说, 捏人起的作用还不如换一件衣服.

对衣服的资源进行分析可以发现两点值得学习的地方:

  • 每件衣服都配有一个剔除掉被遮住的三角形的裸模, 一方面可以提升绘制性能, 一方面能避免衣服和皮肤两层三角形的穿插
  • 裙摆/披风/长衫等都是共用同样的8条物理骨骼, 算是比较传统的布料模拟做法

挂件差不多都是StaticMesh, 最多带有物理骨骼, 直接挂在骨架挂点上, 可以跟随体型一起进行变换.

眼睛这里的Mesh有点扩张了, 分了很多层, 甚至有3个Mesh用来做眼泪的表现. 材质多了, 可以更换的样式自然也就多了:

头发分了前中后三部分, 每一部分可以单独隐藏或者替换, 配合大量的模型资源, 真正可以配出各种各样的发型, 更何况还有MOD的支持.

其它的类似皮肤/皱纹/眼影/腮红/唇彩/纹身/痣/晒痕/指甲等, 大多数都是换贴图, 没有多少技术上的复杂度, 但却是能够大大提升个性的功能:

通过GPA分析发现, 这些叠加的图层在运行时并没有独立的贴图:

所以并没有采用Decal的方式绘制, 而是跟皮肤贴图混合到了一起:

《Honey Select》捏人剖析相关推荐

  1. honeyselect捏脸教程_《Honey Select》捏人剖析

    关于游戏中的捏人系统, 很少有资料提到怎么做, 印象中只有<天涯明月刀>分享过. 前段时间关注了个VR资源分享的公众号, 经常推送HS的捏人作品, 所以才引发了我的好奇心, 决定一探究竟. ...

  2. 游戏中的整容术! 《Honey Select》捏人系统剖析

    关于游戏中的捏人系统,很少有资料提到怎么做,印象中只有<天涯明月刀>分享过.前段时间关注了个VR资源分享的公众号,经常推送HS的捏人作品,所以才引发了我的好奇心,决定一探究竟. HS之所以 ...

  3. 人类一败涂地做图教程_人类一败涂地自定义人物怎么制作 捏人实用技巧教学...

    这款游戏凭借着极高的自由度操作给我们留下了非常棒的印象,不过内容丰富,玩家们对其中的各种玩法还有着很多疑问,于是小编这里就为大家带来了游戏全面的科普,这次为玩家分享的是人类一败涂地自定义人物怎么制作的 ...

  4. honeyselect身高补丁_honeyselect 4k高清画质补丁 V1.1 - honey select超高清画质插件

    honeyselect 4k高清画质补丁是honey select超高清画质插件其中包含4个足以颠覆画面的特效动作滤镜套件+1个动作镜头,有兴趣的朋友欢迎到绿盟下载体验lor~ 4个滤镜套件+1个动作 ...

  5. 【操作系统】IO模型篇之从BIO、NIO、AIO到内核select、epoll剖析

    [操作系统]IO模型篇之从BIO.NIO.AIO到内核select.epoll剖析! 参考资料: Java网络编程-IO模型篇 [Redis]网络模型:Redis的IO多路复用 [操作系统]全面解析I ...

  6. C语言,画吃豆人剖析

    接上一篇文章,很多人还是搞不清楚ptr1[-1]是怎么回事,可以看看这篇文章,看完的同学还是多转发的,让更多的人看到. 一道90%都会做错的指针题 偶然的一次机会在知乎上看到这个代码,里面涉及的C语言 ...

  7. 人类一败涂地做图教程_人类一败涂地怎么捏人?自定义人物PS制作教程

    <人类:一败涂地>中玩家可以自定义人物,但由于上手难度高很多玩家都无法自己制作.今天小编就为大家带来玩家"自我治疗"提供的自定义人物PS制作教程,感兴趣的玩家一起来看看 ...

  8. 上帝捏人玩具MetaHuman重大更新!几分钟捏一张精细到发丝的脸

      视学算法报道   编辑:时光 拉燕 桃子 [新智元导读]近日,UE开发的数字人类创作工具MetaHuman Creator再次迎来重大更新.网格体转MetaHuman功能可以让你在几分钟内为元宇宙 ...

  9. honey select 模型导出_道路建模-基本模型

    Autodesk平台BIM 道路建模展示所使用的软件为Infraworks 360,在此软件里可导入Civil 3d路线及模型.对于一般简单道路,没有多级边坡或复杂交叉口,可直接导入Civil3d路线 ...

最新文章

  1. 怎么用python画花瓣_怎么用python画花朵
  2. CPU和GPU的区别
  3. Zabbix学习之路(五)之MySQL监控
  4. 操作系统核心原理-5.内存管理(下):段式内存管理
  5. 【转载】别了,摩托罗拉(十):“战争部落”和“独立王国”
  6. vuejs 指令封装 button 加载效果_这些Vue自定义指令,让你的项目开发爽到爆
  7. linux处理制表文件,linux下PDF及表格处理软件
  8. 红帽企业linux 6.4 64位上实现mysql 5.6主从复制_红帽企业Linux 6.4 64位上实现MySQL 5.6主从复制...
  9. pcie总线频率和带宽_从1.0到6.0的飞跃之路,PCIe总线技术发展解析
  10. 无监督学习之稀疏编码,自编码
  11. 声卡可以利用计算机进行,您决定听到什么!使用软件实现声卡分流
  12. RGB色彩模式划分为0~255,是按照什么标准进行划分的?
  13. KVC原理分析及应用
  14. Hadoop性能调优全面总结
  15. 项目设计-基于SpringBoot和Vue开发的宿舍管理系统
  16. 上传文件连接失败问题
  17. java 删除本地文件夹或文件
  18. only the original thread that created a view hierarchy can touch its views解决方案
  19. ROS学习笔记(十二)ROS noetic ubuntu20.04 版本 rosdep init,rosdep update 问题解决方法
  20. matlab画磁滞回线,[画图的问题]怎么画类似于磁滞回线的图像?一个x值对应两个y值的...

热门文章

  1. Centos Tinyproxy 使用教程
  2. 【论文】知识图谱简单问答(单跳)挑战、技术和趋势综述
  3. 李宏毅机器学习课程学习笔记(1)——机器学习基本概念
  4. 计算机应用技术大专的工资,邢台职业技术学院毕业后计算机应用工资是多少
  5. C++【对象模型】 | 【05】类与类之间各种关系下对数据成员的存取、绑定、布局
  6. CE感恩品牌创始人的创业经历
  7. CSDN| CSDN自定义图片水印
  8. STM32F103C8T6用ADS1115采集热敏电阻
  9. C语言之左移和右移运算符
  10. 不预览直接打印 Microsoft RDLC报表