Forge Viewer中AEC模型独立2D平面图与3D世界坐标转换问题
Forge Viewer独立2D平面视图与3D世界坐标转换解决方案
问题根因
未放置到Revit图纸的独立平面视图在Forge格式转换后不会生成视口(Viewport)对象,因此依赖视口属性的坐标转换方法无法直接调用。这类独立视图本身已内置直接映射到3D模型世界坐标的变换参数,无需通过视口间接获取。
实现步骤
- 统一单位基准:2D视图加载完成后,调用
viewer.model.getUnitScale()获取当前2D视图单位与米的转换系数,通过viewer.model.getDisplayUnit()确认视图单位,避免不同单位体系带来的转换偏差。 - 提取变换矩阵:从2D模型元数据中直接获取坐标映射矩阵,调用
viewer.model.getData().metadata['world space']即可得到对应的4x4变换矩阵,该矩阵直接定义了2D视图坐标到3D世界坐标的映射规则。 - 执行坐标转换
- 2D转3D:将2D视图上的坐标点(x,y)补全z值为0构造三维向量,调用矩阵的
multiplyPoint()方法即可得到对应的3D世界坐标点。 - 3D转2D:先求变换矩阵的逆矩阵,将3D世界坐标点传入逆矩阵做乘法运算,丢弃返回值的z值即可得到对应的2D视图坐标点。
- 2D转3D:将2D视图上的坐标点(x,y)补全z值为0构造三维向量,调用矩阵的
- 偏差校准(可选):如果出现毫米级坐标偏差,可调用
viewer.model.getAECModelData()获取AEC元数据中的平面视图偏移量,对转换后的坐标做偏移修正。
示例代码
// 2D视图坐标转3D世界坐标 function convert2DTo3D(viewer, point2D) { const transform = viewer.model.getData().metadata?.['world space']; if (!transform) return null; const vec3 = new THREE.Vector3(point2D.x, point2D.y, 0); return transform.multiplyPoint(vec3); } // 3D世界坐标转2D视图坐标 function convert3DTo2D(viewer, point3D) { const transform = viewer.model.getData().metadata?.['world space']; if (!transform) return null; const inverseTransform = transform.clone().invert(); const res = inverseTransform.multiplyPoint(point3D); return { x: res.x, y: res.y }; }
注意事项
- 该方法仅适用于从Revit直接发布、未绑定图纸的独立平面视图,已放置到图纸的视图仍建议使用视口扩展提供的坐标转换方法
- 调用变换矩阵前需确认2D视图已完全加载,建议监听
Autodesk.Viewing.GEOMETRY_LOADED_EVENT事件,触发后再执行转换逻辑
内容的提问来源于stack exchange,提问作者Christopher Git Daniel
相关产品推荐
相关产品推荐

