feat: 去掉真实物体 fragment 参考姿态依赖(默认轴约定替代)

背景:fragment 参考姿态提供的是物体在模型里的原始摆放(CAD 朝向),
不代表物流 forward(哪根局部轴沿路径由用户定义)。且 fragment 有隐患:
盒内部分几何时代表帧漂移(42" 4/64 → 103°)、嵌套实例不稳定。

修改:TryCaptureRealObjectReferenceRotation 不再解析 fragment,
改用默认轴约定(forward=+X,up=宿主 up)。用户通过'调整物体'手工指定最终朝向。

收益:
- 消除全部 fragment 相关隐患(盒内不完整/嵌套实例漂移/AutoDetect 坐标系)
- F1 Rail + 42"(此前'无法解析真实物体'失败)现可正常检测
- 集成测试 25/25 通过(真实物体动画 Ground/Hoisting/Rail 正常)

影响:真实物体初始姿态基准从 fragment 改为默认约定,
已保存的角度修正(ObjectRotationCorrection)需重新调整。
This commit is contained in:
tian 2026-08-05 23:40:43 +08:00
parent 10be0a5e4f
commit 7551647538

View File

@ -5391,43 +5391,39 @@ namespace NavisworksTransport.Core.Animation
try
{
var doc = NavisApplication.ActiveDocument;
if (!RealObjectReferencePoseResolver.TryResolveFromModelItem(sourceObject, doc, out var referencePose))
{
LogManager.Warning($"[真实物体参考姿态] {sourceObject.DisplayName} fragment 姿态解析失败");
return false;
}
// 不再依赖 fragment 参考姿态(物体在模型里的原始摆放不代表物流 forward
// fragment 在盒内部分几何时代表帧漂移)。
// 使用默认轴约定forward=+Xup=宿主 upYUp→+YZUp→+Z
// 用户通过“调整物体”窗口手工指定最终朝向(所见即所得),无需 fragment。
var adapter = CoordinateSystemManager.Instance.CreateHostAdapter();
referenceRotation = referencePose.Rotation;
_realObjectReferenceRotation = referenceRotation;
_realObjectReferenceAxisX = referencePose.RawAxisX;
_realObjectReferenceAxisY = referencePose.RawAxisY;
_realObjectReferenceAxisZ = referencePose.RawAxisZ;
_realObjectReferenceHostWorldXAxisLocalAxis = referencePose.HostWorldXAxisLocalAxis;
_realObjectReferenceHostWorldYAxisLocalAxis = referencePose.HostWorldYAxisLocalAxis;
_realObjectReferenceHostWorldZAxisLocalAxis = referencePose.HostWorldZAxisLocalAxis;
_realObjectReferenceHostSemanticXAxisLocalAxis = referencePose.HostSemanticXAxisLocalAxis;
_realObjectReferenceHostSemanticYAxisLocalAxis = referencePose.HostSemanticYAxisLocalAxis;
_realObjectReferenceHostSemanticZAxisLocalAxis = referencePose.HostSemanticZAxisLocalAxis;
_realObjectReferenceHostUpLocalAxis = referencePose.HostUpLocalAxis;
referenceRotation = Quaternion.Identity;
_realObjectReferenceRotation = Quaternion.Identity;
_realObjectReferenceAxisX = Vector3.UnitX;
_realObjectReferenceAxisY = Vector3.UnitY;
_realObjectReferenceAxisZ = Vector3.UnitZ;
LocalAxisDirection hostUpLocal = adapter.HostType == CoordinateSystemType.YUp
? LocalAxisDirection.PositiveY
: LocalAxisDirection.PositiveZ;
_realObjectReferenceHostUpLocalAxis = hostUpLocal;
_realObjectReferenceHostWorldXAxisLocalAxis = LocalAxisDirection.PositiveX;
_realObjectReferenceHostWorldYAxisLocalAxis = LocalAxisDirection.PositiveY;
_realObjectReferenceHostWorldZAxisLocalAxis = LocalAxisDirection.PositiveZ;
_realObjectReferenceHostSemanticXAxisLocalAxis = LocalAxisDirection.PositiveX;
_realObjectReferenceHostSemanticYAxisLocalAxis = hostUpLocal;
_realObjectReferenceHostSemanticZAxisLocalAxis = LocalAxisDirection.PositiveZ;
_hasRealObjectReferenceRotation = true;
LogManager.Info(
$"[真实物体参考姿态] {sourceObject.DisplayName} 使用 fragment 代表姿态: " +
$"RawX=({_realObjectReferenceAxisX.X:F4},{_realObjectReferenceAxisX.Y:F4},{_realObjectReferenceAxisX.Z:F4}), " +
$"RawY=({_realObjectReferenceAxisY.X:F4},{_realObjectReferenceAxisY.Y:F4},{_realObjectReferenceAxisY.Z:F4}), " +
$"RawZ=({_realObjectReferenceAxisZ.X:F4},{_realObjectReferenceAxisZ.Y:F4},{_realObjectReferenceAxisZ.Z:F4}), " +
$"宿主世界X对应本地轴={referencePose.HostWorldXAxisLocalAxis}, 宿主世界Y对应本地轴={referencePose.HostWorldYAxisLocalAxis}, 宿主世界Z对应本地轴={referencePose.HostWorldZAxisLocalAxis}, " +
$"宿主语义X=({referencePose.AxisX.X:F4},{referencePose.AxisX.Y:F4},{referencePose.AxisX.Z:F4}), " +
$"宿主语义Y=({referencePose.AxisY.X:F4},{referencePose.AxisY.Y:F4},{referencePose.AxisY.Z:F4}), " +
$"宿主语义Z=({referencePose.AxisZ.X:F4},{referencePose.AxisZ.Y:F4},{referencePose.AxisZ.Z:F4}), " +
$"宿主语义X对应本地轴={referencePose.HostSemanticXAxisLocalAxis}, 宿主语义Y对应本地轴={referencePose.HostSemanticYAxisLocalAxis}, 宿主语义Z对应本地轴={referencePose.HostSemanticZAxisLocalAxis}, " +
$"宿主Up对应本地轴={referencePose.HostUpLocalAxis}, fragment数量={referencePose.FragmentCount}, Fragment默认Up={referencePose.FragmentDefaultUpAxis}, 模型Up={referencePose.HostUpAxis}");
$"[真实物体参考姿态] {sourceObject.DisplayName} 使用默认轴约定(不再依赖 fragment: " +
$"forward=+X, up={hostUpLocal}");
return true;
}
catch (Exception ex)
{
LogManager.Warning($"[真实物体参考姿态] 从 fragment 提取代表姿态失败: {ex.Message}");
LogManager.Warning($"[真实物体参考姿态] 应用默认轴约定失败: {ex.Message}");
return false;
}
}