将视角调整到标准俯视图视角

This commit is contained in:
tian 2026-01-27 10:36:26 +08:00
parent a2018576e5
commit e0d598a070

View File

@ -17,6 +17,11 @@ namespace NavisworksTransport.Utils
/// </summary>
private const int VIEW_UPDATE_DELAY_MS = 100;
/// <summary>
/// 包围盒扩展系数(用于 ZoomBox 调整视野范围)
/// </summary>
private const double VIEW_BOUNDING_BOX_EXPANSION_FACTOR = 1.4;
/// <summary>
/// 智能调整视角:调整到路径中心,确保整个路径都在视野内
/// </summary>
@ -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}米");
}
/// <summary>