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