Appearance
Unity IK 转 Three.js
虚拟人内容从 Unity 迁移到 Web 端时,最难搬的不是模型和贴图,而是 IK——两端的数学约定不同,直接把 IK 结果搬过去,动作是歪的。
技术问题
虚拟人产品常有双端需求:PC / 移动端用 Unity,Web 展示端用 Three.js。同一段角色动作要在两端呈现一致的效果。骨骼动画的关键帧数据相对好迁移,但 IK 驱动的动作——例如手够向某个目标点、脚踩实地面——依赖引擎侧的 IK 求解,Unity 里调好的 IK 表达拿到 Three.js 里没有直接对应物。
现有方案不足
- 坐标系约定不同:Unity 与 Three.js 在坐标 handedness 和轴向约定上存在差异,位置和旋转数据直接搬运会出现镜像、翻转。
- 骨骼层级不保证一致:同一角色在两端的骨骼命名、层级组织可能不同,IK 作用的目标骨骼对不上。
- IK 约束表达方式不同:IK 目标点、约束链这些概念在两端引擎里的表达和求解方式不同,没有现成的跨引擎转换手段。
核心思路
转换链路按「先对齐数学基础,再搬约束」组织:
mermaid
flowchart TD
A["Unity 侧 IK 表达<br>目标点 / 骨骼链 / 约束"] --> B["坐标系统一<br>位置与旋转变换"]
B --> C["骨骼层级映射<br>两端骨骼对齐"]
C --> D["IK 约束转译<br>目标与链式关系重建"]
D --> E["Three.js 侧求解与播放"]
E --> F["双端动作一致性验证"]- 坐标系统一:在数据出入口做位置与旋转的坐标变换,把 handedness 和轴向差异收敛到一个地方处理,业务侧不感知。
- 骨骼映射:建立 Unity 骨骼与 Three.js 骨骼的对应表,IK 链上的每一环都映射到 Web 端的正确骨骼。
- 约束重建:把 IK 目标点等约束信息转成 Three.js 侧可求解的表达,由 Web 端重新求解,而不是搬求解结果——这样 Web 端参数变化时动作仍然正确。
一个明确的边界:迁移的是「IK 表达」,不是「IK 求解结果」。搬结果只能得到一帧一帧的死数据,搬表达才能让 Web 端保留交互能力。
应用场景
- Unity 制作的虚拟人动作内容在 Web 页面中展示,双端效果一致。
- 跨引擎资产复用:动作内容只制作一份,分端转换。
- Web 端轻量虚拟人交互:在浏览器里保留 IK 驱动的交互动作能力。
关联案例
- Unity 到 Three.js 迁移:整条跨引擎迁移链路的工程实践,本页是其中 IK 环节的方案抽象。