在 Forge 查看器中更改元素的 属性 和不透明度

Changing the property and opacity of elements in Forge viewer

我知道,有关于这个主题的例子,但我无法得出任何结果。我试图用这个改变 material 属性:

  var instanceTree = viewer.model.getInstanceTree();
  var fragList = viewer.model.getFragmentList();
  instanceTree.enumNodeFragments( selectedDBID, (fragId) => {
    var material = fragList.getMaterial(fragId)

     if(material){
       material.opacity = 0.5
       material.transparent = true
       material.needsUpdate = true
     }
  });

  viewer.impl.invalidate(true,true,true)

而且我试过这个:

 var customMaterial = new THREE.MeshPhongMaterial
  ({
       opacity:    0.2,
       transparent: true
   });       
   this.viewer.impl.matman().addMaterial('myCustomMaterial', customMaterial, true);
   fragList.setMaterial(fragId, customMaterial);
   viewer.impl.invalidate(true,true,true)

或者这个:

  fragmentList.setMaterial(fragId, new THREE.MeshPhongMaterial( { opacity: 0.5 } ));

当我检查控制台上的 material 属性时,这些都在改变不透明度。但是,查看器上没有任何变化,组件看起来也一样。

Material所选元素类型为MeshPhongMaterial,查看器为最新版本。

有人知道吗?

在 Forge Viewer 中修改 material 对象后看不到任何变化通常是由网格合并引起的 - 一种性能优化,将多个几何图形合并为一个以减少 GPU 绘制调用的数量。尝试使用 viewer.model.unconsolidate();“取消合并”您的模型,看看是否有帮助。

不透明度 的自定义 material 而言,请注意,这可能会产生意想不到的结果。加载模型时,Forge Viewer 会根据它们的 material 是完全不透明还是 semi-transparent 预先计算一个特殊的数据结构,以高效遍历和渲染其所有元素。稍后更改 material 不会更新数据结构,例如,将具有 semi-transparent material 的对象与不透明对象一起渲染会导致视觉伪影。