人物换装和捏脸

1 换装

目前的换装方案主要有:

  • 材质换装,比如换贴图和shader
  • 挂点,在角色上制作挂点,然后挂上武器飘带等
  • 更改蒙皮(Unity中为Skin Mesh Render),只要所有的蒙皮基于同一套骨骼开发,就支持换装。在换装的时候SkinMeshRender重新复制bone信息就可以完成蒙皮的绑定。通过合并Mesh减少Drawcall。
  • uma系统。DNA系统(设置骨骼缩放系数和长度)。

换装实现

实现参考
SkinMeshRender改变模型Transform无效是因为模型上的顶点位置已经是实时通过骨骼位置和权重实时计算出来的。所以对Unity中带有skinMeshRenderer组件的GameObject进行移动,旋转等操作,并不会影响模型的最终渲染。
参考核心代码
该代码没有对mesh进行优化,可以对skinmeshrender进行合并来优化,减少recall,优化采用CombineInstance对mesh进行合并

CharacterCustomization

代码根据性别加载主骨架,再根据角色装扮信息读取各部件资源中的所有蒙皮信息生成新的Mesh,将Mesh与子物体中所有的bones,materials赋予父物体的SkinnedMeshRenderer中。
官方的换装粒子,不修改代码不能再unity5中运行。换装原理是更改蒙皮和合并mesh。换装时有内存泄露。原因是并没有从内存中清除(AssetBundle),不断的更换就会在内存中不断的累加。

UMA

UMA分为改变Wardrobe(换装),Color(皮肤颜色),DNA(设置骨骼(T-pose)矩阵) 换装的核心原理为更改蒙皮+合并mesh。 SkinnedMeshCombiner.cs–>CombineMeshes 会合并骨骼和顶点MergeSortedTransforms(按照hash的大小排序骨骼)把所有的顶点合并成一个mesh

对美术的要求

制作的所有衣服基于同一套完整骨骼,导出的时候导出衣服和衣服所受影响的那些骨骼,动画可以不需要。

2 捏脸

有二种方式。一是用Blendshape(融合变形),通常用于面部动画,直接修改顶点。二就是用骨骼驱动,采用修改骨骼矩阵的方式影响SkinMesh。二种方式最终的目的都是修改顶点。

blendShape(Morph Target)实现原理

How the software does this blending, as explained by some of the other answers written here, is achieved by the delta or the differences in shape between the target expressions and the base shape. Maya keeps track of how much each vertex is displaced in relation to the original Base shape. Thus when the animator blends or morphs the expression in, Maya translates those vertices towards the final positions as described by that particular BlendShape.

Since Maya compares the base shape and the BlendShape objects vertex for vertex, we should always maintain consistency in vertex count, vertex order or topology across all BlendShapes.

UMA捏脸系统(DNA)

UMA的骨骼男女角色层次结构一样为

人物骨骼一共158块骨骼

UMADynamicCharacterAvatar
-Root
--Global
---Position
----Hips
-----LowerBack
------LowerBackAdjust
-------LowerBackBelly
------Spine
-------Spine1
--------Neck
---------Head
----------RightEar
-----------RightEarAdjust
----------RightEye
-----------RightLowerLid
------------RightLowerLidAdjust
-----------RightEyeAdjust
-----------RightUpperLid
------------RightUpperLidAdjust
-----------RightEyeGlobe
----------RightLipsSuperiorMiddle
-----------RightLipsSuperiorMiddleAdjust
----------LeftLipsSuperiorMiddle
-----------LeftLipsSuperiorMiddleAdjust
----------RightEyebrowLow
-----------RightEyebrowLowAdjust
----------NoseBase
-----------NoseBaseAdjust
----------RightLowCheek
-----------RightLowCheekAdjust
----------LipsSuperior
-----------LipsSuperiorAdjust
----------RightNose
-----------RightNoseAdjust
----------HeadAdjust
----------LeftEyebrowMiddle
-----------LeftEyebrowMiddleAdjust
----------LeftEar
-----------LeftEarAdjust
----------LeftEye
-----------LeftEyeAdjust
-----------LeftEyeGlobe
-----------LeftUpperLid
------------LeftUpperLidAdjust
-----------LeftLowerLid
------------LeftLowerLidAdjust
----------LeftNose
-----------LeftNoseAdjust
----------NoseTop
-----------NoseTopAdjust
----------RightCheek
-----------RightCheekAdjust
----------NoseMiddle
-----------NoseMiddleAdjust
----------UpperLips
-----------UpperLipsAdjust
----------LeftEyebrowUp
-----------LeftEyebrowUpAdjust
----------RightEyebrowUp
-----------RightEyebrowUpAdjust
----------LeftCheek
-----------LeftCheekAdjust
----------Mandible
-----------LeftLipsInferior
------------LeftLipsInferiorAdjust
-----------RightLowMaxilar
------------RightLowMaxilarAdjust
-----------RightLips
------------RightLipsAdjust
-----------LipsInferior
------------LipsInferiorAdjust
-----------MandibleAdjust
-----------RightLipsInferior
------------RightLipsInferiorAdjust
-----------Tongue01
------------Tongue02
-----------LeftLips
------------LeftLipsAdjust
-----------LeftLowMaxilar
------------LeftLowMaxilarAdjust
----------RightEyebrowMiddle
-----------RightEyebrowMiddleAdjust
----------LeftLowCheek
-----------LeftLowCheekAdjust
----------LeftEyebrowLow
-----------LeftEyebrowLowAdjust
---------NeckAdjust
--------RightOuterBreast
---------RightInnerBreast
--------RightShoulder
---------RightTrapezius
---------RightArm
----------RightArmAdjust
----------RightForeArm
-----------RightForeArmAdjust
-----------RightForeArmTwist
------------RightForeArmTwistAdjust
-----------RightHand
------------RightHandFinger03_01
-------------RightHandFinger03_02
--------------RightHandFinger03_03
------------RightHandFinger05_01
-------------RightHandFinger05_02
--------------RightHandFinger05_03
------------RightHandFinger04_01
-------------RightHandFinger04_02
--------------RightHandFinger04_03
------------RightHandFinger02_01
-------------RightHandFinger02_02
--------------RightHandFinger02_03
------------RightHandFinger01_01
-------------RightHandFinger01_02
--------------RightHandFinger01_03
---------RightShoulderAdjust
--------LeftOuterBreast
---------LeftInnerBreast
--------Spine1Adjust
--------LeftShoulder
---------LeftShoulderAdjust
---------LeftTrapezius
---------LeftArm
----------LeftForeArm
-----------LeftHand
------------LeftHandFinger04_01
-------------LeftHandFinger04_02
--------------LeftHandFinger04_03
------------LeftHandFinger01_01
-------------LeftHandFinger01_02
--------------LeftHandFinger01_03
------------LeftHandFinger02_01
-------------LeftHandFinger02_02
--------------LeftHandFinger02_03
------------LeftHandFinger03_01
-------------LeftHandFinger03_02
--------------LeftHandFinger03_03
------------LeftHandFinger05_01
-------------LeftHandFinger05_02
--------------LeftHandFinger05_03
-----------LeftForeArmTwist
------------LeftForeArmTwistAdjust
-----------LeftForeArmAdjust
----------LeftArmAdjust
-------SpineAdjust
-----LeftUpLeg
------LeftLeg
-------LeftLegAdjust
-------LeftFoot
--------LeftToeBase
------LeftUpLegAdjust
------LeftGluteus
-----RightUpLeg
------RightGluteus
------RightLeg
-------RightFoot
--------RightToeBase
-------RightLegAdjust
------RightUpLegAdjust

用于修改DNA的骨骼有一共74块,其中Adjust骨骼大部分为单位矩阵,skinMesh大部分绑定在这些可修改的骨骼上,在名为***adjust骨骼上没有动画数据,UMA2动画采用avatar人形骨骼系统进行重定向。
用于调整的骨骼有:

HeadAdjust
NeckAdjust
LeftOuterBreast
RightOuterBreast
LeftEye
RightEye
LeftEyeAdjust
RightEyeAdjust
Spine1Adjust
SpineAdjust
LowerBackBelly
LowerBackAdjust
LeftTrapezius
RightTrapezius
LeftArmAdjust
RightArmAdjust
LeftForeArmAdjust
RightForeArmAdjust
LeftForeArmTwistAdjust
RightForeArmTwistAdjust
LeftShoulderAdjust
RightShoulderAdjust
LeftUpLegAdjust
RightUpLegAdjust
LeftLegAdjust
RightLegAdjust
LeftGluteus
RightGluteus
LeftEarAdjust
RightEarAdjust
NoseBaseAdjust
NoseMiddleAdjust
LeftNoseAdjust
RightNoseAdjust
UpperLipsAdjust
MandibleAdjust
LeftLowMaxilarAdjust
RightLowMaxilarAdjust
LeftCheekAdjust
RightCheekAdjust
LeftLowCheekAdjust
RightLowCheekAdjust
NoseTopAdjust
LeftEyebrowLowAdjust
RightEyebrowLowAdjust
LeftEyebrowMiddleAdjust
RightEyebrowMiddleAdjust
LeftEyebrowUpAdjust
RightEyebrowUpAdjust
LipsSuperiorAdjust
LipsInferiorAdjust
LeftLipsSuperiorMiddleAdjust
RightLipsSuperiorMiddleAdjust
LeftLipsInferiorAdjust
RightLipsInferiorAdjust
LeftLipsAdjust
RightLipsAdjust
Global
Position
LowerBack
Head
LeftArm
RightArm
LeftForeArm
RightForeArm
LeftHand
RightHand
LeftFoot
RightFoot
LeftUpLeg
RightUpLeg
LeftShoulder
RightShoulder
Mandible

天涯明月刀捏脸系统设计原理

融合变形

优点:可以控制的非常细微捏脸变化。

缺点:Blendshape在捏脸制作上工作量非常大,我想把一个结构捏的多么细微就要制作多少张脸,这个细微度和工作量是成正比的。这样会导致后期修改不方便,更重要的是性能消耗非常大。另外跟我们第三方动画软件不兼容。

骨骼驱动

优点:制作量比较少,性能消耗相对少些,和现有动画系统兼容,另外捏脸骨骼和动画骨骼是同一套骨骼,就通过MorphemeConnect动画软件跟面部骨骼做了融合。当你捏出来任何形状的脸都可以套用同一个动画,这样也减少很大的工作量。

缺点:权重分配受限较多,捏练的细致程度有限。

总结

  1. 骨骼捏脸(48根骨骼)
  2. 软件的法线贴图 + 开发的表情法线贴图
    做法:动画软件跟二套表情法线进行融合,表情法线和本身模型的法线进行了叠加,表情法线会设置0到100的透明度
  3. 骨骼有位移,旋转和缩放功能
    image
  4. 眼球有瞳孔diffuseMap通道,不同眼球大小瞳孔贴图有UV挤压(?暂时不理解)
    image
  5. (老化项,我们同样制作了衰老皮肤的二套法线,并提供了0-100的渐变功能可使角色面部,变化出不同的年龄层次,再加上捏脸功能可以让角色变的更加丰富。)(?按图片理解是法线贴图+表情法线贴图+老化法线贴图)
    image
    image
    image

《Honey Select》捏人剖析

总结

  1. HS中的的头部骨骼, 全部是用于捏脸的, 表情动画使用MorphTargets驱动
  2. 身体影响顶点的骨骼名字全部带有"s"字样, 其父骨骼都是不带"s"的同名骨骼. HS的身体骨架中, 父骨骼负责动画, 子骨骼负责蒙皮.
  3. 博文总结
脸型(或体型)调整原理就是:
本质上修改的是骨骼的Local Transform(Translation, Rotation, Scale)
一次只修改Local Transform的某个分量(或多个):Tx/Ty/Tz/Rx/Ry/Rz/Sx/Sy/Sz
使用滑杆在预设的调节范围之间进行插值
插值不一定是线性的, 可能是有多个关键帧
每个调节项可能对应不只一根骨骼

捏脸总结

  1. 基于骨骼调整。调整骨骼的Scale、Rotation,Position相对用得少。
  2. 基于Mesh差值。这部分是前面缺失没有提到的部分,在某些骨骼数量有限制或者骨骼不能做得特别好的情况下,会制作两个最大和最小极值的mesh,根据差值计算中间的mesh值,然后在运行时生成最终显示的mesh,和调整骨骼的区别有点类似于骨骼动画和网格动画。
  3. 基于材质。在网格不修改的情况下,材质的变化用于肤色、瞳孔颜色、唇色、纹身图案等等,都可以通过材质中的贴图或者参数更改来改变。(UV的变化可以做到纹身颜色的自定义等等)
  4. 新的Mesh。这部分在《HoneySelect》中也有讲到,也是对于程序来说最为简单,对美术来说工作量最大的部分,用于发型、时装、多余的饰品挂件等等。

参考制作:

https://docs.unrealengine.com/latest/CHN/Engine/Content/FBX/MorphTargets/index.html
http://jjyy.guru/unity-animation

  • 10
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现虚拟人物换装的方法一般是将虚拟人物的模型和材质分开处理,然后通过替换模型和材质来实现换装效果。下面是一个简单的示例代码,演示如何实现虚拟人物换装: ```javascript // 加载虚拟人物的模型和材质 var modelLoader = new THREE.FBXLoader(); modelLoader.load('model.fbx', function (model) { var materialLoader = new THREE.TextureLoader(); materialLoader.load('material.png', function (material) { // 创建虚拟人物的模型和材质 var originalModel = new THREE.SkinnedMesh(model.geometry, new THREE.MeshStandardMaterial({ map: material })); // 将虚拟人物的模型添加到场景中 scene.add(originalModel); // 加载换装的模型和材质 var newModelLoader = new THREE.FBXLoader(); newModelLoader.load('new_model.fbx', function (newModel) { var newMaterialLoader = new THREE.TextureLoader(); newMaterialLoader.load('new_material.png', function (newMaterial) { // 创建换装的模型和材质 var newModel = new THREE.SkinnedMesh(newModel.geometry, new THREE.MeshStandardMaterial({ map: newMaterial })); // 将虚拟人物的材质替换为换装的材质 originalModel.material = newModel.material; // 将虚拟人物的模型替换为换装的模型 originalModel.geometry = newModel.geometry; originalModel.skeleton = newModel.skeleton; // 更新虚拟人物骨骼 originalModel.skeleton.bones.forEach(function (bone, index) { bone.position.copy(newModel.skeleton.bones[index].position); bone.quaternion.copy(newModel.skeleton.bones[index].quaternion); }); }); }); }); }); ``` 在这个示例中,我们首先加载虚拟人物的模型和材质,然后创建虚拟人物的模型和材质,并将其添加到场景中。接着,我们加载换装的模型和材质,创建换装的模型和材质,并将其应用到虚拟人物的模型上,从而实现了虚拟人物换装效果。 需要注意的是,这个示例只是一个简单的演示,实际使用时还需要根据具体情况进行调整和优化。例如,如果虚拟人物的模型和材质比较复杂,可能需要使用更高级的技术来实现换装效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值