# 坐标系检测结果分析 ## 测试模型对比 ### 模型1:标准 Z-Up 模型 (Floor2_mobile.nwd) | 指标 | 值 | |------|-----| | WorldUpVector | (0, 0, 1) | | Transform.Rotation | 0° (无旋转) | | 包围盒 Min | Z=-33.51 | | 包围盒 Max | Z=88.00 | | **判定** | ✅ **Z-Up 坐标系** | ### 模型2:Y-Up 模型 (Floor2_mobile_yup.nwf) | 指标 | 值 | |------|-----| | WorldUpVector | **(0, 1, 0)** | | Transform.Rotation | **270° 绕 X 轴** | | 包围盒 Min | Y=-33.51 | | 包围盒 Max | Y=100.56 | | **判定** | ✅ **Y-Up 坐标系** | --- ## 关键发现 ### 1. WorldUpVector 是最可靠的判断依据 ``` Z-Up 模型: WorldUpVector = (0.0000, 0.0000, 1.0000) Y-Up 模型: WorldUpVector = (0.0000, 1.0000, 0.0000) ``` **结论**:`Viewpoint.WorldUpVector` 直接反映了模型的原始坐标系,无需分析包围盒。 ### 2. Navisworks 的自动转换机制 当导入 Y-Up 模型时,Navisworks 会: 1. **自动旋转模型**:绕 X 轴旋转 270°,将 Y-Up 转为 Z-Up 显示 2. **保留原始信息**:通过 `WorldUpVector` 记录原始坐标系 这使得: - 视觉上所有模型都是 Z-Up - 但 `WorldUpVector` 保持原始坐标系 - 插件需要据此适配内部计算 ### 3. 包围盒分析的局限性 Y-Up 模型经过旋转后: - 原始 Y 轴(高度)变成了 Z 轴 - 所以包围盒跨度分析会显示 Z 跨度大 - 容易产生误判 --- ## 正确的检测方法(已实施) ```csharp // 方法1:使用 WorldUpVector(推荐) var worldUp = doc.CurrentViewpoint.Value.WorldUpVector; if (Math.Abs(worldUp.Z) > 0.9) return CoordinateSystemType.ZUp; // (0, 0, 1) else if (Math.Abs(worldUp.Y) > 0.9) return CoordinateSystemType.YUp; // (0, 1, 0) else if (Math.Abs(worldUp.X) > 0.9) return CoordinateSystemType.XUp; // (1, 0, 0) 罕见 // 方法2:辅助检查 Transform 旋转 var rotation = model.RootItem.Transform.Factor().Rotation.ToAxisAndAngle(); if (Math.Abs(rotation.Axis.X) > 0.9 && (Math.Abs(rotation.Angle - Math.PI/2) < 0.1 || Math.Abs(rotation.Angle - 3*Math.PI/2) < 0.1)) { // 90° 或 270° 绕 X 轴旋转 → Y-Up 模型 } ``` --- ## 实施建议 ### 1. 更新 CoordinateSystemManager 使用 `WorldUpVector` 作为主要检测依据: ```csharp private ICoordinateSystem AutoDetectCoordinateSystem() { var doc = Application.ActiveDocument; var worldUp = doc.CurrentViewpoint.Value.WorldUpVector; if (Math.Abs(worldUp.Y) > 0.9) { LogManager.Info("[坐标系检测] WorldUpVector 表明 Y-Up 坐标系"); return new YUpCoordinateSystem(); } // 默认为 Z-Up return new ZUpCoordinateSystem(); } ``` ### 2. 用户确认机制 检测后提示用户确认: ``` 检测到模型使用 Y-Up 坐标系(来自 Revit 等软件) 是否启用坐标系适配? [是] [否] [保持默认] ``` ### 3. 配置文件预设置 在 `default_config.toml` 中: ```toml [coordinate_system] # 可选值: "AutoDetect"(推荐), "ZUp", "YUp" type = "AutoDetect" ``` --- ## 下一步行动 1. ✅ **已完成**:坐标系探索按钮 2. ✅ **已完成**:可靠的检测方法(WorldUpVector) 3. ⏳ **待实施**:更新 `CoordinateSystemManager` 使用新方法 4. ⏳ **待实施**:实现坐标系抽象层适配 5. ⏳ **待实施**:修改 GridMap 等核心模块 --- *文档更新时间: 2026-01-30* *状态: 检测方法已验证,等待实施适配*