refactor: use PathAnimationManager.ApplyQuaternionRotationInPlace

- New method mirrors proven ApplyRotationCorrectionInPlace pattern
- ViewModel only calls existing project APIs, no raw OverridePermanentTransform
This commit is contained in:
tian 2026-06-09 03:39:56 +08:00
parent 3634551e53
commit f75dcb1f50
2 changed files with 28 additions and 14 deletions

View File

@ -461,6 +461,32 @@ namespace NavisworksTransport.Core.Animation
doc.Models.OverridePermanentTransform(modelItems, comp.Combine(), false);
}
/// <summary>
/// 直接用四元数绕物体包围盒中心旋转(增量模式)。
/// 用于贴地面等不需要走 Euler 角度链的场景。
/// </summary>
public void ApplyQuaternionRotationInPlace(Quaternion rotation)
{
var item = CurrentControlledObject;
if (item == null) return;
var modelItems = new ModelItemCollection { item };
var doc = NavisApplication.ActiveDocument;
var center = GetLiveBoundingBoxCenter(item);
var tp = new Vector3((float)center.X, (float)center.Y, (float)center.Z);
var rotatedTp = Vector3.Transform(tp, rotation);
var identity = Transform3D.CreateTranslation(new Vector3D(0, 0, 0));
var comp = identity.Factor();
comp.Rotation = new Rotation3D(rotation.X, rotation.Y, rotation.Z, rotation.W);
comp.Translation = new Vector3D(
center.X - rotatedTp.X,
center.Y - rotatedTp.Y,
center.Z - rotatedTp.Z);
doc.Models.OverridePermanentTransform(modelItems, comp.Combine(), false);
}
/// <summary>
/// 将当前显示姿态同步为跟踪状态yaw=0 对应对齐 X 轴)。
/// 用于自动调整确认前,替代 RestoreObjectToCADPosition 的复位→设置链路。

View File

@ -2316,20 +2316,8 @@ namespace NavisworksTransport.UI.WPF.ViewModels
rotation = Quaternion.CreateFromAxisAngle(axis, angle);
}
// 绕物体中心增量旋转
var modelItem = _pathAnimationManager.AnimatedObject;
var modelItems = new ModelItemCollection { modelItem };
var center = modelItem.BoundingBox().Center;
var toOrigin = Autodesk.Navisworks.Api.Transform3D.CreateTranslation(
new Vector3D(-center.X, -center.Y, -center.Z));
var rotate = new Autodesk.Navisworks.Api.Transform3D(
new Rotation3D(rotation.X, rotation.Y, rotation.Z, rotation.W));
var fromOrigin = Autodesk.Navisworks.Api.Transform3D.CreateTranslation(
new Vector3D(center.X, center.Y, center.Z));
var combined = Autodesk.Navisworks.Api.Transform3D.Multiply(
Autodesk.Navisworks.Api.Transform3D.Multiply(fromOrigin, rotate), toOrigin);
doc.Models.OverridePermanentTransform(modelItems, combined, false);
// 使用项目中已有的四元数旋转方法
_pathAnimationManager.ApplyQuaternionRotationInPlace(rotation);
_pathAnimationManager.SyncTrackedStateToCurrentDisplayPose();
UpdatePassageSpaceVisualization();