Files
opendance-windows/tasks/006-skeleton-retarget.md

46 lines
1.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# T-WIN-006 关键点 -> VRM 骨骼重定向
- **状态**:done
- **依赖**:T-WIN-005、T-WIN-004
## 目标
把 33 点关键点实时驱动到 VRM 骨骼上。
## load
```
DSH.md
contracts/skeleton-topology.md # 锚点:1 33 点、2 虚拟关节、4 坐标系
src/anim/skeleton_retarget.gd
```
## 算法
1. 每根骨骼指定一条骨链(起点关键点,终点关键点)
2. 取骨骼静止朝向 `rest_dir`(由该骨与首个子骨的位置差得出,**不假设模型骨骼轴向**)
3. 目标朝向由两个关键点在世界空间的方向得出
4. `delta` = rest_dir -> target_dir 的最小旋转四元数(保留扭转/roll)
5. `desired = Basis(delta) x rest_global_basis`
6. `pose_local = parent_global_basis⁻¹ x desired`
**第 6 步的合成公式是实测标定的**:Godot 文档未写明 rest/pose 的合成顺序,
在真实 VRoid 模型上暴力枚举 5 种候选公式,只有该式误差为 1.9e-8(其余 ~0.14)。
已有回归测试守护,不得凭记忆改写。
## 坐标转换
契约 4 的 MediaPipe 归一化坐标 -> Godot 世界方向:
`Vector3(x x aspect, -y, -z x aspect)`(x/z 以图像宽为基准故乘宽高比)。
## 验收
`tests/test_retarget.gd` -- 最关键的是**功能性**断言:
```
-> 左上臂方向点积 1.0000,左前臂方向点积 1.0000
```
即:给定一组关键点,重定向后骨骼在世界空间的**实际指向**与关键点方向一致;
另有判别性验证(换一组关键点骨骼朝向随之改变)与躯干 FK 传播验证。