# 第 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 太多了，需要外置编辑器作为兜底。

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET 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?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
