> For the complete documentation index, see [llms.txt](https://90135.gitbook.io/com3d2_simple_mod_guide_chinese/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://90135.gitbook.io/com3d2_simple_mod_guide_chinese/jiao-cheng/90135/90135-de-com3d2-jian-ming-mod-jiao-cheng/di-6-ke-shi-yong-yao-ye-gu-rang-wu-ti-you-wu-li-xiao-guo.md).

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

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

COM3D2 使用的是 Unity 的 [Dynamic Bone 插件](https://assetstore.unity.com/packages/tools/animation/dynamic-bone-16743)

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

<br>

因此摇曳骨的参数怎么调可以参考此插件的相关教程，比如这位大佬的心得：<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>

<details>

<summary>版本前瞻</summary>

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

而且此版本添加了这个 unity 插件：[Magica Cloth 2](https://assetstore.unity.com/packages/tools/physics/magica-cloth-2-242307)

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

注意：仅 COM3D2.5

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

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

</details>

## 游戏如何读取 .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 的名称。

![在这里指定](https://github.com/user-attachments/assets/330493a6-ea53-4df6-9a53-d5f82f4d057b)

默认加载流程如下（游戏版本 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`。 ![在这里指定](https://github.com/user-attachments/assets/383fd59b-637d-4b4b-9a09-879022d1cc4c)
   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. 结束处理流程。

<br>

`_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，即可顺藤摸瓜。

<br>

由于 KISS 延续 10 年的旧代码过于神秘，我不敢说这个分析 100％ 正确。

## 使物体拥有物理效果

这次以我很喜欢的头饰丝带 acckamisub002 为例（这个也是 CM3D2 内的），如何导出请看第一课

![图片](https://github.com/user-attachments/assets/e74ecb92-ee14-4580-a34a-f7704953e15b)

导入到 blender 中长这样：

![图片](https://github.com/user-attachments/assets/106f2ce6-8ede-4d16-a239-48eb3cf807e5)

在物体模式下，添加单段骨骼，在合适位置添加骨骼（添加相连的骨骼：编辑模式选中骨骼，按 E 挤出一个骨骼），然后和原骨骼合并

或者也可以直接在原骨架下添加骨骼，这样就不用合并了。

注意只有一截骨骼是没有办法摇曳的，至少要 2 段

![图片](https://github.com/user-attachments/assets/8ee4d870-0e88-4ea9-aea3-92278e40b734)

![图片](https://github.com/user-attachments/assets/e98895fd-86a6-4171-b169-324e36c1d60f)

合并后显示效果也被同化了，如图：

![图片](https://github.com/user-attachments/assets/5c32a7ee-2d3c-4443-99f8-6623e20f91f2)

最好在这里改回八面锥，不然分不清方向很容易出错

![图片](https://github.com/user-attachments/assets/fe62e931-fe9d-4bb6-b0e2-21c8fe4f8c45)

然后我们给骨骼改一下名，并创建顶点组

为什么名字里面有个 `_yure_soft_` 等下再说

![图片](https://github.com/user-attachments/assets/e85f7c92-9f60-4272-b766-0e2b3ff4ee96)

如果你懒得手动刷权重，在权重绘制模式下有个自动按骨骼指定，这个的效果和 Ctrl+p 设置父级附带自动权重是一样的

只不过注意它的作用位置是右边选中的骨骼，而不是顶点组，不然你可能点半天发现没反应

![图片](https://github.com/user-attachments/assets/5b57fbb3-4439-4231-b578-82b77c4314fa)

然后选导出，注意一但编辑过骨骼，Bone Data Source 骨骼数据源就要选 Armature 骨架

![图片](https://github.com/user-attachments/assets/6c4bb9f1-d4ed-4912-93a7-05ce58ce9442)

然后编辑 menu 指向我们编辑过的 .model

![图片](https://github.com/user-attachments/assets/754f5b5d-c8b8-49c1-a3ab-7431abef9600)

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

![444](https://github.com/user-attachments/assets/54dd4f80-c8f0-40f8-985c-62c6408c2323)

秘密就在于骨骼名称，游戏内预设了几种骨骼名称 `_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 才能识别**

<br>

打开 COM3D2 MOD EDITOR V2，到 Phy 和 Col 选项中直接点击另存为，这样你就得到了一份带默认参数的 .phy 和 .col 文件。

如果你不需要碰撞箱，那么 .col 文件可以不需要，但如果你只准备了 .phy，你会发现在 DynBoneEdit 中添加碰撞器是没有效果的。

（旧的办法是从别的 mod 复制一份 .col 和 .phy 文件，但是这样会残留很多信息，而且 DynBoneEdit 的 BUG 宇宙无敌多，所以现在 COM3D2 MOD EDITOR V2 有能力新建文件，所以不推荐这样做了）

然后将得到的 .phy 和 .col 文件的文件夹改为 blender 中的物体名（黄色倒三角）

![图片](https://github.com/user-attachments/assets/c73c8bc8-a8d8-4a8e-bc43-bf3874fb73b0)

为什么要改名？因为游戏读取这些文件的方式，详见 《游戏如何读取 .phy 和 .col》 章节

安装 DynBoneEdit 后按 Alt + F12 打开，然后重新装备一下物品，如果正确加载了 .phy 文件，这里就会显示为 DynBone

![图片](https://github.com/user-attachments/assets/5c381cf2-eef1-4b02-9faa-78a6263d21a3)

点击 DynBone 按钮就能打开编辑页面了

![图片](https://github.com/user-attachments/assets/94c521a8-0b8d-4c90-bdf5-d6097a6fd808)

<br>

由于 DynBoneEdit 的 BUG 宇宙无敌多，时常会有无法导出的情况，如果遇到任何导出不了，或者导出了但没有效果，请把参数填到编辑器内解决。

（.col 和 .phy 的加载和 .model 一样是实时读取的，因此修改后只需要重新装备一下物品即可。）

于是我们试着来编辑一下各种参数，编辑器内对所有参数都有说明，不知道有什么作用请先看一下

注意：accKamiSub 这个部位有左右，如果 DynBoneEdit 调整一边预览没反应，就调整另外一边。其他类似部位也是一样。

#### .phy 物理效果

![图片](https://github.com/user-attachments/assets/fd9128c0-330d-4bc8-8edd-cef92372e86c)

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

![图片](https://github.com/user-attachments/assets/ca52787f-36ab-4888-b99d-71367cba2315)

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

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

![图片](https://github.com/user-attachments/assets/79407ca4-a14a-43f4-828f-25f1ba6eb88a)

#### .col 碰撞器

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

![图片](https://github.com/user-attachments/assets/c44924d7-e6e2-4b9d-90e9-10f381d737ef)

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

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

![图片](https://github.com/user-attachments/assets/1d2cb779-3a0c-416e-bf02-c3aa0de530b1)

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

![图片](https://github.com/user-attachments/assets/8fbf36b9-f7f8-4205-be53-11b3620b5870)

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

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

![图片](https://github.com/user-attachments/assets/a1bf0f24-f461-4213-868e-a257b3ba1f7e)

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

![图片](https://github.com/user-attachments/assets/0be3ade8-d74a-49b4-a272-a12489704c73)

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

![图片](https://github.com/user-attachments/assets/ab9cbe11-7940-43ea-b00a-9c905ccb5ee9)

哪怕是躺下也一样

![图片](https://github.com/user-attachments/assets/77efdb2f-6a14-4a40-a5d3-9ba5f84d26ab)

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

![555](https://github.com/user-attachments/assets/31534b43-c4a8-4616-b1c5-4ef96792e944)

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

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

![图片](https://github.com/user-attachments/assets/ffc6ea54-8c0f-4548-92b6-2630d8641b81)

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

![图片](https://github.com/user-attachments/assets/02bd61b0-debf-4f88-ac12-85bf5641ecb8)

![图片](https://github.com/user-attachments/assets/2c9737bb-f23e-4d68-a731-902786eefd08)

#### DynBoneEdit 导出需要注意

* **导出路径在 MOD 文件夹的 ACC 文件夹里面，不在原位**
* 有时候修改模式后导出后还是以前的，要么先用编辑器修改模式，要么手动填写
* 覆盖导出时需要勾选 上書き

\ <br>

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

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

关于更详细的头发和裙子骨骼说明和技巧，请查看本仓库内的 ymk 移植教程和无名老师的教程。

## 待续

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

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

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