# Navisworks 变换 API 官方原始定义整理 更新时间:2026-04-06 本文只整理当前讨论中直接用到的 Navisworks .NET API 官方原始定义与语法。 原则: - 正文尽量保留官方原始内容 - 不混入项目内部“局部坐标系”“参考姿态”等二次解释 - 如果官方示例目录中未找到对应 API 的直接示例,就如实记录“未找到直接示例” - 只在最后增加一段简短归纳 --- ## 1. `DocumentModels.OverridePermanentTransform(...)` 官方文档: - [M_Autodesk_Navisworks_Api_DocumentParts_DocumentModels_OverridePermanentTransform_3_131351c5.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/M_Autodesk_Navisworks_Api_DocumentParts_DocumentModels_OverridePermanentTransform_3_131351c5.htm) 官方标题: ```text DocumentModels.OverridePermanentTransform Method ``` 官方定义: ```text Apply an incremental transform to a selection. ``` 官方 C# 语法: ```csharp public void OverridePermanentTransform( IEnumerable items, Transform3D transform, bool updateModelTransform ) ``` 官方 Remarks: ```text If the selection contains any files, and the updateModelTransform parameter is true, then instead of applying a transform to the fragments, the File Units and Transform will be updated. ``` 官方示例情况: ```text 在官方 NET examples 目录中,未找到该方法的直接示例代码。 ``` --- ## 2. `DocumentModels.ResetPermanentTransform(...)` 官方文档: - [M_Autodesk_Navisworks_Api_DocumentParts_DocumentModels_ResetPermanentTransform_1_75193b86.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/M_Autodesk_Navisworks_Api_DocumentParts_DocumentModels_ResetPermanentTransform_1_75193b86.htm) 官方标题: ```text DocumentModels.ResetPermanentTransform Method ``` 官方定义: ```text Reset incremental transforms for all model items contained in the selection. ``` 官方 C# 语法: ```csharp public void ResetPermanentTransform( IEnumerable items ) ``` 官方示例情况: ```text 在官方 NET examples 目录中,未找到该方法的直接示例代码。 ``` --- ## 3. `ModelGeometry.ActiveTransform` 官方文档: - [P_Autodesk_Navisworks_Api_ModelGeometry_ActiveTransform.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/P_Autodesk_Navisworks_Api_ModelGeometry_ActiveTransform.htm) 官方标题: ```text ModelGeometry.ActiveTransform Property ``` 官方定义: ```text Returns the currently active transform of the geometry. ``` 官方 C# 语法: ```csharp public Transform3D ActiveTransform { get; } ``` 官方示例情况: ```text 在官方 NET examples 目录中,未找到该属性的直接示例代码。 ``` --- ## 4. `Transform3D` 官方文档: - [T_Autodesk_Navisworks_Api_Transform3D.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/T_Autodesk_Navisworks_Api_Transform3D.htm) 官方标题: ```text Transform3D Class ``` 官方定义: ```text A generic transformation in 3D space. ``` 官方 Remarks: ```text Considered an immutable value type. ``` 官方 C# 类型语法: ```csharp public class Transform3D : NativeHandle ``` 官方成员页中可见的相关构造/工厂: - `Transform3D(Rotation3D)` - `Transform3D(Matrix3, Vector3D)` - `Transform3D(Rotation3D, Vector3D)` - `CreateIdentity()` - `CreateTranslation(Vector3D)` 来源: - [AllMembers_T_Autodesk_Navisworks_Api_Transform3D.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/AllMembers_T_Autodesk_Navisworks_Api_Transform3D.htm) 官方示例情况: ```text 在官方 NET examples 目录中,未找到该类型的直接示例代码。 ``` --- ## 5. `Transform3D(Rotation3D)` 官方文档: - [C_Autodesk_Navisworks_Api_Transform3D_ctor_1_73bf3bc1.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/C_Autodesk_Navisworks_Api_Transform3D_ctor_1_73bf3bc1.htm) 官方定义: ```text Make a transform from a rotation (3D homogenous). ``` 官方 C# 语法: ```csharp public Transform3D( Rotation3D rotation ) ``` --- ## 6. `Transform3D(Rotation3D, Vector3D)` 官方文档: - [C_Autodesk_Navisworks_Api_Transform3D_ctor_2_499970f8.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/C_Autodesk_Navisworks_Api_Transform3D_ctor_2_499970f8.htm) 官方定义: ```text Make a transform from a rotation and a translation. ``` 官方 C# 语法: ```csharp public Transform3D( Rotation3D rotation, Vector3D translation ) ``` --- ## 7. `Transform3D.CreateIdentity()` 官方文档: - [M_Autodesk_Navisworks_Api_Transform3D_CreateIdentity.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/M_Autodesk_Navisworks_Api_Transform3D_CreateIdentity.htm) 官方定义: ```text Create an identity transform. ``` 官方 C# 语法: ```csharp public static Transform3D CreateIdentity() ``` --- ## 8. `Transform3D.CreateTranslation(Vector3D)` 官方文档: - [M_Autodesk_Navisworks_Api_Transform3D_CreateTranslation_1_aa2b59dc.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/M_Autodesk_Navisworks_Api_Transform3D_CreateTranslation_1_aa2b59dc.htm) 官方定义: ```text Set matrix to be 3D homogenous translation matrix. ``` 官方 C# 语法: ```csharp public static Transform3D CreateTranslation( Vector3D translation ) ``` --- ## 9. `Rotation3D(UnitVector3D, Double)` 官方文档: - [C_Autodesk_Navisworks_Api_Rotation3D_ctor_2_a6cb51d1.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/C_Autodesk_Navisworks_Api_Rotation3D_ctor_2_a6cb51d1.htm) 官方定义: ```text Create a rotation as a rotation about an axis by an angle. ``` 官方 C# 语法: ```csharp public Rotation3D( UnitVector3D axis, double angle ) ``` 官方示例情况: ```text 在官方 NET examples 目录中,未找到该构造函数的直接示例代码。 ``` --- ## 10. `Transform3D.Inverse()` 官方文档: - [M_Autodesk_Navisworks_Api_Transform3D_Inverse.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/M_Autodesk_Navisworks_Api_Transform3D_Inverse.htm) 官方定义: ```text Return inverse transformation. ``` 官方 C# 语法: ```csharp public Transform3D Inverse() ``` --- ## 11. `Transform3D.Multiply(Transform3D, Transform3D)` 官方文档: - [M_Autodesk_Navisworks_Api_Transform3D_Multiply_2_141222c1.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/M_Autodesk_Navisworks_Api_Transform3D_Multiply_2_141222c1.htm) 官方定义: ```text Multiply two transformations in the order supplied. ``` 官方 C# 语法: ```csharp public static Transform3D Multiply( Transform3D left, Transform3D right ) ``` --- ## 12. 当前已用实验钉死的最小用法 本节不是官方原文,而是基于上面这些官方 API 和本仓库 `ReadTransformTestCommand` 的实验结果整理出的最小结论。 ### 12.1 宿主世界轴直接转 90° 的 API 参数 `90°` 在 API 中应写成弧度: ```csharp Math.PI / 2.0 ``` 宿主世界轴应直接使用世界单位轴: ```csharp var hostX = new UnitVector3D(1, 0, 0); var hostY = new UnitVector3D(0, 1, 0); var hostZ = new UnitVector3D(0, 0, 1); ``` 对应的旋转对象写法: ```csharp var rx90 = new Rotation3D(hostX, Math.PI / 2.0); var ry90 = new Rotation3D(hostY, Math.PI / 2.0); var rz90 = new Rotation3D(hostZ, Math.PI / 2.0); ``` 如果要直接喂给 `OverridePermanentTransform(...)`: ```csharp var transform = new Transform3D(ry90); doc.Models.OverridePermanentTransform(items, transform, false); ``` ### 12.2 从当前姿态到目标姿态的纯旋转增量 当前实验已经验证: ```csharp deltaRotation = currentInverse * target ``` 在 API 上应写成: ```csharp var currentTransform = new Transform3D(currentRotation); var targetTransform = new Transform3D(targetRotation); var deltaTransform = Transform3D.Multiply( currentTransform.Inverse(), targetTransform); ``` 已验证: - `currentInverse * target` 对 - `target * currentInverse` 不对 ### 12.3 纯旋转增量的默认旋转中心 当前实验已验证: - `OverridePermanentTransform(..., rotationOnly, false)` 的纯旋转增量默认绕宿主原点 `(0,0,0)` 生效 因此: - 不能把纯旋转理解成“围绕当前业务跟踪点原地自转” - 对 `Ground + 真实物体`,旋转后必须再单独做位置重对齐 --- ## 9. `Transform3D.Factor(Vector3D worldCenter)` 官方文档: - [M_Autodesk_Navisworks_Api_Transform3D_Factor_1_aa2b59dc.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/M_Autodesk_Navisworks_Api_Transform3D_Factor_1_aa2b59dc.htm) 官方标题: ```text Transform3D.Factor Method (Vector3D) ``` 官方定义: ```text Treat as homogenous 3D matrix and factor into scale orientation, scale, rotation and translation components. ``` 官方 C# 语法: ```csharp public Transform3DComponents Factor( Vector3D worldCenter ) ``` 目前从官方原文可确认: - 该重载显式接收 `worldCenter` - 说明 `Transform3D` 的分解结果与指定的世界中心有关 当前实验用途: - 用它比较“同一个旋转增量”在 - `worldCenter = (0,0,0)` - `worldCenter = 基线BoundingBox.Center` - 两种情况下分解出来的 `Translation` - 以验证 Navisworks 增量旋转是否表现得像“绕宿主原点旋转” --- ## 9. `Transform3DComponents` 官方文档: - [T_Autodesk_Navisworks_Api_Transform3DComponents.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/T_Autodesk_Navisworks_Api_Transform3DComponents.htm) 官方标题: ```text Transform3DComponents Class ``` 官方定义: ```text Affine transform represented as individual components that combine to form complete transform. Immutable. ``` 官方 Remarks: ```text Affine transform represented as individual components that combine to form complete transform. Immutable. M = c' * so' * s * so * r * c * t * p, where so is scale orientation, s is scale, c is center, r is rotation and t is translation. ``` 官方 C# 类型语法: ```csharp public class Transform3DComponents : NativeHandle ``` 官方示例情况: ```text 在官方 NET examples 目录中,未找到该类型的直接示例代码。 ``` --- ## 10. `Transform3DComponents.Translation` 官方文档: - [P_Autodesk_Navisworks_Api_Transform3DComponents_Translation.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/P_Autodesk_Navisworks_Api_Transform3DComponents_Translation.htm) 官方定义: ```text The translation component of the transform. ``` 官方 C# 语法: ```csharp public Vector3D Translation { get; set; } ``` --- ## 11. `Transform3DComponents.Rotation` 官方文档: - [P_Autodesk_Navisworks_Api_Transform3DComponents_Rotation.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/P_Autodesk_Navisworks_Api_Transform3DComponents_Rotation.htm) 官方定义: ```text The rotation component of the transform. ``` 官方 C# 语法: ```csharp public Rotation3D Rotation { get; set; } ``` --- ## 12. `Transform3DComponents.Scale` 官方文档: - [P_Autodesk_Navisworks_Api_Transform3DComponents_Scale.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/P_Autodesk_Navisworks_Api_Transform3DComponents_Scale.htm) 官方定义: ```text The scale component of the transform. ``` 官方 C# 语法: ```csharp public Vector3D Scale { get; set; } ``` --- ## 13. `Transform3DComponents.Combine()` 官方文档: - [M_Autodesk_Navisworks_Api_Transform3DComponents_Combine.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/M_Autodesk_Navisworks_Api_Transform3DComponents_Combine.htm) 官方定义: ```text Combine components together into a composite transform. ``` 官方 C# 语法: ```csharp public Transform3D Combine() ``` --- ## 14. `Transform3D.Multiply(Transform3D, Transform3D)` 官方文档: - [M_Autodesk_Navisworks_Api_Transform3D_Multiply_2_141222c1.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/M_Autodesk_Navisworks_Api_Transform3D_Multiply_2_141222c1.htm) 官方定义: ```text Multiply two transforms in the order that the arguments are given, and return the result. ``` 官方 C# 语法: ```csharp public static Transform3D Multiply( Transform3D leftTransform, Transform3D rightTransform ) ``` --- ## 15. `Transform3D.Factor()` 官方文档: - [M_Autodesk_Navisworks_Api_Transform3D_Factor.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/M_Autodesk_Navisworks_Api_Transform3D_Factor.htm) 官方定义: ```text Treat as homogenous 3D matrix and factor into scale orientation, scale, rotation and translation components. ``` 官方 C# 语法: ```csharp public Transform3DComponents Factor() ``` --- ## 16. `Transform3D.Inverse()` 官方文档: - [M_Autodesk_Navisworks_Api_Transform3D_Inverse.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/M_Autodesk_Navisworks_Api_Transform3D_Inverse.htm) 官方定义: ```text Return inverse of matrix. Matrix must be non-singular (non-zero determinant). ``` 官方 C# 语法: ```csharp public Transform3D Inverse() ``` 官方异常说明: ```text ObjectDisposedException Object has been Disposed ``` --- ## 17. `Transform3D.TranslateRight(Vector3D, Transform3D)` 官方文档: - [M_Autodesk_Navisworks_Api_Transform3D_TranslateRight_2_9ab750ca.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/M_Autodesk_Navisworks_Api_Transform3D_TranslateRight_2_9ab750ca.htm) 官方定义: ```text Translate a transform by a vector. ``` 官方 C# 语法: ```csharp public static Transform3D TranslateRight( Vector3D translation, Transform3D transform ) ``` --- ## 18. `Rotation3D` 官方文档: - [T_Autodesk_Navisworks_Api_Rotation3D.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/T_Autodesk_Navisworks_Api_Rotation3D.htm) 官方 C# 类型语法: ```csharp public class Rotation3D : NativeHandle ``` --- ## 19. `Rotation3D(UnitVector3D, Double)` 官方文档: - [C_Autodesk_Navisworks_Api_Rotation3D_ctor_2_afd1d818.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/C_Autodesk_Navisworks_Api_Rotation3D_ctor_2_afd1d818.htm) 官方定义: ```text Creates rotation about given axis by angle in radians ``` 官方 C# 语法: ```csharp public Rotation3D( UnitVector3D axis, double angle ) ``` --- ## 20. `Rotation3D.CreateFromEulerAngles(Double, Double, Double)` 官方文档: - [M_Autodesk_Navisworks_Api_Rotation3D_CreateFromEulerAngles_3_d36b82d7.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/M_Autodesk_Navisworks_Api_Rotation3D_CreateFromEulerAngles_3_d36b82d7.htm) 官方定义: ```text Creates a Euler angle rotation. Parameters are in radians. Rotation is created by combination of rotations about X, Y and Z axes. ``` 官方 C# 语法: ```csharp public static Rotation3D CreateFromEulerAngles( double x, double y, double z ) ``` --- ## 21. `Rotation3D.ToAxisAndAngle()` 官方文档: - [M_Autodesk_Navisworks_Api_Rotation3D_ToAxisAndAngle.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/M_Autodesk_Navisworks_Api_Rotation3D_ToAxisAndAngle.htm) 官方定义: ```text Calculates an axis and angle representation of this rotation. ``` 官方 C# 语法: ```csharp public AxisAndAngleResult ToAxisAndAngle() ``` --- ## 22. `Rotation3D.ToEulerAngles()` 官方文档: - [M_Autodesk_Navisworks_Api_Rotation3D_ToEulerAngles.htm](/C:/Users/Tellme/apps/NavisworksTransport/doc/navisworks_api/NET/documentation/NetAPIHtml/html/M_Autodesk_Navisworks_Api_Rotation3D_ToEulerAngles.htm) 官方定义: ```text Calculates the Euler angles for this rotation. ``` 官方 C# 语法: ```csharp public EulerAngleResult ToEulerAngles() ``` --- ## 23. 由官方 API 原始定义直接能表达的增量求法 这一节不引入项目术语,只把前面几条官方定义并列摆出: ```text currentTransform = 当前生效的几何变换(ModelGeometry.ActiveTransform) targetTransform = 目标完整 Transform3D currentInverse = currentTransform.Inverse() incrementalTransform = Transform3D.Multiply(targetTransform, currentInverse) OverridePermanentTransform(..., incrementalTransform, ...) ``` 这一段的依据完全来自前文官方定义: - `ActiveTransform` = Returns the currently active transform of the geometry. - `Inverse()` = Return inverse of matrix. - `Multiply(left, right)` = Multiply two transforms in the order that the arguments are given. - `OverridePermanentTransform(...)` = Apply an incremental transform to a selection. 这里只说明“这些 API 可以这样直接串起来表达完整当前变换 -> 目标变换 -> 增量变换”,不额外添加项目侧解释。 --- ## 24. 官方示例检索结果 检索范围: ```text C:\Users\Tellme\apps\NavisworksTransport\doc\navisworks_api\NET\examples\ ``` 检索关键词: ```text OverridePermanentTransform ResetPermanentTransform ActiveTransform Transform3DComponents CreateTranslation new Transform3D( ``` 检索结论: ```text 当前官方 NET examples 目录中,未找到这些 API 的直接示例代码。 ``` 因此本文中的“示例”部分不补写项目侧示例,只保留官方文档中的原始定义与语法。 --- ## 25. 2026-04-06 Transform API 实验结论 以下结论来自仓库内实验按钮: - [ReadTransformTestCommand.cs](/C:/Users/Tellme/apps/NavisworksTransport-rail-mount-modes/src/Commands/ReadTransformTestCommand.cs) 实验对象: ```text Chair Lounge Couch Double ``` 实验日志位置: ```text C:\ProgramData\Autodesk\Navisworks Manage 2026\plugins\TransportPlugin\logs\debug.log ``` ### 25.1 纯旋转增量的真实行为 实验结果表明: - 对真实物体调用 - `OverridePermanentTransform(..., rotationOnly, false)` - 其视觉效果等价于: - **绕宿主原点 `(0,0,0)` 旋转** 已验证的旋转: - `X + 90°` - `Y + 90°` - `Z + 90°` 实验日志中,这三项都满足: ```text 按原点旋转预期Center == 实际Center 误差 = (0, 0, 0) ``` 因此当前可以视为已证实: - `.NET API` 下的纯旋转增量默认不是“围绕对象当前中心自转” - 而是“围绕宿主原点旋转” ### 25.2 `Factor(worldCenter)` 的语义价值 实验结果表明: - 对同一个纯旋转增量: - `Factor(Vector3D.Zero)` 得到的 `Translation = (0,0,0)` - `Factor(基线Center)` 会得到非零 `Translation` 这说明: - `Transform3D` 的分解结果确实依赖 `worldCenter` - `Factor(worldCenter)` 可以用于分析“同一变换相对于不同世界中心的平移语义” 但它只是: - **分解分析 API** 不是: - “设置旋转中心”的构造 API ### 25.3 “绕指定中心旋转”的三种 API 组合实验 我们验证了三种做法,目标都是尝试复现 UI 中“指定变换中心后旋转”的效果。 #### 做法 A:直接把 `T(center) * R * T(-center)` 当作增量 结果: - 不成立 - 对基线中心的误差为: ```text (427.280, -492.199, 0.000) ``` #### 做法 B:完整目标左乘 做法: ```text target = centerRotation * current incremental = target * current.Inverse() ``` 结果: - 与做法 A 等价 - 同样不成立 #### 做法 C:完整目标右乘 做法: ```text target = current * centerRotation incremental = target * current.Inverse() ``` 结果: - 也不成立 - 误差更大: ```text (693.643, 0.000, -689.804) ``` ### 25.4 当前可以正式采用的结论 基于本轮实验,当前可以采用以下工程结论: 1. `OverridePermanentTransform(..., false)` 的纯旋转增量,默认绕宿主原点旋转。 2. 当前 `.NET API` 暴露的这套: - `Transform3D.CreateTranslation` - `Rotation3D` - `Transform3D.Multiply` - `OverridePermanentTransform` 不能直接复现 UI 的“指定变换中心旋转”语义。 3. 因此对 `Ground` 这类业务链,不能把问题继续建模成“通过 API 复刻 UI 中心旋转”。 4. 对 `Ground` 更可靠的策略应是: - 接受旋转默认绕宿主原点 - 再基于业务跟踪点语义做位置重对齐 ### 25.5 当前未证实的事项 以下事项目前仍未在原始 API 文档中找到明确说明: 1. UI 中“变换中心”是否有对应的 .NET API 可直接读写。 2. UI 的“变换中心旋转”是否走的是另一套未公开的内部机制。 3. 是否存在未被当前文档索引捕获的 COM API / UI API 可直接设置该中心。 --- ## 26. 归纳 基于以上官方原始定义,可以先得到一个非常克制的结论: 1. `OverridePermanentTransform(...)` 的官方语义就是“应用增量变换”。 2. `ResetPermanentTransform(...)` 的官方语义就是“重置这层增量变换”。 3. `ModelGeometry.ActiveTransform` 表示“当前生效的几何变换”。 4. `Transform3D` / `Transform3DComponents` 官方暴露的核心概念是: - 平移 - 旋转 - 缩放 5. `Transform3D.Multiply(...)` 官方明确说明“按参数给定顺序相乘”。 6. `Transform3D.Inverse()` 官方明确是“返回矩阵逆”。 7. `Rotation3D(UnitVector3D, Double)` 官方明确是“绕给定轴、按弧度创建旋转”。 8. `Rotation3D.CreateFromEulerAngles(...)` 官方明确是“按 X/Y/Z 轴组合欧拉旋转,参数单位为弧度”。 9. 这些官方定义里并没有把“局部业务坐标系解释”当成变换 API 的主语。 因此,从官方原始定义可以直接得到一个非常具体的增量表达方式: - 当前变换:`ModelGeometry.ActiveTransform` - 目标变换:调用方构造的 `targetTransform` - 增量变换:`Transform3D.Multiply(targetTransform, currentTransform.Inverse())` - 应用:`OverridePermanentTransform(...)` 因此,后续如果要重构真实物体变换工具,更合理的方向是: - 先把工具方法收成“宿主坐标系下的平移 / 旋转 / 缩放” - 再在需要时把它们组合成完整 `Transform3D` - 再用 `currentTransform.Inverse()` 和 `Transform3D.Multiply(...)` 求增量 - 最后把这个增量变换交给 `OverridePermanentTransform(...)` 而不是在变换工具层继续传播 `reference axis / local axis / hostUpLocalAxis` 之类的概念。 --- ## 27. 2026-04-06 当天追加结论 基于当天对真实物体、Ground 起点、逐帧、实验按钮的连续实验,可以再补充一条更直接的工程结论: 1. 对 Navisworks 当前这套增量 API,真正稳定的做法只有**最简单的增量法**: - 直接构造宿主坐标系下的旋转增量 - 直接构造宿主坐标系下的平移增量 - 按业务需要分步应用 2. 对真实物体来说,旋转和平移不需要再引入“物体局部映射”来解释 API 行为。 3. 也就是说,变换主语应始终是: - 宿主坐标系下绕哪根轴旋转 - 宿主坐标系下平移多少 4. 如果继续把问题建模成: - 先解释物体局部轴 - 再把宿主旋转翻译成局部旋转 - 再去重建完整目标姿态 这条链在真实物体上非常容易把问题复杂化,而且会引入额外歧义。 5. 因此,后续 Ground 真实物体变换链的工程方向应当是: - 只保留宿主坐标系增量变换 - 旋转和平移分开处理 - 不再在变换工具层传播“局部坐标系 / 局部轴映射”概念 一句话总结: - **只有最简单的宿主坐标系增量法,才能尽量无副作用地做真实物体变换。** - **旋转和平移不需要物体局部映射,局部坐标的概念可以从这条变换链里彻底移除。** --- ## 28. 2026-04-09 Ground 真实物体增量链追加结论 以下结论来自 2026-04-09 对 `Ground + 真实物体` 的连续回归: - 起点落位 - `X / Y / Z` 角度调整 - 逐帧动画 - 通行空间尺寸 以及同一对象在 Navisworks 中的实际可视结果与日志对照。 ### 28.1 Ground 角度调整的正确主语 对 `Ground + 真实物体`,角度调整的正确主语仍然只有: - 宿主世界 `X` 轴 - 宿主世界 `Y` 轴 - 宿主世界 `Z` 轴 也就是说: - `XDegrees` 就是绕宿主 `X` 轴的增量 - `YDegrees` 就是绕宿主 `Y` 轴的增量 - `ZDegrees` 就是绕宿主 `Z` 轴的增量 不需要再额外解释: - 物体当前局部轴 - 参考姿态 - 基姿态 - fragment 代表姿态 - 局部轴业务映射 ### 28.2 角度调整必须按“单轴增量”逐次应用 本轮实验已经验证: - `Ground` 的角度调整不能先重建“完整目标姿态” - 也不能把多个轴的旋转先合成为一份“总姿态”再去应用 更稳定的工程做法是: 1. 对当前物体直接叠加一个宿主轴旋转增量 2. 一次只处理一个轴 3. 非 `up` 轴修正做完后,再处理路径方向对应的 `yaw` 4. 最后再做平移补偿 / tracked point 对齐 一句话: - **Ground 真实物体的角度调整应实现为“直接对物体叠加宿主轴增量”,而不是“先解释姿态,再重建目标姿态”。** ### 28.3 不要从当前显示姿态反解新的平面角 本轮实际问题证明: - 对 `X / Z` 非 `up` 轴修正,如果先应用一次宿主轴增量 - 再从修正后的当前显示姿态里重新反解 `currentYaw` - 很容易把非平面旋转的结果错误混入后续平面转向链 对 `Ground` 这条链,更稳定的做法是: - 非 `up` 轴修正只负责自身的单轴增量旋转 - 路径 `yaw` 仍然只作为“平面转向”处理 - 不再把前一步的三维旋转结果重新解释成新的 `yaw` 起点 ### 28.4 Ground 通行空间的正确数学模型 对 `Ground + 真实物体` 的通行空间,当前验证通过的最简单数学模型是: 1. 先确定一组固定的宿主语义尺寸: - `forward` - `side` - `up` 2. 再只根据宿主轴角度修正,计算旋转后的: - `forwardExtent` - `sideExtent` - `upExtent` 3. 不再把这组三个尺寸二次投影到 `pathForward` 原因是: - 渲染器本身已经会把: - `along` - `across` - `normal` 摆到路径上 - 如果在尺寸链里再按路径方向投影一次,就会把路径方向重复计算 因此对 `Ground` 通行空间,更合理的输入应当是: - 角度修正后的宿主语义尺寸 而不是: - 再投影到路径方向后的尺寸 ### 28.5 当前已补齐的最小数学测试集合 本轮已经在: - [RotatedObjectExtentHelperTests.cs](/C:/Users/Tellme/apps/NavisworksTransport-rail-mount-modes/UnitTests/CoordinateSystem/RotatedObjectExtentHelperTests.cs) 补齐 `Ground / YUp` 下的宿主轴尺寸测试,包括: - `X / Y / Z` - `45 / 90 / 135 / 180 / 270` 这些测试锁住的不是业务解释,而是最基础的数学结论: - 一个长方体在宿主语义尺寸下 - 经宿主轴旋转后 - `forward / side / up` 三个尺寸应如何变化 ### 28.6 当前可以正式采用的 Ground 工程约束 对 `Ground + 真实物体`,当前可以正式采用以下工程约束: 1. 起点、角度调整、逐帧动画都优先走宿主坐标系增量链。 2. `X / Y / Z` 角度调整一次只处理一个宿主轴,不重建总姿态。 3. `yaw` 只处理平面路径转向,不再承担三维姿态解释职责。 4. 通行空间只消费“角度调整后的宿主语义尺寸”,不再重复按路径方向投影。 5. 这条链不再传播: - 基姿态 - 参考姿态 - 局部轴映射 - fragment 代表姿态 这些概念作为变换主语。 一句话总结: - **Ground 真实物体这条链,已经证明“宿主轴单轴增量 + 平面 yaw + 平移补偿”是目前最稳定、最可控的实现方式。**