0

当我们在 3d 视图中隔离一个元素时,是否有办法控制所有其他元素的透明度?说,改成50%半透明?我错过了什么明显的东西吗?你能对二维视图做同样的事情吗?

4

1 回答 1

2

我为您挖出了以下代码,它显示了如何通过更改其材质属性将所有叶节点设置为 50% 的不透明度:

AutodeskNamespace("Autodesk.ADN.Viewing.Extension");

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 做些什么并更新该主题。

于 2016-10-13T21:58:28.530 回答