# 双轨安装头空轨路径扩展设计 ## 背景 当前项目中的 `PathType.Rail` 语义实际等同于“轨下悬挂运输”: - 基准路径来自空轨下表面中心线 - 动画默认将物体沿世界 `Z` 方向向下偏移一个物体高度 - 通行空间也默认按“路径点在物体上方”渲染 这套模型无法准确表达新的双轨安装头场景: - 轨道为两根平行轨道 - 安装头在两轨中间滑动 - 箱型构件与安装头刚性连接 - 构件以顶面中心或底面中心与安装头对接 - 安装头支持轨上、轨下两种安装方式 - 轨道支持斜向上、斜向下 ## 目标 将现有“空轨路径”升级为“轨道导向装配运输路径”,支持以下 4 种基本构型: 1. 轨上 + 斜向上 2. 轨上 + 斜向下 3. 轨下 + 斜向上 4. 轨下 + 斜向下 并支持两种构件对接方式: 1. 顶面中心对接安装头 2. 底面中心对接安装头 ## 设计原则 1. 不再以“轨下中心线”作为 Rail 路径的唯一几何语义。 2. 路径数据应表达“安装头中心的参考路径”。 3. 构件实际动画位置和碰撞包络,应从“参考路径 + 安装构型”推导。 4. 对斜轨路径,偏移和姿态必须基于轨道局部坐标系,而不是简单沿世界 `Z` 轴处理。 5. 保持旧 Rail 路径可加载,并为旧数据提供默认兼容语义。 ## 新数据模型 ### RailMountMode ```csharp public enum RailMountMode { UnderRail = 0, OverRail = 1 } ``` 含义:安装头位于双轨参考平面的下方或上方。 ### RailPayloadAnchorMode ```csharp public enum RailPayloadAnchorMode { TopCenter = 0, BottomCenter = 1 } ``` 含义:构件以顶面中心或底面中心与安装头刚性对接。 ### RailPathDefinitionMode ```csharp public enum RailPathDefinitionMode { LegacyBottomCenterLine = 0, InstallationHeadCenterLine = 1 } ``` 含义: - `LegacyBottomCenterLine` 用于兼容旧空轨路径 - `InstallationHeadCenterLine` 表示新的安装头中心参考路径 ### PathRoute 新增字段 建议为 `PathRoute` 增加以下字段: ```csharp public RailMountMode RailMountMode { get; set; } public RailPayloadAnchorMode RailPayloadAnchorMode { get; set; } public RailPathDefinitionMode RailPathDefinitionMode { get; set; } public double RailHeadToPayloadAnchorOffset { get; set; } public double RailGaugeCenterOffset { get; set; } ``` 说明: - `RailHeadToPayloadAnchorOffset` - 安装头中心到构件对接中心的距离 - 使用模型单位 - 用于精确表达安装头结构厚度和连接件高度 - `RailGaugeCenterOffset` - 双轨中心线到安装头中心线的附加偏移 - 默认通常为 `0` - 为后续非对称安装场景留扩展位 ## 局部坐标系 每一段 Rail 路径在采样时建立局部坐标系: - `T`:沿轨道方向的单位向量 - `N`:轨道平面法向,用于区分轨上 / 轨下 - `B`:横向向量,满足右手系 建议约束: - 双轨所在平面由轨道主方向和全局竖直方向共同确定 - 当轨道接近竖直时,仍应优先走显式异常,而不是隐式回退 构件实际锚点位置: ```text PayloadAnchorPosition = RailReferencePoint + sign(mountMode) * N * offset ``` 其中: - `sign(UnderRail) = -1` - `sign(OverRail) = +1` 构件几何中心再根据 `TopCenter` / `BottomCenter` 与物体高度换算得到。 ## 参考路径定义 ### 旧逻辑 当前 `RailGeometryHelper` 输出的是: - 空轨下表面中心线 ### 新逻辑 建议升级为输出: - 双轨中间的安装头参考中心线 实现上分两层: 1. `ExtractRailReferencePath` - 负责提取轨道导向参考线 2. `ResolvePayloadPath` - 根据安装构型计算构件实际运动参考路径 ## 兼容策略 ### 历史路径 旧路径未包含 `RailMountMode`、`RailPayloadAnchorMode` 等信息时,按以下默认值兼容: ```text RailMountMode = UnderRail RailPayloadAnchorMode = TopCenter RailPathDefinitionMode = LegacyBottomCenterLine RailHeadToPayloadAnchorOffset = 0 RailGaugeCenterOffset = 0 ``` 兼容语义: - 保持旧项目行为尽量不变 - 旧路径仍按“轨下悬挂”解释 ### 新路径 新创建的 Rail 路径统一采用: ```text RailPathDefinitionMode = InstallationHeadCenterLine ``` ## 需要修改的模块 ### 1. 模型层 文件: - `src/Core/PathPlanningModels.cs` - `src/Commands/CreateAerialPathCommand.cs` 工作: - 增加 Rail 相关枚举 - 为 `PathRoute` 增加 Rail 构型字段 - 新建 Rail 路径时写入默认配置 ### 2. Rail 几何提取 文件: - `src/PathPlanning/RailGeometryHelper.cs` 工作: - 将“下表面中心线”抽象为“参考路径提取” - 区分旧路径提取和新路径提取 - 为双轨场景预留“轨道中心参考线”提取接口 ### 3. 交互吸附 文件: - `src/Core/PathPlanningManager.cs` - `src/UI/WPF/ViewModels/PathEditingViewModel.cs` 工作: - 用户点击继续吸附到 Rail 参考路径 - 新建 Rail 路径时允许指定安装构型 ### 4. 渲染 文件: - `src/Core/PathPointRenderPlugin.cs` 工作: - 将 `PathType.Rail` 的固定“向上/向下 Z 偏移”改为局部法向偏移 - 通行空间不再假定路径点永远位于物体顶部 ### 5. 动画 文件: - `src/Core/Animation/PathAnimationManager.cs` 工作: - 将 Rail 路径下的构件位置计算改为: - 先得到安装头参考点 - 再根据 `RailMountMode` 和 `RailPayloadAnchorMode` 推导物体位置 - 后续增加 pitch/roll 对齐能力 ### 6. 导出 文件: - `src/Core/PathDataManager.cs` 工作: - 将 `suspension` 语义调整为更中性的 rail-guided aerial path - 视下游格式能力决定是否补充导出字段 ## 分阶段实现建议 ### Phase 1:最小可用版本 目标:先支持 4 种构型的碰撞检测和动画位置正确。 范围: - 增加 Rail 构型字段 - Rail 动画和通行空间偏移改为基于安装构型计算 - 继续沿用现有参考线提取,但将其抽象为“参考路径” 限制: - 暂不处理完整 pitch/roll 姿态 - 暂不精确重建双轨实体几何关系 ### Phase 2:几何语义升级 目标:把参考路径从“轨下中心线”升级为“安装头中心线”。 范围: - 重构 `RailGeometryHelper` - 为双轨模型提取真正的中线 - 新旧路径分别兼容 ### Phase 3:姿态精化 目标:对斜轨和长臂构件提供更真实的空间姿态。 范围: - 动画支持 pitch / roll - 构件包络与局部坐标系一致 - 提升碰撞检测准确性 ## 当前建议 本次开发先从 Phase 1 开始: 1. 先把路径模型改为可表达 4 种构型 2. 先把渲染和动画从“世界 Z 偏移”改成“构型驱动偏移” 3. 再进入轨道参考线提取的升级 这样风险更低,也更容易验证。