# 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` 轴修正
   - 是否表现为“起点一次性按宿主轴旋转”
   - 播放过程中不应每帧累加放大
