捏脸涉及到的配置文件有三个,作用如下:
MeshPoints.json 中是所有骨骼和其维度的信息。通常不会修改,也不可自定义。
MeshLanguage.json 为所有 key 的翻译信息。
MeshConfig.json 为捏脸的配置文件。里面配置了多点控制,与菜单结构。
一个角色的可控制的五官类型分为:face、nose、ear、brow、eye、mouth。每个五官类型里面有不同的部位,例如 face 的 forehead_jnt(额头)、ophryon_jnt(印堂)。
每个部位分为九个维度:位移的 x、y、z;旋转的 x、y、z;缩放的 x、y、z。
例如位移的 x 对应的就是 left 和 right,旋转的 y 对应的就是 rotateLeftInn 和 rotateRightInn。
里面的内容不支持改动,了解其含义即可。
它是一个捏脸的业务配置文件,里面包含了一些映射关系与菜单样式等。比如专家模式与简易模式有各自的 MeshConfig.json,简易模式相比专家模式隐藏掉了很多控制字段。
它的数据结构如下:
{ "bind": { "face": {"脸颊key":["左脸颊key", "右脸颊key"]
}
"eye": {"眼睛key":["左眼key", "右眼key"]
}
},
"menuTree": {"face": [
{"name": "额头key",
"showSlider": ["tx", "ty", "tz", "rx", "ry", "rz", "sx", "sy", "sz"],
"disableSlider": ["tx", "ty", "tz"]
},
{"name": "印堂key",
"showSlider": ["rx", "ry", "rz"]
}
],
"nose": [
{"name": "nose_jnt",
"showSlider": []
}
]
}
}
bind 字段主要是对称相关的信息。
menuTree 为实际显示的菜单层级,例如 face 里的每个节点代表实际显示的部位。
它支持 MeshPoints 里每个部位的 key,也支持 bind 里的 key。例如可以配置成 "脸:额头、印堂、脸颊",或者"脸:额头、印堂、左脸颊、右脸颊"。
部位的字段目前有三个:name、showSlider、disableSlider。
"tx", "ty", "tz", "rx", "ry", "rz", "sx", "sy", "sz" 对应的是上述的九个维度。
name 为上述的部位 key 或者 bind 里的 key。
showSlider 为该部位的可调节维度。例如专家模式是九个都可以调节,简易模式视情况只提供 sx、sy、tz 等。如果不配置或长度为 0 则默认显示全部。
disableSlider 为该部位的显示但不可调节维度。目的是九个维度时能显示比较美观。如果不配置则默认不禁用。
里面为所有捏脸用到的语言文件。大致分为这几类:五官类型(即 face、nose)翻译、部位翻译、对称部位(即 bind 字段的 key)翻译、维度(即 tx、ty、tz)翻译、自定义维度(例如 noseBridgeUp_jnt 的 sx: 宽窄)翻译。
所有 UI 要显示的 key 都会从该文件中查询,查询不到则显示默认。
针对不同部位的维度,默认的翻译如果不贴切,则可按格式自定义。
1、捏脸数据的解析
参考 FUAvatarFacepupDataProvider 代码,在此类中就是基于上述:MeshPoints.json、MeshConfig.json、MeshLanguage.json 构造出若干个树形结构的的捏脸模型:FUAvatarFacepupModel。
FUAvatarFacepupModel: 一个完整的树形捏脸数据模型,包含多个 FUAvatarFacePartModel
FUAvatarFacePartModel: 捏脸的部位模型,包含多个 FUAvatarFaceTransformModel
FUAvatarFaceTransformModel: 捏脸的形变模型,包含多个 FUAvatarFaceDirectionModel
FUAvatarFaceDirectionModel: 捏脸的方向模型,对应UI上的一个滑杆。
2、捏脸页面的搭建
FUAvatarFacepupView 为捏脸的整体页面,下面有很多自定义页面
FUAvatarFacepupEditView: 底部编辑区域
FUAvatarFacepupSegmentView:形变类型切换
FUAvatarFacepupSliderView:滑杆
FUAvatarFacePartView:底部捏脸部位切换