255 lines
7.3 KiB
Markdown
255 lines
7.3 KiB
Markdown
# Ground 去 Fragment 依赖实施方案
|
||
|
||
更新时间:2026-04-08
|
||
|
||
## 1. 这份方案现在只解决什么
|
||
|
||
只解决一件事:
|
||
|
||
- `Ground + 真实物体` 主链里,尽量去掉 `fragment` 参考姿态依赖
|
||
|
||
只允许改动:
|
||
|
||
- `PathAnimationManager.cs`
|
||
- 必要时补少量日志
|
||
|
||
明确不做:
|
||
|
||
- 不新建大范围工具链
|
||
- 不改 `Hoisting`
|
||
- 不改 `Rail`
|
||
- 不重写 `ModelItemTransformHelper`
|
||
- 不删除 `RealObjectReferencePoseResolver`
|
||
- 不做“整项目去 fragment”
|
||
|
||
这份方案的目标是:**缩小修改范围,先把 Ground 主链收干净。**
|
||
|
||
---
|
||
|
||
## 2. 当前已确认的事实
|
||
|
||
1. `Ground` 的变换更适合走最简单的宿主增量法:
|
||
- 宿主旋转增量
|
||
- 宿主平移增量
|
||
2. `Ground` 这条链不应该再扩散 `local/reference/fragment` 概念。
|
||
3. `fragment` 现在的问题,不在于“所有地方都要立刻删”,而在于:
|
||
- Ground 主链还会读它
|
||
- 导致旋转来源不稳定
|
||
4. `Ground` 这条链仍然有旋转目标,但这个旋转目标不再来自 `fragment` 参考姿态解释。
|
||
5. `Ground` 后续只需要求:
|
||
- 路径在宿主平面里的方向
|
||
- 对应的宿主平面旋转量
|
||
6. 也就是说,`Ground` 不再求“reference-based pose”,而只求:
|
||
- `hostForward`
|
||
- `hostUp`
|
||
- `host-planar rotation delta`
|
||
|
||
---
|
||
|
||
## 3. 只保留的改造目标
|
||
|
||
这轮只保留 3 个具体目标:
|
||
|
||
1. `Ground` 初始化时,不再优先读 fragment 参考姿态
|
||
2. `Ground` 平面姿态求解时,不再走 fragment 参考旋转入口,而只求宿主平面旋转量
|
||
3. `Ground` 不再允许 fragment planar fallback
|
||
|
||
只要这 3 点做到,就算这一轮完成。
|
||
|
||
---
|
||
|
||
## 4. 当前 Ground 需要处理的入口
|
||
|
||
### 4.1 初始化入口
|
||
|
||
当前重点看:
|
||
|
||
- `SyncTrackedRotationToObjectReference(...)`
|
||
|
||
要求:
|
||
|
||
- 当 `PathType == Ground` 且是真实物体时
|
||
- 不再去走 `TryCaptureRealObjectReferenceRotation(...)`
|
||
- 直接改用当前实际几何姿态,或现有非 fragment 入口
|
||
- 这一步的目的不是继续建立另一套“参考姿态定义”,而只是拿到当前增量起点
|
||
|
||
### 4.2 平面姿态求解入口
|
||
|
||
当前重点看:
|
||
|
||
- `TryGetRealObjectReferenceRotation(...)`
|
||
- `TryCreateReferenceBasedRealObjectPlanarPoseSolution(...)`
|
||
|
||
要求:
|
||
|
||
- `Ground` 不再从这里拿 fragment 参考旋转
|
||
- `Ground` 不再继续求 reference-based pose
|
||
- `Ground` 只求宿主平面旋转量:
|
||
- 路径 `hostForward`
|
||
- 宿主 `hostUp`
|
||
- 当前对象在宿主坐标系下要追加的平面旋转量
|
||
|
||
### 4.3 fallback 入口
|
||
|
||
当前重点看:
|
||
|
||
- `ShouldAllowFragmentPlanarFallback(PathType pathType)`
|
||
|
||
要求:
|
||
|
||
- `Ground` 改成和 `Hoisting` 一样,不再允许 fragment planar fallback
|
||
|
||
---
|
||
|
||
## 5. 实施顺序
|
||
|
||
只按下面顺序做,不扩展:
|
||
|
||
1. 先改 `Ground` 初始化入口
|
||
2. 再改 `Ground` 平面姿态求解入口
|
||
3. 再改 `Ground` 尺寸/通行空间入口,避免它们继续偷偷走 `reference-based pose`
|
||
4. 最后关掉 `Ground` 的 fragment fallback
|
||
|
||
每一步都要求:
|
||
|
||
- 先看日志
|
||
- 只改 `Ground`
|
||
- 不顺手改别的路径
|
||
|
||
### 5.1 2026-04-07 夜间分析结论
|
||
|
||
第一刀已经证明:
|
||
|
||
- `Ground` 初始化入口可以先切掉 fragment
|
||
- 但这还不够
|
||
|
||
这次日志暴露出的真正问题是:
|
||
|
||
- `Ground` 虽然不再直接读 fragment
|
||
- 但起点姿态求解仍然在走 `TryCreateRealObjectPlanarPoseSolution(...)`
|
||
- 也就是仍然在走 `reference-based pose` 入口
|
||
|
||
所以第二刀必须明确成:
|
||
|
||
1. `Ground` 不再进入 `TryCreateRealObjectPlanarPoseSolution(...)`
|
||
2. `Ground` 起点旋转改成:
|
||
- 当前显示旋转
|
||
- 当前宿主平面 yaw
|
||
- 路径目标宿主平面 yaw
|
||
- 基于这三者直接求目标旋转
|
||
3. 也就是 `Ground` 只保留:
|
||
- 当前显示状态作为增量起点
|
||
- 路径方向作为目标方向
|
||
- 宿主平面旋转量作为唯一旋转语义
|
||
|
||
### 5.2 现有链路与目标链路
|
||
|
||
当前代码里,`Ground + 真实物体` 至少有 3 个入口会接触姿态:
|
||
|
||
1. 起点
|
||
- `MoveObjectToPathStart(...)`
|
||
- `TryCreatePlanarPathRotationAtStart(...)`
|
||
- `TryCreateRealObjectPlanarRotationFromHostForward(...)`
|
||
2. 逐帧
|
||
- `ApplyGroundAnimationFrame(...)`
|
||
3. 尺寸/通行空间
|
||
- `TryCalculateCurrentRealObjectPlanarProjectedExtents(...)`
|
||
|
||
这一轮的目标链路应该统一成:
|
||
|
||
1. 初始化
|
||
- 当前显示姿态只用来拿“当前增量起点”
|
||
- 不再把它包装成 `referenceRotation`
|
||
2. 起点/逐帧旋转
|
||
- 只求 `hostForward`
|
||
- 只求宿主平面旋转量
|
||
- 不再进入 `TryCreateRealObjectPlanarPoseSolution(...)`
|
||
- 起点应用层不再走 `currentRotation -> targetRotation -> deltaRotation`
|
||
- 改成直接施加宿主轴旋转增量,再补平移把 tracked point 拉回目标点
|
||
3. 尺寸/通行空间
|
||
- 对 `Ground` 直接复用固定业务约定:
|
||
- `forward = PositiveX`
|
||
- `up = HostUp`
|
||
- 不再通过 `reference-based pose` 推导 `ModelAxisConvention`
|
||
|
||
这 3 条链必须保持同一件事:
|
||
|
||
- `Ground` 不再解释 reference pose
|
||
- `Ground` 只解释“当前显示状态 + 路径方向 + 宿主平面旋转量”
|
||
|
||
---
|
||
|
||
## 6. 验证标准
|
||
|
||
这轮不追求“大而全测试矩阵”,只看 3 条:
|
||
|
||
1. 起点
|
||
- `Ground + 真实物体` 到起点后不再读 fragment 姿态
|
||
|
||
2. 逐帧
|
||
- `Ground` 播放时旋转来源不再依赖 fragment
|
||
- `Ground` 只根据路径方向继续求宿主平面旋转量
|
||
|
||
3. 尺寸/通行空间
|
||
- `Ground` 的 projected extents 不再因为 fragment/reference pose 缺失而失败
|
||
- `Ground` 的 `ModelAxisConvention` 不再来自 `TryCreateRealObjectPlanarPoseSolution(...)`
|
||
|
||
4. fallback
|
||
- `Ground` 关闭 fragment fallback 后,主链要么成功,要么明确报错
|
||
- 不允许再偷偷回退
|
||
|
||
---
|
||
|
||
## 7. 当前停止线
|
||
|
||
如果做到下面这句话,就先停:
|
||
|
||
- **Ground 主链不再依赖 fragment,但 Hoisting / Rail / 通用参考姿态系统暂时不动。**
|
||
|
||
不要在这一轮里再继续追求:
|
||
|
||
- 抽象统一工具类
|
||
- 清理全部 reference/local 命名
|
||
- 一次性删光 fragment 代码
|
||
- 统一三类路径的所有姿态入口
|
||
|
||
这些都属于下一轮的事。
|
||
|
||
---
|
||
|
||
## 8. 2026-04-08 夜间新增:Ground 角度调整的最小实现策略
|
||
|
||
在 `Ground + 真实物体` 这条新纯增量链上,角度调整不再通过“完整目标姿态重建”实现,而只允许走最单纯的宿主增量法:
|
||
|
||
1. `up` 轴修正
|
||
- 不单独构造三维姿态
|
||
- 直接并入路径目标 `yaw`
|
||
- `YUp` 取 `YDegrees`
|
||
- `ZUp` 取 `ZDegrees`
|
||
|
||
2. 非 `up` 轴修正
|
||
- 不与 `yaw` 一次性组合
|
||
- 只在起点落位后,围绕业务跟踪点按宿主轴逐次增量应用
|
||
- 当前约定:
|
||
- `YUp`:应用 `XDegrees`、`ZDegrees`
|
||
- `ZUp`:应用 `XDegrees`、`YDegrees`
|
||
|
||
3. 逐帧播放
|
||
- 继续只吃“路径宿主平面角 + up 轴修正”
|
||
- 不在每帧重复叠加非 `up` 轴修正
|
||
- 非 `up` 轴修正应由起点姿态一次性建立,并在后续 `yaw` 增量中自然保持
|
||
|
||
### 明早优先验证
|
||
|
||
1. `Ground + 真实物体` 到起点
|
||
- 位置是否继续保持正确
|
||
- `X/Y/Z` 角度调整是否真正进入增量旋转链
|
||
|
||
2. `Ground` 逐帧播放
|
||
- 转弯是否仍保持当前已修好的效果
|
||
- `up` 轴修正是否能跟随路径持续生效
|
||
|
||
3. 非 `up` 轴修正
|
||
- 是否表现为“起点一次性按宿主轴旋转”
|
||
- 播放过程中不应每帧累加放大
|