Autodesk Forge — изолирующий элемент: степень прозрачности других

#autodesk-forge

#autodesk-forge

Вопрос:

Когда мы изолируем элемент в 3D-представлении, можно ли каким-либо образом контролировать степень прозрачности всех остальных элементов? Скажем, изменить прозрачность на 50%? Я пропустил что-то очевидное? И можете ли вы сделать то же самое для 2D-представлений?

Комментарии:

1. Я думаю, вы можете добиться этого, установив непрозрачность материала для всех других фрагментов, кроме того, который вы хотите изолировать, я не уверен в 2D и должен был бы исследовать это

Ответ №1:

Я откопал для вас следующий код, он показывает, как установить для всех конечных узлов непрозрачность 50%, изменив их свойства материала:

AutodeskNamespace(«Autodesk.ADN.Viewing.Расширение»);

 function getLeafNodes(model, nodeId) {

  return new Promise((resolve, reject)=>{

    try{

      var leafIds = [];

      var instanceTree = model.getData().instanceTree

      nodeId = nodeId || instanceTree.getRootId()

      function _getLeafNodesRec(id){

        var childCount = 0;

        instanceTree.enumNodeChildren(id,
          function(childId) {
            _getLeafNodesRec(childId)
              childCount
          })

        if(childCount == 0){
          leafIds.push(id)
        }
      }

      _getLeafNodesRec(nodeId)

      return resolve(leafIds)

    } catch(ex){

      return reject(ex)
    }
  })
}

function nodeIdToFragIds(model, nodeId) {

  var instanceTree = model.getData().instanceTree

  var fragIds = []

  instanceTree.enumNodeFragments(
    nodeId, (fragId) => {
      fragIds.push(fragId)
    });

  return fragIds
}


Autodesk.ADN.Viewing.Extension.Basic = function (viewer, options) {

  Autodesk.Viewing.Extension.call(this, viewer, options);

  var _this = this;

  _this.load = function () {

    var fragList = viewer.model.getFragmentList()

    getLeafNodes(viewer.model).then((dbIds) => {

      dbIds.forEach((dbId) => {

        const fragIds = nodeIdToFragIds(
          viewer.model, dbId)

        fragIds.forEach((fragId) => {

          var material = fragList.getMaterial(fragId)

          if(material) {

            material.opacity = 0.5
            material.transparent = true
            material.needsUpdate = true
          }
        })
      })

      viewer.impl.invalidate(true, true, true)
    })


    return true;
  };

  _this.unload = function () {

    Autodesk.Viewing.theExtensionManager.unregisterExtension(
      "Autodesk.ADN.Viewing.Extension.Basic");

    return true;
  };
};

Autodesk.ADN.Viewing.Extension.Basic.prototype =
  Object.create(Autodesk.Viewing.Extension.prototype);

Autodesk.ADN.Viewing.Extension.Basic.prototype.constructor =
  Autodesk.ADN.Viewing.Extension.Basic;

Autodesk.Viewing.theExtensionManager.registerExtension(
  "Autodesk.ADN.Viewing.Extension.Basic",
  Autodesk.ADN.Viewing.Extension.Basic);
  

Для некоторых синтаксисов требуется перенос ES6. Вы можете быстро вставить туда код, чтобы протестировать его: http://viewer.autodesk.io/node/gallery/#/extension-editor?id=560c6c57611ca14810e1b2bf

Это работает только для 3D, я посмотрю, что мы можем сделать для 2D, и обновлю этот раздел.

Комментарии:

1. Спасибо, Филипп — 2d выглядит немного сложнее?

2.В настоящее время нет простого способа добиться этого с помощью API для 2D, вы можете сделать это, программируя пользовательские шейдеры, но у нас нет примера, который мог бы вам помочь. В этих сообщениях в блоге рассказывается об использовании пользовательских шейдеров для 3D-моделей в средстве просмотра. Это может быть полезно, если вы не знакомы с программированием шейдеров: adndevblog.typepad.com/cloud_and_mobile/2016/07/…adndevblog.typepad.com/cloud_and_mobile/2016/08 /…