Это зависит от того, что вы хотите сделать с сеткой: если вы хотите изменить стиль рендеринга, вам нужно получить рендерингProxy, если вы хотите преобразовать позицию или поворот компонента, вам нужно получить фрагментProxy.
Эти методы принимают за вход идентификаторы фрагмента, а не dbId.
Найти примеры как на:
Viewing.Extension.Material
Viewing.Extension.Transform
Вы получаете фрагмент Идентификаторы для данного DBID либо из события выбора, как показано в примерах выше, или с помощью enumNodeFragments :
var instanceTree = model.getData().instanceTree
var fragIds = []
instanceTree.enumNodeFragments(dbId, function(fragId){
fragIds.push(fragId)
})
// to change material or transform, need to iterate all
// fragments of a given dbId and apply same material/transform
fragIds.forEach(function(fragId) {
var renderProxy = viewer.impl.getRenderProxy(viewer.model, fragId)
var fragmentproxy = viewer.impl.getFragmentProxy(viewer.model, fragId)
})
Не могли бы вы объяснить разницу между узловым элементом (dbId) и фрагментом (fragId). Я знаю, что один dbId может отображать многие фрагменты, и один fragId может отображать многие dbIds. Каковы они визуально в программе просмотра Forge? –
Чтобы быть точным, я хотел бы получить реальный объект THREE.Mesh с полной геометрией и материалом объекта dbId при щелчке в Forge viewer. RenderProxy = viewer.impl.getRenderProxy (viewer.model, fragId) не имеет реальной геометрии. Он имеет нулевой или нулевой граничный поле и сферу даже после выполнения THREE.BufferGeometry.computeBoundingBox() или .computeBoundingSphere() –
Поскольку геометрия Forge viewer geometry.boundingBox пуста. Мне нужно запустить фрагментList.getWorldBounds (fragId, fragBox), чтобы вручную вычислить его. –