#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 /…