在 Autodesk Forge Viewer 中获取 THREE.Mesh 元素

Posted

技术标签:

【中文标题】在 Autodesk Forge Viewer 中获取 THREE.Mesh 元素【英文标题】:Get THREE.Mesh elements in Autodesk Forge Viewer 【发布时间】:2017-05-05 01:44:24 【问题描述】:

我想在 Autodesk Forge Viewer 中获取元素的 THREE.Mesh 对象。代码如下:

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

返回的mesh对象是THREE.Mesh对象,但是Geometry和Material都是空的,所以没用。如何获取真正的 THREE.Mesh 对象?

谢谢。

【问题讨论】:

【参考方案1】:

这取决于你想对网格做什么:如果你想改变渲染样式,你需要获取renderProxy,如果你想变换组件位置或旋转,你需要获取fragmentProxy。

这些方法将片段 ID 而非 dbId 作为输入。

在以下位置查找两者的示例:

Viewing.Extension.Material

Viewing.Extension.Transform

您可以从选择事件中获取给定 dbId 的片段 ID,如上面的示例所示,或者使用 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,一个 fragId 可以映射到多个 dbId。它们在 Forge 查看器中的视觉效果是什么? 确切地说,我想在 Forge 查看器中单击时获得具有对象 dbId 的完整几何形状和材质的真实 THREE.Mesh 对象。 renderProxy = viewer.impl.getRenderProxy(viewer.model, fragId) 没有真正的几何图形。即使在执行 THREE.BufferGeometry.computeBoundingBox() 或 .computeBoundingSphere() 之后,它也具有空或零边界框和球体 由于 Forge 查看器 geometry.boundingBox 为空。我必须运行 fragmentList.getWorldBounds(fragId, fragBox) 来手动计算它。 一个 dbId 表示单个组件的 id 可以在模型结构中看到(父或子)或者可以在查看器中直观地选择,因此一个 dbId 可以映射到 0 或多个 fragId,这个是正确的。但是一个fragId不能映射到多个dbId,一个fragId可以让你访问一个特定的fragment,分为renderProxy和fragmentProxy,所以它不是100%等价于THREE.mesh。如果你想变换fragment,你需要fragmentProxy,如果你想改变渲染风格,你需要renderProxy。我上面指出的例子说明了两者。 关于边界框,我已经在这个线程***.com/questions/41248260/… 中回复了您的请求。组合方法应该允许您访问或修改查看器中的任何元素。

以上是关于在 Autodesk Forge Viewer 中获取 THREE.Mesh 元素的主要内容,如果未能解决你的问题,请参考以下文章

Autodesk Forge Viewer 透明背景

将模型从 Autodesk Viewer 加载到 Forge Viewer

如何在ES6中重写Headless Autodesk Forge Viewer

在 Autodesk Forge Viewer 中获取 THREE.Mesh 元素

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

如何在 Autodesk Forge Viewer 中嵌入 pdf?