2016-12-19 9 views
0

Я хотел бы получить объект THREE.Mesh элемента в Autodesk Forge Viewer. Вот код:Получить элементы THREE.Mesh в Autodesk Forge Viewer

var dbId; // geometry node Id of an element 
var viewer; // GuiViewer3D 
var mesh = viewer.impl.getRenderProxy(viewer.model, dbId); 

Объекта возврата сетки является объектом THREE.Mesh, но с нулевой геометрией и материалом, так что это бесполезно. Как я могу получить реальный объект THREE.Mesh?

спасибо.

ответ

2

Это зависит от того, что вы хотите сделать с сеткой: если вы хотите изменить стиль рендеринга, вам нужно получить рендеринг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) 
}) 
+0

Не могли бы вы объяснить разницу между узловым элементом (dbId) и фрагментом (fragId). Я знаю, что один dbId может отображать многие фрагменты, и один fragId может отображать многие dbIds. Каковы они визуально в программе просмотра Forge? –

+0

Чтобы быть точным, я хотел бы получить реальный объект THREE.Mesh с полной геометрией и материалом объекта dbId при щелчке в Forge viewer. RenderProxy = viewer.impl.getRenderProxy (viewer.model, fragId) не имеет реальной геометрии. Он имеет нулевой или нулевой граничный поле и сферу даже после выполнения THREE.BufferGeometry.computeBoundingBox() или .computeBoundingSphere() –

+0

Поскольку геометрия Forge viewer geometry.boundingBox пуста. Мне нужно запустить фрагментList.getWorldBounds (fragId, fragBox), чтобы вручную вычислить его. –