diff --git a/src/Utils/ViewpointHelper.cs b/src/Utils/ViewpointHelper.cs index 8ef0a58..3640c43 100644 --- a/src/Utils/ViewpointHelper.cs +++ b/src/Utils/ViewpointHelper.cs @@ -17,6 +17,11 @@ namespace NavisworksTransport.Utils /// private const int VIEW_UPDATE_DELAY_MS = 100; + /// + /// 包围盒扩展系数(用于 ZoomBox 调整视野范围) + /// + private const double VIEW_BOUNDING_BOX_EXPANSION_FACTOR = 1.4; + /// /// 智能调整视角:调整到路径中心,确保整个路径都在视野内 /// @@ -97,17 +102,30 @@ namespace NavisworksTransport.Utils // 3. 创建当前视角的副本(关键:使用 CreateCopy 而不是 new Viewpoint()) Viewpoint newViewpoint = doc.CurrentViewpoint.Value.CreateCopy(); + + // 设置标准俯视图的相机配置 + // 相机位置:在目标正上方 newViewpoint.Position = cameraPosition; - newViewpoint.PointAt(focusCenter); // 让相机指向聚焦中心 - newViewpoint.WorldUpVector = new UnitVector3D(0, 0, 1); // Z轴向上 - // 4. 使用 ZoomBox 调整视野范围(使用视野包围盒,确保整个路径都在视野内) - newViewpoint.ZoomBox(viewBoundingBox); + // 直接设置 Rotation 为无旋转(单位四元数),实现标准的俯视图 + // 这样可以彻底清除任何旋转,使视图与世界坐标轴对齐 + newViewpoint.Rotation = new Rotation3D(); - // 5. 应用视角到文档 + // 设置向上向量:Y 轴向上(标准俯视图的向上方向) + newViewpoint.WorldUpVector = new UnitVector3D(0, 1, 0); + + // 4. 扩展路径包围盒,避免边缘贴得太近 + double boxWidth = viewBoundingBox.Max.X - viewBoundingBox.Min.X; + double expansionMargin = boxWidth * (VIEW_BOUNDING_BOX_EXPANSION_FACTOR - 1) / 2; + BoundingBox3D expandedViewBoundingBox = BoundingBoxGeometryUtils.ExpandBoundingBox(viewBoundingBox, expansionMargin); + + // 5. 使用 ZoomBox 调整视野范围(使用扩展后的视野包围盒,确保整个路径都在视野内) + newViewpoint.ZoomBox(expandedViewBoundingBox); + + // 6. 应用视角到文档 doc.CurrentViewpoint.CopyFrom(newViewpoint); - LogManager.Info($"视角已调整完成: 俯视图, 基准尺寸={baseDimension:F2}米, 相机距离={cameraDistanceMeters:F2}米, FOV=自动"); + LogManager.Info($"视角已调整完成: 俯视图(已摆正), 基准尺寸={baseDimension:F2}米, 相机距离={cameraDistanceMeters:F2}米, FOV=自动, 包围盒扩展系数={VIEW_BOUNDING_BOX_EXPANSION_FACTOR:F1}, 扩展边距={expansionMargin:F2}米"); } ///