关于游戏中的捏人系统,很少有资料提到怎么做,印象中只有《天涯明月刀》分享过.前段时间关注了个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话,二手QQ转让平台就只能在AnimationBlueprint里实现一个自定义的AnimNode了:

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

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

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

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

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

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

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

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

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

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

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

游戏中的整容术! 《Honey Select》捏人系统剖析相关推荐

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

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

  2. 《Honey Select》捏人剖析

    破CSDN的文章编辑器太难用了, 传个图要累死. 以后在知乎写完再转过来: https://zhuanlan.zhihu.com/p/28471808 关于游戏中的捏人系统, 很少有资料提到怎么做, ...

  3. C++模拟游戏中鼠标点击和键盘按键

    游戏中模拟键盘输入,有时回被系统屏蔽,Java等语言都试过很多方法,好像都没用,所以下面给出一种C++实现方法 #include <iostream> #include <windo ...

  4. 浅谈cocos2d游戏中天气系统的简单实现

    一.前言 此博客由一个新手游戏程序编写,没有高深的技术,基本是天气效果表现和代码设计的浅谈,如果有更好的实现方法,欢迎指正. 二.背景 该系统设计背景:2D游戏.正交45度表现地图.以及同一张地图上存 ...

  5. 2017败北清单:人工智能在这些游戏中战胜了人类

    原文链接:点击打开链接 摘要: 20世纪90年代后期,IBM深蓝(Deep Blue)研究了一系列的国际象棋算法,期望于打败当时的世界冠军加里•卡斯帕罗夫(Garry Kasparov).终于,在19 ...

  6. 漫谈游戏中的人工智能

    今天我们来谈一下游戏中的人工智能.当然,内容可能不仅仅限于游戏人工智能,还会扩展一些其他的话题. 游戏中的人工智能,其实还是算是游戏开发中有点挑战性的模块,说简单点呢,是状态机,说复杂点呢,是可以帮你 ...

  7. 某公司要开发新游戏,请用面向对象的思想,设计游戏中的蛇怪和蜈蚣精

    某公司要开发新游戏,请用面向对象的思想,设计游戏中的蛇怪和蜈蚣精 设定 蛇怪类: 属性包括:怪物名字,生命值,攻击力 方法包括:攻击,移动(曲线移动),补血(当生命值<10时,可以补加20生命值 ...

  8. 多人联机游戏中联网模块(Socket)的设计和各种问题解决

    这是我自己做的一个多人联机游戏中网络部分的总结.全部为自己全新做的,没用开源软件(有一个网络游戏开源软件Raknet).目的是写一个属于自己的可靠网络模块,修改.扩展后在很多地方都能用得着.也想自己从 ...

  9. 从游戏中学习产品设计2:消费篇

    上一期,我们介绍了游戏中的诱导充值套路,没有看的朋友可点击 从游戏中学习产品设计1:充值篇!了解游戏中是如何引诱玩家充值的,今天我们来聊一聊游戏中的消费套路,上文介绍了游戏中的三类货币:金币,钱币和时 ...

最新文章

  1. 建立于因果推理与机器学习共识的稳定学习
  2. python实训项目-Python开发基础-项目实训-在线投票系统.pptx
  3. 关于Git中的一些常用的命令
  4. 百万数据报表读取:步骤分析以及自定义事件处理器
  5. 华为魔术手机拆机图解_华为P9进水不显示维修案例
  6. 华为鸿蒙系统是指芯片吗_华为首部鸿蒙手机P50——不再使用麒麟芯片,拍照系统再升级...
  7. two+few+arguments+php,PHP5.5 ~ PHP7.2 新特性整理
  8. 解决C# Repeater内嵌Repeater 数据绑定,以及第二次层Repeater的ItemDataBound事件怎么处理...
  9. HDU 5895 Mathematician QSC
  10. linux开源监控工具,十款开源免费监控软件
  11. C语言怎么实现熊猫上香中的系统错误提示,熊猫烧香的病毒是用什么程序语言编写的 原理是什么...
  12. Python基础之文件和数据格式化
  13. 解读后天性学者症候群:怎么一闷棍砸出个天才?
  14. c++win32项目 如何显示后再删除一个绘图_如何运用Excel,R等软件结合PPT做出你想要的矢量图...
  15. 大航海懒神辅助工具全部更新完毕,祝大家航海愉快!
  16. sRGB,RAW图像意义
  17. 带领大家进入win+r(运行)
  18. 我参加筑路机械专业筹建过程的回忆
  19. 大数据岗位更看重学历还是工作经验?
  20. 分享一个简单好用的快递查询、物流管理软件

热门文章

  1. 批处理 批量s扫1433_申报资料 | 批量整理图谱(续)
  2. python点操作符语法_最基础的python语法
  3. 动态折线图 python_python 怎么做个动态折线
  4. oracle 5632,17、oracle 性能管理
  5. C# 基础知识-02----强数据类型
  6. socket通信 _ 一个简单的群聊系统
  7. AT89C52编程开发源代码
  8. FLASH开发[00]
  9. 2.5.2 MySQL二进制日志介绍
  10. S4 exercise -- 模块