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:
parent
10be0a5e4f
commit
7551647538
@ -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=+X,up=宿主 up(YUp→+Y,ZUp→+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;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user