NavisworksTransport/doc/working/coordinate-system-detection-results.md

3.4 KiB
Raw Blame History

坐标系检测结果分析

测试模型对比

模型1标准 Z-Up 模型 (Floor2_mobile.nwd)

指标
WorldUpVector (0, 0, 1)
Transform.Rotation 0° (无旋转)
包围盒 Min Z=-33.51
包围盒 Max Z=88.00
判定 Z-Up 坐标系

模型2Y-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 跨度大
  • 容易产生误判

正确的检测方法(已实施)

// 方法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"

下一步行动

  1. 已完成:坐标系探索按钮
  2. 已完成可靠的检测方法WorldUpVector
  3. 待实施:更新 CoordinateSystemManager 使用新方法
  4. 待实施:实现坐标系抽象层适配
  5. 待实施:修改 GridMap 等核心模块

文档更新时间: 2026-01-30 状态: 检测方法已验证,等待实施适配