第 6 课,使用摇曳骨让物体有物理效果
最后更新于
最后更新于
在做头发、耳坠、裙子之类的东西的时候,我们希望这个物体能受到物理效果,而不是静止不动。
COM3D2 使用的是 Unity 的
我们的游戏使用此插件做一些物理效果,然后做了一层封装,称为摇曳骨,也就是 yure bone。(也称为 Dynamic Bones 动态骨骼)
因此摇曳骨的参数怎么调可以参考此插件的相关教程,比如这位大佬的心得:
在游戏内调整摇曳骨效果需要使用 DynBoneEdit,默认快捷键 Alt + F12(注意此插件依赖于 AccEX) 这个插件:
在游戏外调整摇曳骨效果需要使用本人编写的 COM3D2 MOD EDITOR V2,编辑器内也写了详细的参数含义
物体名 = Blender 中的对象名称(黄色倒三角)
游戏中读取物体时,检查骨骼名称是否包含 _yure_
或 _yure_hair_
,如果有则尝试加载 物体名.phy
如果有 _yure_skirt_
则尝试加载 物体名.psk
.phy
里面可以填要加载哪个 .col
,如果没填就尝试加载 物品名.col
我们的 Blender CM3D2 插件会将去掉序号(foobar.001 -> foobar)以后的物体名称(黄色倒三角)写到 .model 的第二个字符串中。
然后游戏会将 .model 中的第二个字符串设置为根 gameObject 的名称,游戏内的大部分对模型的操作都是基于 gameObject 的。
简单来说就是 Blender 中的黄色倒三角名称 = 游戏中的根 gameObject 的名称。
默认加载流程如下(游戏版本 2.42.1)
加载模型
从 .menu 文件或其他途径加载模型。
骨骼名称检查
检查骨骼名称是否包含 _yure_
、_yure_skirt_
或 _yure_hair_
,以判断该骨骼是否适用于物理模拟。
物理文件加载
若检测到上述骨骼名称,则尝试加载 gameObject名称 + .phy
的物理文件。
如果包含 _yure_skirt_
,则尝试加载 gameObject名称 +.psk
的物理文件,注意是 .psk。
加载默认物理文件
如果未找到专属 .phy 文件,则根据骨骼名称 _yure_
、_yure_skirt_
或 _yure_hair_
选择默认的 .phy 文件。
头发骨骼的默认物理文件
若骨骼名称带有 yure_hair,则根据头发的 MPN 部位(menu 文件中的 additem 指定)选择默认的 .phy 文件。
(默认文件可以使用 SybarisArcEditor 提取)
hairf(前发)
default_hairf.phy
hairr(后发)
default_hairr.phy
hairs(侧发)
default_hairs.phy
hairt(假发)
default_hairt.phy
裙子骨骼的默认物理文件
若骨骼名称带有 _yure_skirt_
,默认选择 default_skirt.psk
,注意是 .psk。
普通摇曳骨的默认物理文件
若骨骼名称带有 _yure_
,但是 MPN 部位不是 hairaho(呆毛),那么没有默认的 .phy 和 .col 文件。但这不代表就没有物理效果,而是会根据名称是 _yure_soft_
还是 _yure_hard_
来给定一个默认值。
如果 MPN 部位是 hairaho,那么选择 default_haira.phy
。
碰撞器文件加载
读取碰撞器文件名。
读取 .phy 文件中指定的碰撞器文件名。
若 .phy 中指定了文件名,则加载 指定文件名 + .col
如下图。
头发骨骼的默认碰撞器
根据 MPN 部位选择默认的碰撞器文件。
(默认文件可以使用 SybarisArcEditor 提取)
hairf(前发)
default_hairf.col
hairr(后发)
default_hairr.col
hairt(假发)
default_hairt.col
hairs(侧发)
default_hairs.col
hairaho(呆毛)
default_hairaho.col
其他部位没有默认碰撞器
结束处理流程。
_yure_hard_
和 _yure_soft_
是从 CM3D2 继承而来的,CM3D2 时期没有 Dynamic Bone 插件,因此它们的计算方式和其他骨骼不同,也就没有默认 .phy 文件。
我在 COM3D2 MOD EDITOR V2 的 Phy 编辑中提到
模式(PartialMode);0 静态或曲线:使用设置的默认值或曲线,1 按骨骼名:手动按骨骼名单独为每个骨骼设置值,2 按旧骨骼名,仅限 _yure_hair_ 和 _skirt_ 自动按骨骼名匹配值,骨骼名中需要有关键词 _h_ 或 _h50_,根据有无关键词设置不同的值,如果是 _skirt_ 则只能使用 _h_(旧版本,不推荐)
模式 2 的骨骼关键词 _h_
或 _h50_
的参数设置和 _yure_hard_
和 _yure_soft_
的在一个地方,因此推测这也是 Dynamic Bone 出现前的旧代码(从 CM3D2 时期继承来的)。
感兴趣的请在代码中搜索 TBoneHair_ 和 DynamicBoneMgr,即可顺藤摸瓜。
由于 KISS 延续 10 年的旧代码过于神秘,我不敢说这个分析 100% 正确。
这次以我很喜欢的头饰丝带 acckamisub002 为例(这个也是 CM3D2 内的),如何导出请看第一课
导入到 blender 中长这样:
在物体模式下,添加单段骨骼,在合适位置添加骨骼(添加相连的骨骼:编辑模式选中骨骼,按 E 挤出一个骨骼),然后和原骨骼合并
或者也可以直接在原骨架下添加骨骼,这样就不用合并了。
注意只有一截骨骼是没有办法摇曳的,至少要 2 段
合并后显示效果也被同化了,如图:
最好在这里改回八面锥,不然分不清方向很容易出错
然后我们给骨骼改一下名,并创建顶点组
为什么名字里面有个 _yure_soft_
等下再说
如果你懒得手动刷权重,在权重绘制模式下有个自动按骨骼指定,这个的效果和 Ctrl+p 设置父级附带自动权重是一样的
只不过注意它的作用位置是右边选中的骨骼,而不是顶点组,不然你可能点半天发现没反应
然后选导出,注意一但编辑过骨骼,Bone Data Source 骨骼数据源就要选 Armature 骨架
然后编辑 menu 指向我们编辑过的 .model
进入游戏中,点击位置设定按钮,然后拖动,可以看到它有物理效果了! 而且两边的丝带还向下垂了
秘密就在于骨骼名称,游戏内预设了几种骨骼名称 _yure_soft_
、_yure_hard_
、_yure_skirt_
或 _yure_hair_
只要骨骼名称中包含这些名称,就会被识别为摇曳骨,不同的名称使用的预设物理效果不一样(见 《游戏如何读取 .phy 和 .col》 章节)
对于非头发或裙子的物件,请使用 _yure_soft_
或 _yure_hard_
,正如它的名字所暗示的,soft 软一些,hard硬一些
注意:由于骨骼不能重名,所以习惯上需要 _yure_soft_001
-> _yure_soft_002
或者 _yure_soft_a
-> _yure_soft_b
这样的命名中的 0 1 和 a b 只是为了给我们自己标记骨骼顺序,游戏并不在乎这个,所以叫什么都行。
如果有了自定义 .phy 文件,那么骨头叫 _yure_
也是可以的,但如果你没有自定义 .phy,那么骨骼名叫做 _yure_
什么都不会发生。
如果你对游戏内默认的物理效果不满意,也可以自定义 .col 和 .phy 文件来实现自定义碰撞箱和自定义物理参数。
我们首先需要 .col 和 .phy 文件,DynBoneEdit 才能识别
打开 COM3D2 MOD EDITOR V2,到 Phy 和 Col 选项中直接点击另存为,这样你就得到了一份空的 .phy 和 .col 文件。
如果你不需要碰撞箱,那么 .col 文件可以不需要,如果你只准备了 .phy,你会发现在 DynBoneEdit 中添加碰撞器是没有效果的。
(旧的办法是从别的 mod 复制一份 .col 和 .phy 文件,但是这样会残留很多信息,而且 DynBoneEdit 的 BUG 宇宙无敌多,所以现在 COM3D2 MOD EDITOR V2 有能力新建文件,所以不推荐这样做了)
然后将得到的 .phy 和 .col 文件的文件夹改为 blender 中的物体名(黄色倒三角)
为什么要改名?因为游戏读取这些文件的方式,详见 《游戏如何读取 .phy 和 .col》 章节
安装 DynBoneEdit 后按 Alt + F12 打开,然后重新装备一下物品,如果正确加载了 .phy 文件,这里就会显示为 DynBone
点击 DynBone 按钮就能打开编辑页面了
由于 DynBoneEdit 的 BUG 宇宙无敌多,时常会有无法导出的情况,如果遇到任何导出不了,或者导出了但没有效果,请把参数填到编辑器内解决。
(.col 和 .phy 的加载和 .model 一样是实时读取的,因此修改后只需要重新装备一下物品即可。)
于是我们试着来编辑一下各种参数,编辑器内对所有参数都有说明,不知道有什么作用请先看一下
注意:accKamiSub 这个部位有左右,如果 DynBoneEdit 调整一边预览没反应,就调整另外一边。其他类似部位也是一样。
比如我们把重力调到 +0.5,就会变成这样
官方的下坠重力效果用的是 外力 Y -0.01
如果你不想要默认下坠重力效果可以填 0
这样就不会有一个默认的下坠了,而只会跟着移动摇曳
由于头发的关系,如果不自定义位置,就会发现有点陷到头里了。
这次我们尝试用一个碰撞器来解决
DynBoneEdit 的最下面是 .col 的编辑,点这个增加就可以新增一个碰撞箱了
然后点 表示オン 就可以看到碰撞箱范围了(不是很准)
然后我触发了 DynBoneEdit 的 BUG,碰撞器不生效,导出也没用。
于是我只好在编辑器内先手动填写,我这里给头骨(Bip01 Head)添加了一个碰撞器,参数全部默认
回到游戏内可以看到有碰撞效果了,而且 DynBoneEdit 也正常显示了
这里我使用了一个平面碰撞器,而且约束边界选择 Inside,这样物体的摇曳骨就会一直保持在这个边界内
哪怕是躺下也一样
如果我不加这个约束,就会变成迷之效果
因为效果不好也和骨骼和权重有关系哦!比如我这里其实应该在丝带根部添加一个骨骼,然后把摇曳骨作为子级,然后把根部骨骼的硬度拉满,这样它就不会乱动了。
添加骨骼后我把丝带根部权重刷满,然后用梯度渐变在旁边也刷一些权重,不然你会发现,周围和中间各论各的
最后我还是删掉了碰撞器,因为有些时候会导致问题,然后在重力那里加了一点向后的力,然后把 Z 轴冻结了,这样转圈的时候就不会穿进去了,获得了我比较满意的效果。
导出路径在 MOD 文件夹的 ACC 文件夹里面,不在原位
有时候修改模式后导出后还是以前的,要么先用编辑器修改模式,要么手动填写
覆盖导出时需要勾选 上書き
该说不说的这个碰撞器真的很拉跨,如果你发现并不符合预期那是正常的,这个东西就是这么迷惑,要调处好的效果需要很久很久,而且 DynBoneEdit 的预览也不是很准,所以做好心理准备。
这个只能自己去尝试,说太多也没有用~
well,更新慢是因为去为 COM3D2 MOD EDITOR V2 编写了 .phy 和 .col 的支持。
DynBoneEdit 的 BUG 太多了,需要外置编辑器作为兜底。
顺便也更好的探究了游戏内部实现。
如果 .phy 文件中未指定碰撞器文件,则尝试读取 gameObject名称 + .col
。