优化视角聚焦功能,调整聚焦角度为60度,更新相关文档说明

This commit is contained in:
tian 2026-02-10 16:44:16 +08:00
parent 1ffe567466
commit cf5aed422b
5 changed files with 17 additions and 15 deletions

View File

@ -3706,22 +3706,24 @@ public static void SaveAndRestoreViewpointExample()
```csharp
// ✅ 正确:计算相机距离实现目标占比
// 推荐参数viewAngleDegrees = 60.0(视场角), targetViewRatio = 0.251/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
/// 聚焦到碰撞点(两个对象的中间位置)
/// </summary>
public static void FocusOnCollision(ModelItem item1, ModelItem item2,
double viewAngleDegrees = 45.0)
double viewAngleDegrees, double targetViewRatio)
{
var bounds1 = item1.BoundingBox();
var bounds2 = item2.BoundingBox();

View File

@ -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}");

View File

@ -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}");
}

View File

@ -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}");

View File

@ -508,20 +508,20 @@ namespace NavisworksTransport.Utils
/// </summary>
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,