【发布时间】:2018-01-30 11:15:17
【问题描述】:
我对着色器进行了一些研究,发现了这一点:
https://forge.autodesk.com/blog/forge-viewer-custom-shaders-part-1
我的问题是。似乎这不仅会改变颜色,还会改变材料,这意味着您无法撤消它。在我的场景中,我们需要能够撤消它(重置颜色和材料)。我能以某种方式使这成为可能吗?
【问题讨论】:
标签: autodesk-forge autodesk-viewer
我对着色器进行了一些研究,发现了这一点:
https://forge.autodesk.com/blog/forge-viewer-custom-shaders-part-1
我的问题是。似乎这不仅会改变颜色,还会改变材料,这意味着您无法撤消它。在我的场景中,我们需要能够撤消它(重置颜色和材料)。我能以某种方式使这成为可能吗?
【问题讨论】:
标签: autodesk-forge autodesk-viewer
要撤消这些更改,您必须做一些事情来保持原始材料和 Forge 片段 id 之间的关系。例如,你可以在函数setMaterial中创建一个数组来记住这个映射,像这样:
setMaterial( fragIds, material ) {
const fragList = this._viewer.model.getFragmentList();
// Array for kepping original materials of the Forge fragment.
if( !Array.isArray( this.materialMap ) ) {
this.materialMap = [];
}
this.toArray(fragIds).forEach( ( fragId ) => {
// Keep material relations.
const originalMat = fragList.getMaterial( fragId );
this.materialMap[fragId] = originalMat;
fragList.setMaterial( fragId, material );
});
this._viewer.impl.invalidate( true );
}
要恢复材料,可以这样:
restoreMaterials() {
if( !Array.isArray( this.materialMap ) ) return;
for( let fragId in this.materialMap ) {
const material = this.materialMap[fragId];
fragList.setMaterial( fragId, material );
}
this._viewer.impl.invalidate( true );
// Clean mappings.
this.materialMap.length = 0;
}
【讨论】: