问题描述
我知道,有一些有关此主题的示例,但我无法得出任何结果。我试图通过以下方法更改材料属性:
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会根据其材料是完全不透明还是半透明的,预先计算一个特殊的数据结构,以高效遍历和渲染其所有元素。稍后更改材质不会更新数据结构,例如,将具有半透明材质的对象与不透明的对象一起渲染会导致视觉伪像。