优化视角聚焦功能,调整聚焦角度为60度,更新相关文档说明
This commit is contained in:
parent
1ffe567466
commit
cf5aed422b
@ -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
|
||||
/// 聚焦到碰撞点(两个对象的中间位置)
|
||||
/// </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();
|
||||
|
||||
@ -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}");
|
||||
|
||||
@ -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}");
|
||||
}
|
||||
|
||||
@ -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}");
|
||||
|
||||
@ -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,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user