Во-первых, я бы посоветовал проверить в другом посте некоторые фоны по механизму рендеринга: Как установить непрозрачность каждого узла
Материалы по умолчанию определены в
viewer.impl.matman()._materials;
Разные фрагменты могут делиться с одним и тем же материалом.
В блоге ниже я продемонстрировал, как сделать модель серой, изменив параметры материала. https://forge.autodesk.com/blog/showhide-textures-object-forge-viewer Аналогично, вы можете установить их непрозрачность на разные значения. например,
//iterate materials
for (index in mats) {
//index is the material name (unique string in the list)
m = mats[index];
//store texture info
oldTextures[index] = m.map;
oldColors[index] = m.color;
//set the material without texture and the grey color
//var grey = new THREE.Color(0.5, 0.5, 0.5);
//m.map = null;
//m.color = grey;
//change transparency
m.opacity = 0.1*index;
m.transparent = true;
//force update
material.needsUpdate = true
//mark the material dirty. The viewer will refresh
m.needsUpdate = true;
}
//refresh the scene
viewer.impl.invalidate(true, true, false);
Однако проблема заключается в том, что, поскольку фрагменты делятся с материалом, все другие фрагменты (с тем же материалом) также будут обновлены, а не объектами прозрачности.
Хотя, это можно обойти путем клонирования материала указанного объекта c, изменения его непрозрачности и, наконец, применения этого материала только к объекту. Конечно, поскольку это клонированный материал, вам необходимо добавить его в список материалов viewer.impl.matman (). Другие посты с кодами Как установить независимый материал для указания c dbId , скопируйте сюда для вашего удобства:
let material = fragList.getMaterial(fragId).clone();
if (material) {
material.opacity = opacity
material.transparent = true
material.needsUpdate = true
}
viewer.impl.matman().addMaterial ('myCustomMaterial', material,
true);
viewer.model.getFragmentList().setMaterial(fragId, material);
viewer.impl.invalidate(true);