3.4 KiB
3.4 KiB
坐标系检测结果分析
测试模型对比
模型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 会:
- 自动旋转模型:绕 X 轴旋转 270°,将 Y-Up 转为 Z-Up 显示
- 保留原始信息:通过
WorldUpVector记录原始坐标系
这使得:
- 视觉上所有模型都是 Z-Up
- 但
WorldUpVector保持原始坐标系 - 插件需要据此适配内部计算
3. 包围盒分析的局限性
Y-Up 模型经过旋转后:
- 原始 Y 轴(高度)变成了 Z 轴
- 所以包围盒跨度分析会显示 Z 跨度大
- 容易产生误判
正确的检测方法(已实施)
// 方法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 作为主要检测依据:
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 中:
[coordinate_system]
# 可选值: "AutoDetect"(推荐), "ZUp", "YUp"
type = "AutoDetect"
下一步行动
- ✅ 已完成:坐标系探索按钮
- ✅ 已完成:可靠的检测方法(WorldUpVector)
- ⏳ 待实施:更新
CoordinateSystemManager使用新方法 - ⏳ 待实施:实现坐标系抽象层适配
- ⏳ 待实施:修改 GridMap 等核心模块
文档更新时间: 2026-01-30 状态: 检测方法已验证,等待实施适配