Я хотел бы, чтобы объекты появлялись и исчезали в средстве просмотра с некоторой степенью прозрачности - PullRequest
0 голосов
/ 17 марта 2020

Я работаю над моделью revi, чтобы положить в кузницу, где вы можете прочитать историю здания. из нации - разрушается - разрушается - реконструкция. между одним проходом и следующим я хотел бы добавить степень прозрачности (постепенное исчезновение) для смены моделей или частей модели.

это моя функция:

 function T00()
  {
  NOP_VIEWER.model.search('00', function onSuccess(dbids) {NOP_VIEWER.showAll(); 
   NOP_VIEWER.isolate(dbids); }, function onError(err) { console.error(err); }, 
  'Timeline_Storico');}.fadeToggle(400)

Я выделяю те части модели, которые хочу увидеть. как я могу добавить степень прозрачности?

1 Ответ

0 голосов
/ 18 марта 2020

Во-первых, я бы посоветовал проверить в другом посте некоторые фоны по механизму рендеринга: Как установить непрозрачность каждого узла

Материалы по умолчанию определены в

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);
...