子模型偏移总差一段,怎样按 glTF 节点层级计算 TRS
glTF节点的局部TRS组合是T×R×S,子节点世界变换还要乘上父节点的世界变换。采用列向量时,点先受S、再R、最后T作用;把顺序倒过来会让位移也被缩放或旋转。排查“永远偏一段”时,应逐层计算一个已知挂点,不能只看节点translation是否等于界面位置。
环境和证据范围
附件用父节点沿Z旋转90度、X缩放2倍并平移10米的简化层级,子节点局部偏移1米。它不是glTF完整矩阵解析器,不涵盖蒙皮、变形和动画。真实节点若同时包含matrix与TRS等无效组合,应先通过格式验证,再做空间计算。
核对顺序
-
先标记每个坐标属于模型局部、父局部还是世界。translation是相对父节点的局部位移,不是自动在世界坐标轴上移动;父节点旋转后,子偏移的方向会随之改变。
-
读取完整父链与每层TRS,按约定的向量和矩阵布局计算。glTF矩阵数组采用列主序,若自写代码用行主序,需要明确转置与乘法方式,不能只拷贝16个数。
-
选一个局部原点或挂点逐层应用变换,逐步输出缩放后、旋转后、平移后的坐标。中间结果能定位哪一层开始偏离,比只比较最终世界点更有用。
-
保存一个错误顺序的反例,确认校验确实能报差。运行时父节点动画改变后应重新计算世界变换,不能永远缓存加载时坐标;层级移动也可能改变包围盒和拾取结果。
可复算的输入与预期
合成子偏移[1,0,0]先经父scale[2,1,1]成为[2,0,0],绕Z90度后[0,2,0],再加父translation[10,0,0]得到世界[10,2,0]。错误地先加平移再缩放旋转,得到[0,22,0]。脚本输出两条计算链,数值清楚区分次序。
下载与现场记录
下载本题合成输入与预期JSON、离线只读核验脚本和现场空白记录CSV。放在同一目录,用 Python 3 运行 python verify.py,逐项计算或解析后与预期比较,失败会显示差异。
现场字段包括 parent_chain、vector_convention、matrix_layout、local_point、scaled_point、rotated_point、world_point。合成样例保持原样,实测另存并填写型号、版本、证据路径,未采集处留空。本地核验不代表真实设备、代理、浏览器或长期稳定性已测。
失败分支与移交
只将父translation与子translation相加,会漏掉旋转和缩放。对非均匀缩放、旋转矩阵提取欧拉角再重组还可能引入其他问题,不建议在排错时无依据地分解重写。若挂点正确但可见网格不对,应检查网格自身顶点基准与其他变换。
交接应附父链、每层TRS、矩阵布局、目标挂点与中间坐标,说明动态更新由谁负责。真实引擎中的坐标API可能默认世界或局部,要按文档选择。本文只执行合成链路,不替代场景导入、动画运行与实际空间对齐验收。
基础背景可看BIM 轻量化:为什么原始 BIM 不能直接扔进孪生场景。世界变换正确后,可继续检查拾取边界,见模型包围盒看着对却选不中,怎样把本地八角变到世界坐标。更多资料在数字孪生技术方案。
需要项目联调时,可按上述字段整理资料,联系企服君核对实际接入范围。
一级资料
核对日期:2026-10-24。规范定义与本文应用约定分开,示例门限及脚本不自动代表产品原生能力。
留言讨论
评论发布后会被人工复核,违规内容将被删除。
如果发表没有反应,可以前往联系我们告诉我们。