第 6 课,使用摇曳骨让物体有物理效果

在做头发、耳坠、裙子之类的东西的时候,我们希望这个物体能受到物理效果,而不是静止不动。

COM3D2 使用的是 Unity 的 Dynamic Bone 插件

我们的游戏使用此插件做一些物理效果,然后做了一层封装,称为摇曳骨,也就是 yure bone。(也称为 Dynamic Bones 动态骨骼)

因此摇曳骨的参数怎么调可以参考此插件的相关教程,比如这位大佬的心得:https://forum.gamer.com.tw/Co.php?bsn=60602&sn=5966

在游戏内调整摇曳骨效果需要使用 DynBoneEdit,默认快捷键 Alt + F12(注意此插件依赖于 AccEX) 这个插件:https://ux.getuploader.com/trzr_tool/download/26

在游戏外调整摇曳骨效果需要使用本人编写的 COM3D2 MOD EDITOR V2,编辑器内也写了详细的参数含义https://github.com/MeidoPromotionAssociation/COM3D2_MOD_EDITOR

版本前瞻

在 COM3D2.5 v3.41.0 的时候,游戏从 Unity 5.6.4 升级到了 Unity 2022.3.35

而且此版本添加了这个 unity 插件:Magica Cloth 2

因此,以后可能会有更好的办法去做物理效果。

注意:仅 COM3D2.5

COM3D2 并没有更换游戏引擎版本,更没有这个插件。

这说明 KISS 我们维护了一个 MOD 插件支持版本,泪目了。

游戏如何读取 .phy 和 .col

最简单来说就是

  • 物体名 = Blender 中的对象名称(黄色倒三角)

  • 游戏中读取物体时,检查骨骼名称是否包含 _yure__yure_hair_,如果有则尝试加载 物体名.phy

  • 如果有 _yure_skirt_ 则尝试加载 物体名.psk

  • .phy 里面可以填要加载哪个 .col,如果没填就尝试加载 物品名.col

  • 如果没有自定义的 物体名.phy,那么就根据名称骨骼是 _yure_soft_ 还是 _yure_hard_ 来给定一个默认值。

读取流程不想看可以跳过。

读取流程

我们的 Blender CM3D2 插件会将去掉序号(foobar.001 -> foobar)以后的物体名称(黄色倒三角)写到 .model 的第二个字符串中。

然后游戏会将 .model 中的第二个字符串设置为根 gameObject 的名称,游戏内的大部分对模型的操作都是基于 gameObject 的。

简单来说就是 Blender 中的黄色倒三角名称 = 游戏中的根 gameObject 的名称。

默认加载流程如下(游戏版本 2.42.1)

  1. 加载模型

    • 从 .menu 文件或其他途径加载模型。

  2. 骨骼名称检查

    • 检查骨骼名称是否包含 _yure__yure_skirt__yure_hair_,以判断该骨骼是否适用于物理模拟。

  3. 物理文件加载

    • 若检测到上述骨骼名称,则尝试加载 gameObject名称 + .phy 的物理文件。

    • 如果包含 _yure_skirt_,则尝试加载 gameObject名称 +.psk 的物理文件,注意是 .psk。

  4. 加载默认物理文件

    1. 如果未找到专属 .phy 文件,则根据骨骼名称 _yure__yure_skirt__yure_hair_ 选择默认的 .phy 文件。

    2. 头发骨骼的默认物理文件

      • 若骨骼名称带有 yure_hair,则根据头发的 MPN 部位(menu 文件中的 additem 指定)选择默认的 .phy 文件。

      • (默认文件可以使用 SybarisArcEditor 提取)

      MPN 部位
      默认物理文件

      hairf(前发)

      default_hairf.phy

      hairr(后发)

      default_hairr.phy

      hairs(侧发)

      default_hairs.phy

      hairt(假发)

      default_hairt.phy

    3. 裙子骨骼的默认物理文件

      • 若骨骼名称带有 _yure_skirt_,默认选择 default_skirt.psk,注意是 .psk。

    4. 普通摇曳骨的默认物理文件

      • 若骨骼名称带有 _yure_,但是 MPN 部位不是 hairaho(呆毛),那么没有默认的 .phy 和 .col 文件。但这不代表就没有物理效果,而是会根据名称是 _yure_soft_ 还是 _yure_hard_ 来给定一个默认值。

      • 如果 MPN 部位是 hairaho,那么选择 default_haira.phy

  5. 碰撞器文件加载

    1. 读取碰撞器文件名。

      • 读取 .phy 文件中指定的碰撞器文件名。

      • 若 .phy 中指定了文件名,则加载 指定文件名 + .col 如下图。

      • 如果 .phy 文件中未指定碰撞器文件,则尝试读取 gameObject名称 + .col

    2. 头发骨骼的默认碰撞器

      • 根据 MPN 部位选择默认的碰撞器文件。

      • (默认文件可以使用 SybarisArcEditor 提取)

      MPN 部位
      默认碰撞器文件

      hairf(前发)

      default_hairf.col

      hairr(后发)

      default_hairr.col

      hairt(假发)

      default_hairt.col

      hairs(侧发)

      default_hairs.col

      hairaho(呆毛)

      default_hairaho.col

    3. 其他部位没有默认碰撞器

    4. 结束处理流程。

_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

图片

进入游戏中,点击位置设定按钮,然后拖动,可以看到它有物理效果了! 而且两边的丝带还向下垂了

444

秘密就在于骨骼名称,游戏内预设了几种骨骼名称 _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 只是为了给我们自己标记骨骼顺序,游戏并不在乎这个,所以叫什么都行。

(如果要使用 .psk 那么命名确实有要求,可以导出一条官方裙子查看)

如果有了自定义 .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 调整一边预览没反应,就调整另外一边。其他类似部位也是一样。

.phy 物理效果

图片

比如我们把重力调到 +0.5,就会变成这样

图片

官方的下坠重力效果用的是 外力 Y -0.01 如果你不想要默认下坠重力效果可以填 0

这样就不会有一个默认的下坠了,而只会跟着移动摇曳

图片

.col 碰撞器

由于头发的关系,如果不自定义位置,就会发现有点陷到头里了。

图片

这次我们尝试用一个碰撞器来解决

DynBoneEdit 的最下面是 .col 的编辑,点这个增加就可以新增一个碰撞箱了

图片

然后点 表示オン 就可以看到碰撞箱范围了(不是很准)

图片

然后我触发了 DynBoneEdit 的 BUG,碰撞器不生效,导出也没用。

于是我只好在编辑器内先手动填写,我这里给头骨(Bip01 Head)添加了一个碰撞器,参数全部默认

图片

回到游戏内可以看到有碰撞效果了,而且 DynBoneEdit 也正常显示了

图片

这里我使用了一个平面碰撞器,而且约束边界选择 Inside,这样物体的摇曳骨就会一直保持在这个边界内

图片

哪怕是躺下也一样

图片

如果我不加这个约束,就会变成迷之效果

555

因为效果不好也和骨骼和权重有关系哦!比如我这里其实应该在丝带根部添加一个骨骼,然后把摇曳骨作为子级,然后把根部骨骼的硬度拉满,这样它就不会乱动了。

添加骨骼后我把丝带根部权重刷满,然后用梯度渐变在旁边也刷一些权重,不然你会发现,周围和中间各论各的

图片

最后我还是删掉了碰撞器,因为有些时候会导致问题,然后在重力那里加了一点向后的力,然后把 Z 轴冻结了,这样转圈的时候就不会穿进去了,获得了我比较满意的效果。

图片
图片

DynBoneEdit 导出需要注意

  • 导出路径在 MOD 文件夹的 ACC 文件夹里面,不在原位

  • 有时候修改模式后导出后还是以前的,要么先用编辑器修改模式,要么手动填写

  • 覆盖导出时需要勾选 上書き

该说不说的这个碰撞器真的很拉跨,如果你发现并不符合预期那是正常的,这个东西就是这么迷惑,要调处好的效果需要很久很久,所以做好心理准备。

这个只能自己去尝试,说太多也没有用~

待续

well,更新慢是因为去为 COM3D2 MOD EDITOR V2 编写了 .phy 和 .col 的支持。

DynBoneEdit 的 BUG 太多了,需要外置编辑器作为兜底。

顺便也更好的探究了游戏内部实现。

最后更新于