Files
opendance-windows/tasks/006-skeleton-retarget.md
T
zijunchiang 9f7b926a9a docs: 新增「初次部署(从零跑起来)」;去混淆字符与真实内网信息
- README.md / README.txt 新增初次部署章节:前置条件、获取代码、首次运行、
  配置服务端地址(API 3000 / 管理端 3001 分离)、与 Android 的 WebSocket 联通、
  打包导出、自检清单、常见问题
- 三库同源契约:':=' 写法修回、去掉真实 MariaDB 版本串
- 全文去除易被 Gitea 判为「模棱两可 Unicode」的字符(- - ... -> 取代 — – … § →)
- 真实内网地址与库名改占位符
2026-09-15 21:33:27 +08:00

1.5 KiB
Raw Blame History

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) × rest_global_basis
  6. pose_local = parent_global_basis⁻¹ × desired

第 6 步的合成公式是实测标定的:Godot 文档未写明 rest/pose 的合成顺序, 在真实 VRoid 模型上暴力枚举 5 种候选公式,只有该式误差为 1.9e-8(其余 ~0.14)。 已有回归测试守护,不得凭记忆改写。

坐标转换

契约 4 的 MediaPipe 归一化坐标 -> Godot 世界方向: Vector3(x × aspect, −y, −z × aspect)(x/z 以图像宽为基准故乘宽高比)。

验收

tests/test_retarget.gd -- 最关键的是功能性断言:

-> 左上臂方向点积 1.0000,左前臂方向点积 1.0000

即:给定一组关键点,重定向后骨骼在世界空间的实际指向与关键点方向一致; 另有判别性验证(换一组关键点骨骼朝向随之改变)与躯干 FK 传播验证。