NavisworksTransport/doc/working/2026-04-08-ground-remove-fragment-dependency-plan.md

7.3 KiB
Raw Blame History

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 缺失而失败
    • GroundModelAxisConvention 不再来自 TryCreateRealObjectPlanarPoseSolution(...)
  4. fallback

    • Ground 关闭 fragment fallback 后,主链要么成功,要么明确报错
    • 不允许再偷偷回退

7. 当前停止线

如果做到下面这句话,就先停:

  • Ground 主链不再依赖 fragment但 Hoisting / Rail / 通用参考姿态系统暂时不动。

不要在这一轮里再继续追求:

  • 抽象统一工具类
  • 清理全部 reference/local 命名
  • 一次性删光 fragment 代码
  • 统一三类路径的所有姿态入口

这些都属于下一轮的事。


8. 2026-04-08 夜间新增Ground 角度调整的最小实现策略

Ground + 真实物体 这条新纯增量链上,角度调整不再通过“完整目标姿态重建”实现,而只允许走最单纯的宿主增量法:

  1. up 轴修正

    • 不单独构造三维姿态
    • 直接并入路径目标 yaw
    • YUpYDegrees
    • ZUpZDegrees
  2. up 轴修正

    • 不与 yaw 一次性组合
    • 只在起点落位后,围绕业务跟踪点按宿主轴逐次增量应用
    • 当前约定:
      • YUp:应用 XDegreesZDegrees
      • ZUp:应用 XDegreesYDegrees
  3. 逐帧播放

    • 继续只吃“路径宿主平面角 + up 轴修正”
    • 不在每帧重复叠加非 up 轴修正
    • up 轴修正应由起点姿态一次性建立,并在后续 yaw 增量中自然保持

明早优先验证

  1. Ground + 真实物体 到起点

    • 位置是否继续保持正确
    • X/Y/Z 角度调整是否真正进入增量旋转链
  2. Ground 逐帧播放

    • 转弯是否仍保持当前已修好的效果
    • up 轴修正是否能跟随路径持续生效
  3. up 轴修正

    • 是否表现为“起点一次性按宿主轴旋转”
    • 播放过程中不应每帧累加放大