在 Forge Viewer 中从对象的 fragId 获取 ThreeJS Mesh 的函数 "getRenderProxy" 无法正常工作

The function "getRenderProxy" to get a ThreeJS Mesh from an object's fragId in Forge Viewer doesn't work correctly

我正在尝试使用函数从 Autodek Forge 对象获取 threeJS 网格 '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

这是因为 getFragmentProxy 方法总是 returns 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 对象中。