先来两张图
在线演示地址: https://showcase.ukylin.net/avatar/
3D换装有两种情况,一种是身体各部件(如头发、上衣、裤子、手套、鞋子等身体各部分),另一种是挂接件 (如耳环、武器等等)
1、部件换装
3D的换装原理比2D简单多了。只需要满足三个原则就行。
1、使用同一套骨骼进行蒙皮。
2、每套模型在蒙皮的时候,骨骼的TPOSE要一致。
3、各部件接缝处要自然,一般是皮肤处接缝或者衣物遮挡处设计接缝。
我们在网上找到的支持换装的模型,都是符合上面的原则的。之所以把这三点列出来,仅仅是为了科普一下。
2、挂接件换装
挂接件换装其实就是在人的骨骼上找一个节点,挂上去就行。比如拿大剑的人物,我们就在其右手上找一个节点,将大剑挂在上面就行。
挂大剑的节点的一般制作方法:
由美术在3DMAX里面找一个适合的骨骼节点,然后在下面新建一个Dummy结点,调节Dummy节点的旋转、绽放、位移,使大剑能够以合理的姿势出现在人物手上。
这个方法最好的好处就是制作大剑动画的美术,可以将大剑挂到角色手上进行动画制作,这样制作出来的动画会非常到位。
本DEMO框架采用《麒麟子惯用的框架》 可以先行了解。
1、资源
主要模型资源在assets/resources/Prefabs下面,assets/resources/Textures下面是对应的贴图。
2、Avatar
麒麟子在场景上留了一个Avatar节点,并挂接了Avatar.ts脚本。Avatar.ts脚本会顺应换装消息,并加载对应的模型信息。
其中最关键的代码为Avatar:changeBodypart函数,此函数主要做几件事情:
changeBodypart(part: number, suitId: string) {
let oldPart = this.bodyparts[part];
if (oldPart) {
oldPart.removeFromParent();
oldPart.destroy();
this.bodyparts[part] = null;
}
let partName = '';
if (part == AvatarBodyparts.WEAPON) {
partName = 'ch_we_hou_' + suitId;
}
else {
partName = 'ch_pc_hou_' + suitId + '_' + AvatarBodyparts.getPartName(part);
}
loader.loadRes('Prefabs/' + partName, Prefab, (err, prefab) => {
let node = instantiate(prefab);
if (part == AvatarBodyparts.WEAPON) {
//this._weaponPointR.addChild(node);
}
else {
this.node.addChild(node);
}
this.bodyparts[part] = node;
let meshNode = find('RootNode/' + partName, node);
let albedoMapName = AvatarBodyparts.getNameOfBodypart(part, suitId) + '_d';
loader.loadRes('Textures/' + albedoMapName, ImageAsset, (err, tex: ImageAsset) => {
if (tex) {
meshNode.getComponent(SkinningModelComponent).material.setProperty('albedoMap', tex._texture);
}
});
});
}
3、HUD界面
assets/resources/HUD.prefab 是本DEMO的HUD层,所有按钮都在里面。
点击对应部位的按钮,HUD.ts会通过事件向Avatar.ts传递换装消息,Avatar.ts响应后会做出改变
4、MyInfo界面
点击右上角的?图标,会出现个人信息界面。此界面用于演示惯用框架的弹窗界面设计和留作者信息。
1、麒麟子下载的FBX模型导入后,没有找到动画,挺奇怪。所以目前是静态的,武器挂接也无法实现。本DEMO只实现了部件换装。
2、后面麒麟子找到了带骨骼动画的FBX换装模型后,会再补一篇贴子。
3、本教程源码使用Cocos Creator 3D 1.1.1编写,若用其他版本打开,可能产生兼容问题
4、源码地址:https://gitee.com/qilinzi/creator3ddemos/avatar/
5、想第一时间想阅读到本文的朋友,可以关注我