Appearance
头部坐标轴自动矫正
面捕数据假设模型头部坐标轴和世界坐标系一致,但真实模型不都守这个规矩——加载时自动检测偏差并矫正,而不是要求美术重做模型。
技术问题
面动捕驱动的本质是:把真人的头部旋转,直接映射到模型头部节点的旋转上。这个映射成立有一个隐含前提——模型头部节点的自身坐标轴和世界坐标系对齐。
实际项目里的模型并不都满足这个前提。头部节点可能在建模、导出、格式转换的任一环节被旋转过。不经过矫正就直接把面捕旋转写上去,头部会按错误的轴转动,表现为节点扭曲、姿态怪异。
现有方案不足
- 要求美术修模型:让美术把每个模型的坐标轴改规范。存量模型多时这是纯人力成本,而且改模型文件会牵连蒙皮和动画资源。
- 逐模型手写修正参数:程序侧为每个出问题的模型硬编码一个补偿旋转,不可维护,新模型接入一次踩一次坑。
- 驱动层忽略:大多数面捕管线默认坐标系已对齐,把问题暴露在线上表现为「这个模型驱动起来是坏的」。
核心思路
把坐标系适配从「美术规范问题」变成「运行时算法问题」:加载模型时自动检测头部节点的坐标轴偏差,算出矫正变换;面捕旋转先经矫正再应用到节点上;矫正结果缓存,不做每帧重算。
mermaid
flowchart TD
A["加载模型"] --> B{"检测头部节点<br>自身轴与世界轴"}
B -->|"已对齐"| C["直接驱动"]
B -->|"存在偏差"| D["计算矫正变换"]
D --> E["缓存矫正结果"]
F["每帧面捕头部旋转"] --> G{"该模型需要矫正?"}
G -->|"是"| H["旋转 × 矫正变换"]
G -->|"否"| I["原样应用"]
H --> J["写入头部节点"]
I --> J
E --> G关键实现
检测
模型加载完成后,读取头部节点的本地坐标轴方向,与世界坐标系的期望方向比对。偏差在阈值内视为已对齐,超出则进入矫正流程。检测只做一次,挂在加载流程上,不影响运行时性能。
矫正
矫正的本质是给面捕输入的旋转左乘一个补偿变换:先把「世界系下的头部旋转」换算到「该模型头部节点自己的轴系」下,再写入节点。这样同一个面捕输入,在规范模型和不规范模型上产生的视觉效果一致。
缓存
矫正变换按模型缓存,生命周期和模型实例一致。每帧驱动只做一次矩阵/四元数乘法,开销可以忽略。
应用场景
- 多来源模型接入:UGC 或第三方模型坐标系不规范时免人工修复。
- 面捕平台化:驱动层对模型零假设,新模型即插即用。
- 存量模型兼容:不重导资源即可修复驱动扭曲问题。
关联案例
- Unity 面捕落地:矫正所在的驱动链路。
- CaptureFramework 与 ModelDriverFramework:矫正属于驱动框架的模型适配能力。
- 基于 Mediapipe 的面部捕捉算法:头部旋转数据的上游来源。