VRChat改模:如何从模型上拆分部件(不涉及权重修改)
VRChat改模:如何从模型上拆分部件(不涉及权重修改)
本文是一篇关于如何在VRChat中使用Blender和Unity拆分模型部件的教程。文章详细介绍了使用Blender 2.93进行模型拆分的步骤,包括导入FBX文件、删除多余网格、调整变换属性、处理骨骼等。同时,文章也简要介绍了在Unity中进行模型拆分的方法。文章内容详尽,步骤清晰,适合VRChat改模的初学者参考学习。
作业环境
- Blender 2.93(blender点org,官网下载,steam版没有2.93)
- Blender-cats-blender-plugin(可选)
- Unity 2019.4.31f1
Blender拆分部件
通用处理部分:
- 将所需模型的.fbx文件复制并粘贴一份到新建文件夹
- 不要直接修改该FBX
- 如果zip中没找到.fbx或仅有Unitypackage文件,则导入后在Assets对应文件夹内找到FBX,右键-Show In Explorer,打开对应路径文件夹,复制.fbx即可(无需.meta)
- Unity-Assets中的fbx文件路径示例,带有展开箭头的模型就是FBX
打开Blender,新建文件-常规,删除自带的3个物体
左上角文件-导入-FBX,选择复制出来的FBX文件,导入设置默认
默认布局下,右上角展开Armature,找到需要拆分的部件,或者直接在场景中点击对应网格
衣装是Love Tulip,整套就蝴蝶结比较有用
- 删除其余网格
- 需要几个就留几个,可以一次拆分多个;萌新最好还是一次只拆一个
- 集合内按Ctrl+J可以合并网格,前提是UV贴图命名必须相同且使用同一贴图;如果UV不同,则合并后无论怎么上贴图换材质,模型都只会有纯色,也就是最严重的UV丢失问题(只能全部重做)
- 如果该网格上有自己不需要的地方,可以进网格编辑模式,随意选择几个顶点,Ctrl+L选择所有相连元素,再右键删除;也可以手动选择,按W切换选择模式,有框选、笔刷等;注意前后面是否都选上了
调整变换属性
虽然对于萌新来说,Unity内的调整操作更熟悉也更方便,但有些模型的原点与质心有偏差(经典表现为旋转时并不以物体为中心),或是缩放并不统一为1(子级的Transform-Scale并不是X 1,Y 1,Z 1),导致调整困难,这是FBX本身的问题引起的,所以最好还是在Blender中进行
Unity与Blender在同数值下对网格的作用大体上相等,可以先在Unity内用预制体调整,获得大概的数值,并应用在Blender中
前提为模型无上述问题(原点、缩放等);如有,将模型导入Blender处理
两者间坐标轴大致的互换:(默认状态下)
- Unity的+Z=Blender的-Y —— 大体为前进
- Unity的+Y=Blender的+Z —— 大体为上升
Unity内的坐标系,前进为+Z,上升为+Y
Blender内的坐标系,前进为-Y,上升为+Z
Unity内处理要点:
- 调整的应该是模型父级/最高级
- 本文中模型父级/最高级的定义为包含了模型所有骨骼与网格的项目,如图所示,一般为模型的名字,如Simple Skirt for xxx、LongWavyHair for xxx,而不是Armature或下面的网格
模型的父级/最高级示例 - X、Y、Z都最好调整到同一数值,防止模型变形
- 衣装,如连衣裙等,先调整Y轴缩放值,使领口和袖子大致能符合人物比例,再将X和Z也调成相同的数值;之后根据领口、袖子,以及裙子中线来调整位置,使人物大约在正中
- 如果调整时模型并不按自身中心旋转,建议直接放弃,进Blender再调整调起来太折磨了
- 如果旋转时变形严重,同上
- 有时候调整子级骨骼即可解决问题,但对于萌新来说比较困难,所以pass
Blender内处理要点:
- 一定要先应用全部变换
变换属性,应用全部变换,使位置、旋转全部为0,缩放全部为1 - 萌新可以开着Unity对照着做
- 保持全选(骨架+网格)再调整,因为Blender的父子级逻辑与Unity有差异
- 调整的方法与标准可参考上文Unity部分,互通
- Unity内对应预制体也要套用相应数值,使PB及其碰撞属性适应人物(大小、位置等)
- 调整完成后再应用一次变换;可以在应用前先备份一次工程
骨骼处理部分:
选中骨架Armature或其中任意骨骼,左上角进入姿态模式
展开骨架,或直接在场景中选择该网格附近的骨骼,按R旋转或者按G移动,观察网格是否整体相应运动,准备整理骨骼并将多余骨骼合并/删除
转动该骨骼,蝴蝶结整体跟着旋转
- 以上图的蝴蝶结为例,因为是头部装饰,所以要找的那根骨骼应该在Head附近,场景中是在两边蝴蝶结的中间,为单独一根骨骼,父级为Head
- 有时候并没有单独的一根骨骼,而是散装在Head内,那么此时应保留Head
- 如果拆分的是头发,则有可能是Neck而不是Head,因为网格有一些地方会被Neck影响;也可以用cats的Merge Weights将Head合并到Neck,并将Neck骨骼改名为Head
- 可以在右下角的视图显示中打开骨骼名称
打开骨骼名称显示
按Alt+R / Alt+G还原旋转/移动,左上角进入编辑模式
将该骨骼重新指定父级为最高一级的骨骼
- 保持选中某一骨骼的情况下,按小键盘.可以快速导航至右上角集合内对应项(需要鼠标放在集合内而不是场景里)
- 先选中需要重新指定的骨骼,再按Ctrl加选最高级骨骼(一般是Hips),Ctrl+P-创建父级-保持偏移量(鼠标放在场景内)
- 以图中为例,最高级骨骼为Hips,而不是Armature;Armature可以理解为一个总括,或者说是该骨架的名称
Ctrl+P创建父级,保持偏移量
- 删除其余骨骼
- Shift+G可以快速选择一条骨骼,选择相似元素-子级(鼠标放场景里)
- 以图中为例,需要删除Spine、Upper_leg.L、Upper_leg.R、Skirt以及它们对应的所有子级
删除多余骨骼以优化骨骼数量
- 可以复制一份Hips骨骼(Shift+D,右键),将其余骨骼的最高级指定父级为Hips.001,然后选择Hips.001,Shift+G一次性删除所有
复制一份骨骼并把其余骨骼重新指定父级,方便一次性清除
- 姿态模式内移动、旋转最高级骨骼,观察网格是否能完全跟随骨骼运动,确保网格没有被扯向原点的部分(丢失/缺少权重)
特别地:
如果拆分的是裙子等涉及多个身体骨骼权重的部件,则需要慢慢确认骨骼是否会影响网格(带有相应权重),千万不能多删
不需要的部分可以用上文的办法归总到某一根骨骼内,最后一起删除;或者用cats的merge weights合并到父级(更加保险)
想了解权重原理的,可以看我的穿着不适配衣装的文章:网页链接
有两种确认办法:
① 姿态模式移动骨骼
- 进入骨骼姿态模式,移动/旋转裙子内的骨骼,观察网格是否有变化
- 以图中的连衣裙为例(仅裙子,无其他配件如腿环、短裤等),移动Upperarm.L时,裙子的袖子处相应运动,说明该骨骼会影响网格(有权重),保留
- 移动、旋转完后记得Alt+G / Alt+R还原
移动上臂骨骼时,网格变化,说明该骨骼有权重
- 建议打开透显方便观察,Shift+Z,或者右上角切换视图着色方式
切换成透显
- 裙骨,如Hips下的Skirt.001等,一定会带有权重,无需检查
- 如有额外装饰,例如胸前的领结等,相关骨骼也要保留,如tie.001、chestribbon.001
- 一般情况下裙子不会带有腿部的权重,如果有,则保留 尊重原作者权重刷法吧虽然这并不是最好的,萌新也改不来这个
② 查看顶点组权重
- 物体模式下选中网格,左上角进入权重绘制
- 右上角,视图叠加层,将零权重改为活动项,这样零权重的地方会变成黑色而不是深蓝色,方便区分
零权重-活动项
- 打开透显,在右边顶点组里选择,观察网格是否带颜色;如有,说明有权重,同名的骨骼需要保留
- 建议切到采样权重(吸管)工具防止误操作
查看顶点组权重
- 在物体模式下,先选骨架(骨骼)再加选网格,然后进入权重绘制,此时用Ctrl+左键可以快速选择骨骼并切到对应顶点组(需要关闭顶点选择)
左上角关闭顶点选择时,可以用Ctrl+左键快速选择骨骼并切换
- 如果网格为紫色,说明该骨骼完全不会影响网格,没有权重
网格变紫,说明该顶点组没有权重
- 部分骨骼的同名顶点组权重虽然很少但不是没有,例如Head,只会在领子附近有一点点
- 小键盘1/3/7切换到正交图,9为当前相反视角,2/4/6/8分别对应旋转
后续修正及导出:
回到物体模式,按A全选,包括骨架和网格,左上角物体-应用-全部变换,或者Ctrl+A
左上角文件-导出-FBX,变换部分,应用缩放一定要选择FBX全部,否则Unity内材质描边以及PB半径等都会受影响
- 正常情况下,场景内现在应该只有网格及对应骨架,Limit to选定的物体可以不勾,将会导出场景内所有东西为一个FBX
导出设置
Unity内修正:
将新FBX导入Unity(拖入即可)
选中FBX,Inspector检查器中勾选Read/Write Enabled以及Legacy Blend Shape Normals,再点击右下角Apply应用
- 这两条必须勾选,否则不允许上传,也可以在SDK面板中Auto Fix,但是不提前勾选Legacy Blend Shape Normals时,使用形态键会导致网格阴影变化,所以建议自己提前做好
FBX设置
- 拖出该FBX到场景中,找到原模的材质,并拖给FBX
拖出材质球到Materials(展开,Elements),或者直接拖给场景中的物体
- 如果描边炸了(liltoon的轮廓),检查上一部分中导出时缩放是否选择了FBX全部
- 复制并粘贴原模的PB数据
- 如果要调整缩放,在复制PB前做好,因为模型内的碰撞体等也会对应变化
- 需要打开Gizmos才能看到PB的范围
- 右键PB脚本,Copy Components,再到新FBX对应骨骼,Transform处右键-Paste Component As New
- 以图中为例,只需粘贴头部蝴蝶结的PB即可
copy PB,最好打开Gizmos对照
- 如果PB半径和原模的相差甚远,还是导出时FBX缩放的问题,见上文
- 如果原PB有Ignore,需要自己重新指定新FBX内的对应同名骨骼才会生效;同理Root Transform,有些PB是从第二节开始的,可以直接粘贴到新FBX内的第二级骨骼,省去处理该项的麻烦
- 碰撞体直接从原模拖到对应骨骼就好
- 如果新FBX内已经没有对应骨骼了(如放在Chest的Collider),可以在FBX下新建一个空物体,把碰撞体拖进去,用MA Bone Proxy(作为子级,保持原有位置和旋转),目标选择对应骨骼;如果MA内没有对应位置的骨骼(如Breast.002,第二节胸骨),则更改子路径Sub Path,如Hip/Spine/Chest/Breast.001/Breast.002
用MA组件将碰撞体绑定给对应骨骼
- 图中我将原模移出原点一些位置,方便观察和参考,但处理碰撞时需要把原模位置归零,否则碰撞还在外面
- PB相关可以看我的文章,有详细的参数介绍:Physbone参数讲解/数值设置【VRChat】
网页链接
Booth上的无料Physbone复制插件(3919818):
【無料】PhysBone/Colliderを別アバに移植(コピー)するUnity拡張ツール - PhysCopy -
作者:せぃが君のおみせ屋さん
PB Copy插件 - 该插件的缺点是只认同名路径,差一点都不行,且PB内的Root Transform、Ignore等数据并不会自动变更为新路径下的骨骼,需要手动修正
- 第一行放已有PB的原模预制体,第二行放需要被复制PB的模型(目标模型)
- 功能区依次为:清除目标模型内的PB以及相关Collider、清除目标模型内的DB以及Collider、不检测目标模是否有AvatarDescriptor(衣装类需要勾选)、复制前进行备份
- 点击实行后,下方文本框内会显示复制失败的项目的路径
Unity拆分部件
仅使用Unity也可以做到拆件,类似的操作我在穿着不适配衣装的文章中详细写过,这里就简单提一下要点
详见【Unity内穿着不适配衣服】部分:
VRChat改模:如何让角色穿上不适配衣服
Booth上的有料拆分插件(5372808,800JPY) :
【VRChat】Cloth Separator (Unity Tool) 作者:cooki
精准删除和保留相关骨骼 且PB和碰撞也会设置好 但只能按照FBX内划分好的网格进行拆分
Unity内拆分(手动,简易版):
1.复制一份模型(预制体即可,不需要从FBX开始做),删除多余网格
2.进入Playmode,移动骨骼以确认骨骼是否会影响网格
3.退出Playmode,删除多余骨骼,以及多余的碰撞体、PB等
4.完成,建议保存为预制件,备份