依据 Gitea v1.27.3 modules/charset/escape_stream.go 的判定规则 (analyzeDetectResults:仅当左右相邻字符都不是非 ASCII 时才标记, 且 _common 表恒定生效),把说明文档中会被标记的全角标点 (,:;?!() 等)改为半角,并保证成对括号宽度一致。 中文语境中的全角标点(左右均为中文)保持原样,不动代码与契约语义。
1.5 KiB
1.5 KiB
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
算法
- 每根骨骼指定一条骨链(起点关键点,终点关键点)
- 取骨骼静止朝向
rest_dir(由该骨与首个子骨的位置差得出,不假设模型骨骼轴向) - 目标朝向由两个关键点在世界空间的方向得出
delta= rest_dir -> target_dir 的最小旋转四元数(保留扭转/roll)desired = Basis(delta) x rest_global_basispose_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 传播验证。