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

This commit is contained in:
tian 2026-08-05 23:46:41 +08:00
commit e99de7059a
3 changed files with 48 additions and 30 deletions

View File

@ -1,5 +1,27 @@
# NavisworksTransport 变更日志
## [0.19.0] - 2026-08-05
### ✨ 功能变更
- **去掉真实物体 fragment 参考姿态依赖(默认轴约定替代)**
- 背景fragment 参考姿态提供的是物体在模型里的**原始摆放CAD 朝向)**,不代表物流 forward——哪根局部轴沿路径是**业务语义,由用户定义**(不存在固定朝向)。且 fragment 有系统性隐患:盒内部分几何时代表帧漂移、嵌套实例不稳定、副实例坐标系误判连带。
- 修改:`TryCaptureRealObjectReferenceRotation` 不再解析 fragment改用**默认轴约定**forward=+Xup=宿主 upYUp→+Y / ZUp→+Z。用户通过“调整物体”窗口手工指定最终朝向所见即所得
- 收益:
- **F1 Rail + 42" Diameter此前失败场景现可正常检测**(碰撞 1对象识别成功
- 消除全部 fragment 相关隐患(盒内 fragment 不完整/嵌套实例漂移/AutoDetect 坐标系)
- 集成测试 25/25 通过(真实物体动画 Ground/Hoisting/Rail 正常)
### ⚠️ 语义变化(需注意)
- 真实物体**初始姿态基准**从 fragment物体 CAD 实际朝向)→ **默认约定**forward=+X
- 用户通过“调整物体”手工指定最终朝向,功能不受影响(本来就相对路径/地面)
- **已保存的角度修正数据**ObjectRotationCorrection相对基准变化旧数据需重新调整
### ✅ 已解决0.18.1 已知问题)
- ~~真实物体姿态链依赖 fragment 完整矩阵Rail + 管道/嵌套实例类物体在副实例不可用)~~ → 已随去掉 fragment 依赖解决42" Diameter Rail 路径检测成功)
## [0.18.1] - 2026-08-05
### 🐛 Bug 修复

View File

@ -1,3 +1,3 @@
# 版本号
0.18.1
0.19.0

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;
}
}