From d3535fc5a000c2acb057dfc963d1ef02e3c536a7 Mon Sep 17 00:00:00 2001
From: tian <11429339@qq.com>
Date: Fri, 31 Jul 2026 17:01:03 +0800
Subject: [PATCH] =?UTF-8?q?fix:=20=E8=87=AA=E7=94=B1=E8=B7=AF=E5=BE=84?=
=?UTF-8?q?=E4=BF=9D=E6=8C=81=E7=89=A9=E4=BD=93=E5=8E=9F=E5=A7=8B=E5=A7=BF?=
=?UTF-8?q?=E6=80=81=EF=BC=8C=E8=B5=B7=E7=82=B9=E4=B8=8D=E5=81=9A=E8=87=AA?=
=?UTF-8?q?=E5=8A=A8=E6=97=8B=E8=BD=AC=E8=B0=83=E6=95=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
真实物体(YUp)的自由路径自动对齐路径方向的旋转在宿主/几何姿态
解析上容易出错(对齐了错误前向、侧滚90°)。按用户要求,自由路径
改为保持物体原始姿态:
- MoveObjectToPathStart:自由路径纯平移(ApplyTrackedTranslationOnly),
不应用任何自动旋转
- ShouldPreservePathRotationForFrames:对 Free 始终返回 true,帧锁定
起点姿态,物体沿路径平移而保持朝向
- 移除废弃的 TryCreateFreePathRotationForFrame/AtStart(平面自动旋转)
257 单测全过。
---
src/Core/Animation/PathAnimationManager.cs | 87 +++++-----------------
1 file changed, 17 insertions(+), 70 deletions(-)
diff --git a/src/Core/Animation/PathAnimationManager.cs b/src/Core/Animation/PathAnimationManager.cs
index e1f64ce..b48eeaa 100644
--- a/src/Core/Animation/PathAnimationManager.cs
+++ b/src/Core/Animation/PathAnimationManager.cs
@@ -955,16 +955,13 @@ namespace NavisworksTransport.Core.Animation
_hasGroundRealObjectBasePose = false;
}
}
- else if (_route.PathType == PathType.Free &&
- TryCreateFreePathRotationAtStart(out var freeStartRotation))
- {
- ApplyFullPoseUpdate(startPosition, freeStartRotation);
- LogManager.Debug("[移动到起点] 自由路径已应用完整三维姿态(切线前向 + 世界up正交化)");
- }
else if (_route.PathType == PathType.Free)
{
- LogManager.Error("[移动到起点] 自由路径未能生成完整三维姿态,已禁止退回旧 yaw 链路");
- return false;
+ // 自由路径:保持物体原始姿态,仅平移到起点(不做任何自动旋转调整)
+ ApplyTrackedTranslationOnly(startPosition);
+ SyncTrackedRotationToDisplayedPose(CurrentControlledObject ?? _animatedObject);
+ _hasGroundRealObjectBasePose = false;
+ LogManager.Debug("[移动到起点] 自由路径已保持原始姿态纯平移到起点");
}
else if (_route.PathType == PathType.Ground || _route.PathType == PathType.Hoisting)
{
@@ -1508,12 +1505,6 @@ namespace NavisworksTransport.Core.Animation
frame.Rotation = railRotation;
frame.HasCustomRotation = true;
}
- else if (_route.PathType == PathType.Free &&
- TryCreateFreePathRotationForFrame(previousFramePoint, framePosition, nextFramePoint, out var freeRotation))
- {
- frame.Rotation = freeRotation;
- frame.HasCustomRotation = true;
- }
else if ((_route.PathType == PathType.Ground || _route.PathType == PathType.Hoisting) &&
!_route.IsTwoPointVertical &&
TryCreatePlanarPathRotationForFrame(previousFramePoint, framePosition, nextFramePoint, out var planarRotation))
@@ -4030,7 +4021,18 @@ namespace NavisworksTransport.Core.Animation
ObjectStartPlacementMode placementMode,
bool hasPreservedRotation)
{
- if (!hasPreservedRotation || placementMode != ObjectStartPlacementMode.PreserveInitialPose)
+ if (!hasPreservedRotation)
+ {
+ return false;
+ }
+
+ // 自由路径:保持物体原始姿态,不自动对齐路径方向(用户通过"调整物体"控制朝向)
+ if (pathType == PathType.Free)
+ {
+ return true;
+ }
+
+ if (placementMode != ObjectStartPlacementMode.PreserveInitialPose)
{
return false;
}
@@ -4937,61 +4939,6 @@ namespace NavisworksTransport.Core.Animation
return true;
}
- ///
- /// 自由路径姿态(平面):像地面路径一样,物体转向前进方向的水平投影,
- /// 但只绕垂直轴(up 轴)旋转(yaw),不绕前进轴滚动。
- /// 复用 CanonicalPlanarPoseBuilder(forward=路径水平投影,up=世界up)。
- ///
- private bool TryCreateFreePathRotationForFrame(Point3D previousPoint, Point3D currentPoint, Point3D nextPoint, out Rotation3D rotation)
- {
- rotation = Rotation3D.Identity;
-
- var adapter = CoordinateSystemManager.Instance.CreateHostAdapter();
- var convention = GetCurrentModelAxisConvention();
-
- Vector3 canonicalPrevious = ToNumerics(adapter.ToCanonicalPoint(previousPoint));
- Vector3 canonicalCurrent = ToNumerics(adapter.ToCanonicalPoint(currentPoint));
- Vector3 canonicalNext = ToNumerics(adapter.ToCanonicalPoint(nextPoint));
-
- Vector3 canonicalForward = canonicalNext - canonicalPrevious;
- if (canonicalForward.LengthSquared() < 1e-6f)
- {
- canonicalForward = canonicalNext - canonicalCurrent;
- }
-
- if (!CanonicalPlanarPoseBuilder.TryCreateQuaternionFromForward(
- canonicalForward,
- HostCoordinateAdapter.CanonicalUpVector3,
- convention,
- _objectRotationCorrection,
- out var canonicalRotation))
- {
- return false;
- }
-
- rotation = adapter.FromCanonicalRotation(canonicalRotation);
- return true;
- }
-
- ///
- /// 自由路径起点姿态:以首段方向水平投影为前向,只绕垂直轴旋转(yaw)。
- ///
- private bool TryCreateFreePathRotationAtStart(out Rotation3D rotation)
- {
- rotation = Rotation3D.Identity;
-
- if (_pathPoints == null || _pathPoints.Count < 2)
- {
- return false;
- }
-
- return TryCreateFreePathRotationForFrame(
- _pathPoints[0],
- _pathPoints[0],
- _pathPoints[1],
- out rotation);
- }
-
private bool TryCreateRailPathRotation(
Point3D previousPoint,
Point3D currentPoint,