# 3ds Max → Unity FBX 导出完整指南

这是将在 3ds Max 中完成绑定和蒙皮的角色**正确导入 Unity** 的标准流程。
理解"为什么这样做"，即使场景不同也能自行应对。

---

## 0. 成功标准 — 看到这个画面就完成了

将 FBX 拖入 Unity，选择 **Root**（顶层对象）后，Inspector 中的 Transform 应显示如下：

| 项目 | 值 |
|------|-----|
| **Position** | 0, 0, 0 |
| **Rotation** | 0, 0, 0 |
| **Scale** | 1, 1, 1 |

![目标 - Unity 场景全貌](image.png)

![目标 - Root Transform](image_1.png)

**为什么这些值很重要?**
Root 保持 `0 / 0 / 1` 的干净状态，才能确保 Prefab 实例化、动画重定向、物理和碰撞体计算都可预测。
如果 Scale 进来是 `0.01`，或 Rotation 是 `-90`，误差就会积累到所有子骨骼、网格和动画片段中，事后追查原因将非常困难。**在导入时解决问题是最省事的做法。**

---

## 1. 为什么坐标和单位会不一致？（必备背景知识）

3ds Max 和 Unity 使用**不同的坐标系和默认单位**。FBX 文件充当两者之间的翻译桥梁——如果导出选项错误，翻译就会出偏差，上述值就会出错。

| 项目 | 3ds Max | Unity |
|------|---------|-------|
| **上方向轴** | **Z-up**（Z 朝上） | **Y-up**（Y 朝上） |
| **坐标系手向** | 右手坐标系 | 左手坐标系 |
| **内部长度单位** | 场景单位自由（**推荐 cm**） | **1 unit = 1 meter，固定** |

两个核心要点：

- **轴**：必须将 Max 的 Z-up 转换为 Unity 的 Y-up，否则角色会横倒。
- **单位**：Unity 的 "1 = 1 米" 是绝对固定的。在 Max 中使用 cm 工作时，1cm = 0.01m，FBX 必须正确吸收这 100 倍的差值，Scale 才能落到 `1`。否则 `0.01` 会原样保留。

> 本指南的所有步骤，最终目标都是**"将轴设为 Y-up，将单位基准设为 cm"**。

---

## 2. STEP 1 — 确认场景单位（cm 基准）

首先确认 Max 场景使用什么单位。进入 `Customize > Units Setup` 菜单。

![Units Setup 菜单位置](image_2.png)

将 `Display Unit Scale` 设置为 **Metric → Centimeters**。

![Units Setup - Centimeters](image_3.png)

**为什么用 cm?**
BipedPlus 的内部计算（高度、缩放等）以 **cm 为基准（SSOT）**。而且 Max 的标准导出惯例就是 cm，所以设置为 cm 后，后续的 FBX 单位转换会最干净地对齐。

> 即使工作室流程锁定在 m（米），**至少在绑定和导出阶段推荐使用 cm**。（m 场景支持是工具后续改进计划）

---

## 3. STEP 2 — 轴对齐（Z-up → Y-up）

Max 是 Z-up，Unity 是 Y-up。导出前需要**以 Root 为基准，将方向对齐到 Unity 惯例（Y 朝上，Z 朝前）**。

![Max 骨架层级与轴向](image_4.png)

> 在 3ds Max 中，将 **Y 设为上方，Z 轴设为正面（前方）**，即可与 Unity 的方向对齐。

对齐方法：选择 Root，**以世界坐标为基准绕 X 轴旋转 +90°**。（Rotate Transform Type-In → `Absolute:World` X = 90）

![World X +90° 旋转](image_5.png)

**为什么是 X 轴 90°?**
要将 Z-up 空间变换为 Y-up 空间，需要将上方向向量从 Z 旋转 90° 到 Y。这个旋转正好弥补了两个引擎"上方向"定义的差异。

---

## 4. STEP 3 — 只选择导出对象（蒙皮骨骼 + 网格）

导出时，**只选择蒙皮骨骼树 + 网格（几何体）**。控制器、辅助体、绑定组（`Ctrl_World`、`Grp_Rig`、`Drv_Root` 等）**不要包含在内。**

![只选择蒙皮骨骼 + 网格树](image_6.png)

**为什么不能导出整个骨架?**
Unity 实际需要的只是**蒙皮网格 + 驱动它的骨骼**。绑定控制器/辅助体在游戏引擎中毫无用处，而且还会：

- 增加不必要的骨骼层级，使导入变重，
- 混入带有缩放/偏移的控制节点，导致 **Scale 0.01 之类的污染**。

> 原则：**只导出"游戏需要的内容"。**

---

## 5. STEP 4 — FBX 导出选项

### (1) Include — 动画和变形

- 勾选 **Animation**
- 勾选 **Deformations → Skins, Morphs**（蒙皮权重和形态键需要一起导出）

![FBX Include 选项](image_7.png)

### (2) Advanced Options — 单位和轴

这是最关键的部分。前面讲解的单位和轴转换在这里最终确定。

| 选项 | 值 | 含义 |
|------|-----|------|
| **Units → Automatic** | 勾选 | 自动检测并转换场景单位 |
| **Scene units converted to** | **Centimeters** | 场景是 cm，所以以 cm 导出 |
| **Scale Factor** | **1.0** | 无额外倍率（转换由单位负责） |
| **Axis Conversion → Up Axis** | **Y-up** | 对齐 Unity 的上方向轴 |

![FBX 单位·轴选项](image_8.png)

**为什么是这个组合?**
`Scale Factor 1.0` + `cm` + `Y-up` 的组合下，Unity 导入时会自动吸收 cm→m（÷100）和轴转换，使 **Root Scale 精确落在 1.0**。随意改动 Scale Factor 会重新引入 100 倍/0.01 倍的误差。

> Unity 的 Up 轴是 Y，所以导出时**必须选 Y-up**。

---

## 6. STEP 5 — 在 Unity 中验证

将 FBX 导入 Unity，选择 Root，确认是否与 **[0. 成功标准]** 一致：

- Position 0, 0, 0
- Rotation 0, 0, 0
- Scale 1, 1, 1

三项全部匹配，即导入成功。

---

## 7. 常见错误与故障排除

### 错误 1 — Root Scale 以 `0.01` 进来

![错误示例 - Scale 0.01](image_9.png)

> **不要包含 Transform 不是默认值的 Root 骨骼。**

**原因**：将 Transform 未重置（非默认值）的 Root/控制节点包含在导出中。该节点上的 `0.01` 缩放（或 cm↔m 未转换量）会直接 bake 进 Unity Root。

**解决方法**：
- 从导出对象中**排除控制器/辅助体 Root**，只导出 Transform 干净的蒙皮骨骼树 + 网格。（参见 STEP 3）
- 再次确认 FBX 选项中 `Scale Factor` 为 `1.0`，`Units = Centimeters`。

---

### Q&A — Scale 显示 `0.9999999`，有问题吗?

![Scale 0.9999999](image_10.png)

**结论：正常。** 3D 图形以**浮点数（floating point）**存储值，经过多次矩阵变换（旋转、单位换算等）后，`1.0` 可能会细微偏移为 `0.9999999`。这不是误差，而是**运算的自然舍入结果**，对实际使用没有影响。

**如果仍然想要干净的 `1.0`**：将该节点的 Transform 用 **PRS 通道重置**，然后将 Position 替换为 **Position Constraint**，将 Rotation 替换为 **Orientation Constraint**。（用纯 PRS 替代 Transform Script）

![Transform Script → PRS + Constraint](image_11.png)

这样可以消除累积误差，使值归整。

![整理后 - Scale 1.0](image_12.png)

---

## 8. 最终检查清单

导出前只需确认这 5 项：

- [ ] **单位**：场景设置为 Centimeters（`Customize > Units Setup`）
- [ ] **轴**：Root 绕 World X 旋转 **+90°**（Y-up 对齐）
- [ ] **选择**：只选蒙皮骨骼树 + 网格（排除控制器和辅助体）
- [ ] **FBX 选项**：Units `Automatic / cm`，Scale Factor `1.0`，Up Axis `Y-up`，勾选 Animation·Skins·Morphs
- [ ] **Unity 验证**：Root Transform = `0/0/0 · 0/0/0 · 1/1/1`

> `0.9999999` 的 Scale 是正常的浮点误差。只有觉得有必要时，才用 PRS 重置 + Constraint 整理。