转换为 THREE.Mesh

问题描述

在 Autodesk Forge Viewer 中,当获取“房间”对象的 maxtrixWorld 属性时,我观察到模型中每个房间的属性都是相同的,无论对象实际位于何处位于模型中。模型中的任何其他对象都不是这种情况(它们都具有与其在模型中的位置相对应的唯一 maxtrixWorld 属性)。

我根据构建房间对象的片段 ID 通过多种方法检索了 maxtrixWorld 数据,所有结果都相同:

获取具有 maxtrixWorld 属性的 THREE.Mesh 对象

const renderProxy = viewer.impl.getRenderProxy(viewer.model,fragId);

获取具有 maxtrixWorld 属性的 THREE.Mesh 对象

const meshObj = fragList.getVizmesh(fragId);

通过fragList辅助函数getWorldMatrix()获取matrixWorld

const matrix = new THREE.Matrix4(); fragList.getWorldMatrix(fragId,matrix);

房间确实出现在模型中的正确位置,这让我认为它们在几何中进行了转换,因为它们的矩阵没有确定它们在模型中的位置。

这是在 Revit 中构建 Room 的方式的限制,还是模型转换过程的结果?有没有办法为这些对象检索正确的矩阵信息?模型正在通过 Forge 处理,generateMasterViews 标志设置为 true,从而可以生成房间数据。

解决方法

我刚刚尝试在一个官方 Revit 示例 (rac_advanced_sample_project.rvt) 中获得几个房间的世界变换,在查看器中使用以下代码:

function logWorldTransforms(viewer,dbid) {
    let tree = viewer.model.getInstanceTree();
    let frags = viewer.model.getFragmentList();
    let mtx = new THREE.Matrix4();
    tree.enumNodeFragments(dbid,function (fragid) {
        frags.getWorldMatrix(fragid,mtx);
        console.log(mtx.toArray());
    },true);
}

你是对的 - 无论我试过哪个房间,它们都具有相同的矩阵(在我的例子中具有 (-140.60,0.50,-17.48) 的恒定偏移量)。使用 generateMasterViews 标志时,模型衍生服务很可能会将偏移量烘焙到每个房间的几何图形中。话虽如此,您仍然可以获得每个房间的边界框,这将使您更好地指示房间的位置。

如果您认为这是一个错误,请将其报告给 forge (dot) help (at) autodesk (dot) com