在Forge Viewer中更改元素的属性和不透明度

问题描述

我知道,有一些有关此主题的示例,但我无法得出任何结果。我试图通过以下方法更改材料属性

  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)

或者这个:

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

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

所选元素的材料类型为MeshphongMaterial,查看器为最新版本。

有人有什么主意吗?

解决方法

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

关于自定义材料的不透明度,请注意,这可能会产生意外的结果。加载模型时,Forge Viewer会根据其材料是完全不透明还是半透明的,预先计算一个特殊的数据结构,以高效遍历和渲染其所有元素。稍后更改材质不会更新数据结构,例如,将具有半透明材质的对象与不透明的对象一起渲染会导致视觉伪像。