From cf5aed422bf530a29603b0f99e068cd04dc404e0 Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Tue, 10 Feb 2026 16:44:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=A7=86=E8=A7=92=E8=81=9A?= =?UTF-8?q?=E7=84=A6=E5=8A=9F=E8=83=BD=EF=BC=8C=E8=B0=83=E6=95=B4=E8=81=9A?= =?UTF-8?q?=E7=84=A6=E8=A7=92=E5=BA=A6=E4=B8=BA60=E5=BA=A6=EF=BC=8C?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=9B=B8=E5=85=B3=E6=96=87=E6=A1=A3=E8=AF=B4?= =?UTF-8?q?=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/design/2026/NavisworksAPI使用方法.md | 12 +++++++----- src/UI/WPF/ViewModels/AnimationControlViewModel.cs | 6 +++--- src/UI/WPF/ViewModels/CollisionReportViewModel.cs | 2 +- src/UI/WPF/ViewModels/ModelSettingsViewModel.cs | 2 +- src/Utils/ViewpointHelper.cs | 10 +++++----- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/doc/design/2026/NavisworksAPI使用方法.md b/doc/design/2026/NavisworksAPI使用方法.md index eaa5e7f..8433cf5 100644 --- a/doc/design/2026/NavisworksAPI使用方法.md +++ b/doc/design/2026/NavisworksAPI使用方法.md @@ -3706,22 +3706,24 @@ public static void SaveAndRestoreViewpointExample() ```csharp // ✅ 正确:计算相机距离实现目标占比 +// 推荐参数:viewAngleDegrees = 60.0(视场角), targetViewRatio = 0.25(1/4占屏) public void FocusOnModelItem(ModelItem item, double viewAngleDegrees, double targetViewRatio) { Document doc = Application.ActiveDocument; - // 1. 获取对象包围盒 + // 1. 获取对象包围盒(模型单位) var boundingBox = item.BoundingBox(); Point3D targetCenter = boundingBox.Center; double targetSize = Math.Max(boundingBox.Size.X, boundingBox.Size.Y); - // 2. 计算相机距离(使用FOV公式) + // 2. 计算相机距离(标准透视投影公式) + // distance = (targetSize / 2) / tan(FOV / 2) / targetViewRatio double fovRadians = viewAngleDegrees * Math.PI / 180.0; double cameraDistance = (targetSize / 2.0) / Math.Tan(fovRadians / 2.0) / targetViewRatio; - // 3. 计算相机位置(使用模型标准视角向量) - Vector3D viewDirection = doc.FrontRightTopViewVector; // 标准45度视角 + // 3. 计算相机位置(使用模型标准45度斜上视角向量) + Vector3D viewDirection = doc.FrontRightTopViewVector; Vector3D upVector = doc.FrontRightTopViewUpVector; Point3D cameraPosition = new Point3D( @@ -3969,7 +3971,7 @@ public static class ViewpointHelper /// 聚焦到碰撞点(两个对象的中间位置) /// public static void FocusOnCollision(ModelItem item1, ModelItem item2, - double viewAngleDegrees = 45.0) + double viewAngleDegrees, double targetViewRatio) { var bounds1 = item1.BoundingBox(); var bounds2 = item2.BoundingBox(); diff --git a/src/UI/WPF/ViewModels/AnimationControlViewModel.cs b/src/UI/WPF/ViewModels/AnimationControlViewModel.cs index 9246787..31f46bf 100644 --- a/src/UI/WPF/ViewModels/AnimationControlViewModel.cs +++ b/src/UI/WPF/ViewModels/AnimationControlViewModel.cs @@ -2226,7 +2226,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels ModelHighlightHelper.HighlightItems(ManualTargetsHighlightCategory, items); // 聚焦到对象(斜上方45度视角) - ViewpointHelper.FocusOnModelItem(target.ModelItem, viewAngleDegrees: 45.0, targetViewRatio: 0.25); + ViewpointHelper.FocusOnModelItem(target.ModelItem, viewAngleDegrees: 60.0, targetViewRatio: 0.25); UpdateMainStatus($"已聚焦到: {target.DisplayName}"); LogManager.Info($"聚焦到手工指定对象: {target.DisplayName}"); @@ -2252,7 +2252,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels ModelHighlightHelper.HighlightItems(ExcludedObjectsHighlightCategory, items); // 聚焦到对象(斜上方45度视角) - ViewpointHelper.FocusOnModelItem(excludedObject.ModelItem, viewAngleDegrees: 45.0, targetViewRatio: 0.25); + ViewpointHelper.FocusOnModelItem(excludedObject.ModelItem, viewAngleDegrees: 60.0, targetViewRatio: 0.25); UpdateMainStatus($"已聚焦到排除对象: {excludedObject.DisplayName}"); LogManager.Info($"聚焦到排除对象: {excludedObject.DisplayName}"); @@ -2278,7 +2278,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels ModelHighlightHelper.HighlightItems(ModelHighlightHelper.ClashDetectiveResultsCategory, items); // 聚焦到对象(斜上方45度视角) - ViewpointHelper.FocusOnModelItem(collisionObject.ModelItem, viewAngleDegrees: 45.0, targetViewRatio: 0.25); + ViewpointHelper.FocusOnModelItem(collisionObject.ModelItem, viewAngleDegrees: 60.0, targetViewRatio: 0.25); UpdateMainStatus($"已聚焦到碰撞构件: {collisionObject.DisplayName}"); LogManager.Info($"聚焦到碰撞构件: {collisionObject.DisplayName}"); diff --git a/src/UI/WPF/ViewModels/CollisionReportViewModel.cs b/src/UI/WPF/ViewModels/CollisionReportViewModel.cs index 5227b48..af50f43 100644 --- a/src/UI/WPF/ViewModels/CollisionReportViewModel.cs +++ b/src/UI/WPF/ViewModels/CollisionReportViewModel.cs @@ -1255,7 +1255,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels ModelHighlightHelper.HighlightItems(ModelHighlightHelper.ClashDetectiveResultsCategory, new[] { hitObject }); // 聚焦到被撞对象 - ViewpointHelper.FocusOnModelItem(hitObject, viewAngleDegrees: 45.0, targetViewRatio: 0.25); + ViewpointHelper.FocusOnModelItem(hitObject, viewAngleDegrees: 60.0, targetViewRatio: 0.25); LogManager.Info($"聚焦到被撞对象: {collisionItem.Title}"); } diff --git a/src/UI/WPF/ViewModels/ModelSettingsViewModel.cs b/src/UI/WPF/ViewModels/ModelSettingsViewModel.cs index dfae780..ca892c2 100644 --- a/src/UI/WPF/ViewModels/ModelSettingsViewModel.cs +++ b/src/UI/WPF/ViewModels/ModelSettingsViewModel.cs @@ -1407,7 +1407,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels try { // 聚焦到模型(斜上方45度视角) - ViewpointHelper.FocusOnModelItem(logisticsModel.NavisworksItem, viewAngleDegrees: 45.0, targetViewRatio: 0.25); + ViewpointHelper.FocusOnModelItem(logisticsModel.NavisworksItem, viewAngleDegrees: 60.0, targetViewRatio: 0.25); UpdateMainStatus($"已聚焦到物流模型: {logisticsModel.Name}"); LogManager.Info($"聚焦到物流模型: {logisticsModel.Name}, 类别: {logisticsModel.Category}"); diff --git a/src/Utils/ViewpointHelper.cs b/src/Utils/ViewpointHelper.cs index df66fdd..3e532b8 100644 --- a/src/Utils/ViewpointHelper.cs +++ b/src/Utils/ViewpointHelper.cs @@ -508,20 +508,20 @@ namespace NavisworksTransport.Utils /// private static Point3D CalculateCameraPosition(Point3D center, double targetSize, double viewAngleDegrees, double targetViewRatio) { - // 计算相机距离(目标占据视图 targetViewRatio) + // 计算相机距离(标准透视投影公式) // 公式:distance = (targetSize / 2) / tan(FOV / 2) / targetViewRatio double fovRadians = viewAngleDegrees * Math.PI / 180.0; double cameraDistance = (targetSize / 2.0) / Math.Tan(fovRadians / 2.0) / targetViewRatio; + // 调试日志:打印计算参数 + LogManager.Debug($"[ViewpointHelper] FOV={viewAngleDegrees:F2}°, targetSize={targetSize:F2}, ratio={targetViewRatio:F2}, " + + $"distance={cameraDistance:F2}, center=({center.X:F2},{center.Y:F2},{center.Z:F2})"); + // 获取模型的标准前右上视角向量 - // 这个向量定义了模型的"正方向",基于模型坐标系 Vector3D viewDirection = Application.ActiveDocument.FrontRightTopViewVector; - - // 归一化方向向量 viewDirection.Normalize(); // 沿标准视角方向偏移相机位置 - // 相机位置 = 目标中心 - 方向向量 * 距离 return new Point3D( center.X - viewDirection.X * cameraDistance, center.Y - viewDirection.Y * cameraDistance,