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,