3ds Max TransNode未被识别为对象

时间:2018-03-08 11:18:07

标签: autodesk-forge autodesk-viewer

我们在Forge查看器应用程序中访问父对象(TransNode)时遇到了一些问题。 TransNode是包含对象中使用的所有材料的对象/节点。

Reference

我们的研究发现,Forge Viewer不会将TransNodes识别为对象。我们仍然可以访问它的材料(Mat0,Mat1,Mat3等),但不能访问父材料(TransNode)。

是否可以将TransNodes定义为API中的对象,或者我们可以使用任何解决方法吗?非常感谢。

1 个答案:

答案 0 :(得分:0)

如果在3ds Max场景中,对象在翻译时应用了多材质,则每个通道都会创建一个子组件。 当您想要创建网格的可选部分而不拆分网格时,这会变得很方便。

但是,如果要避免此子组件选择并在选择子组件时选择整个对象,则有两种方法:

  1. 在3ds Max级别,在翻译场景之前,使用基本/单一材质替换多材质。要保持纹理/颜色,只需将MultiMat烘焙成位图并在基本材质中将其用作漫反射颜色。
  2. 在Forge Viewer级别,您可以使用以下算法定制选择:
         如果我选择一个孩子,请自动选择父 这是通过订阅选择事件来完成的,至少,代码可能如下所示:
  3. let viewer = viewerApp.getCurrentViewer();
    let tree = viewer.model.getData().instanceTree;
    
    viewer.addEventListener(Autodesk.Viewing.AGGREGATE_SELECTION_CHANGED_EVENT,
        (event) => {
        if (event.selections[] != undefined) {
             let selectedNode = event.selections[0].dbIdArray[0];
             console.log("selected a node with id = ", selectedNode);
             if (tree.nodeAccess.getNumChildren(selectedNode) == 0) {
                     let parentId = tree.nodeAccess.getParentId(selectedNode);
                     console.log("parent of the selected node is ", parentId)
                     viewer.select(parentId);
            }
        }
    })
    

    因此,任何选择的“叶子”都会自动选择该“叶子”的父亲以及父节点下的所有内容。

    第二种方法源于我们的一篇博客论文讨论Controlling components selection in the Viewer的想法。