从 Forge Viewer 中对象的 fragId 获取 ThreeJS 网格的函数“getRenderProxy”无法正常工作

Posted

技术标签:

【中文标题】从 Forge Viewer 中对象的 fragId 获取 ThreeJS 网格的函数“getRenderProxy”无法正常工作【英文标题】:The function "getRenderProxy" to get a ThreeJS Mesh from an object's fragId in Forge Viewer doesn't work correctly 【发布时间】:2021-10-31 19:45:18 【问题描述】:

我正在尝试使用该函数从 Autodek Forge 对象中获取threeJS Mesh 'viewer.impl.getRenderProxy(viewer.model, fragId)'。 我遇到的问题是,如果我将此函数放在循环例程中以获取多个对象的网格,我得到的只是一个随机网格。

为了找出问题的根源,我使用了一个类似的函数: 'viewer.impl.getFragmentProxy(viewer.model, fragId)' 而且效果很好。

她是我使用的例程代码和结果:

                            for(let i = 0, len = nodNamee.length; i < (len); i = i+3)
                                var instanceTree = viewer.model.getData().instanceTree;

                                var fragIds = [];

                                instanceTree.enumNodeFragments(nodNamee[i+1], function(fragId)
                                    fragIds.push(fragId);
                                    
                                );

                                fragIds.forEach(function(fragId) 
                                    
                                    var renderProxy = viewer.impl.getRenderProxy(viewer.model, fragId);
                                    fragtoMesh.push(renderProxy);
                                    //var fragmentproxy = viewer.impl.getFragmentProxy(viewer.model, fragId);
                                    //fragtoProxy.push(fragmentproxy);
                                );
                            

结果: Arry of fragtoMesh

【问题讨论】:

【参考方案1】:

这是因为getFragmentProxy 方法总是返回THREE.Mesh相同实例,只是属性不同。基本上,该方法的工作原理如下:

let cachedMesh = new THREE.Mesh();

// ...
getRenderProxy(model, fragId) 
    // Find the geometry, material, and other properties of the fragment
    cachedMesh.geometry = fragGeometry;
    cachedMesh.material = fragMaterial;
    // ...
    return cachedMesh;

// ...

请注意,这是一种性能优化,因为如果 getFragmentProxy(仅供内部使用)函数每次被 Forge Viewer 的其他部分调用时都返回一个新实例,则会导致巨大的内存流失。

因此,在您的情况下,如果您确实需要将所有 THREE.Mesh 实例存储在一个数组中,则需要克隆它们或将它们的各个属性复制到单独的 THREE.Mesh 对象中。

【讨论】:

以上是关于从 Forge Viewer 中对象的 fragId 获取 ThreeJS 网格的函数“getRenderProxy”无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

如何在对象上调整大小 - Autodesk Forge Viewer

如何在 TS 中访问场景、渲染器、相机对象 Forge viewer v6

Forge Viewer:可点击对象的唯一 ID

如何在 forge-viewer 中从最新版本的 three.js 添加几何图形?

将模型从 Autodesk Viewer 加载到 Forge Viewer

在 Forge Viewer 中无法选择 Revit“零件”