【问题标题】:How to get coordinates i.e vertices from an object如何获取坐标,即来自对象的顶点
【发布时间】:2018-11-03 22:27:33
【问题描述】:

我正在尝试一次获取一个元素的几何数据,例如顶点。 到目前为止我尝试了什么:

  • fragproxy = viewer.gui.impl.getFragmentProxy(model,fragid) 给了我某种几何形状,但没有任何顶点,我可以通过 dbId 访问它们

  • frags = viewer.gui.model.getFragmentList() 给了我一个 fragId 到 dbId 的映射,但没有从 dbId 到几何的连接

有人知道用顶点获取几何的方法吗?

【问题讨论】:

    标签: autodesk-forge


    【解决方案1】:

    下面代码sn-ps的位置值就是你想要的顶点。

      function getLeafFragIds( model, leafId ) {
        const instanceTree = model.getData().instanceTree;
        const fragIds = [];
    
        instanceTree.enumNodeFragments( leafId, function( fragId ) {
          fragIds.push( fragId );
        });
    
        return fragIds;
      }
    
      function getComponentGeometry( viewer, dbId ) {
    
        const fragIds = getLeafFragIds( viewer.model, dbId );
    
        let matrixWorld = null;
    
        const meshes = fragIds.map( function( fragId ) {
    
          const renderProxy = viewer.impl.getRenderProxy( viewer.model, fragId );
    
          const geometry = renderProxy.geometry;
          const attributes = geometry.attributes;
          const positions = geometry.vb ? geometry.vb : attributes.position.array;
    
          const indices = attributes.index.array || geometry.ib;
          const stride = geometry.vb ? geometry.vbstride : 3;
          const offsets = geometry.offsets;
    
          matrixWorld = matrixWorld || renderProxy.matrixWorld.elements;
    
          return {
            positions,
            indices,
            offsets,
            stride
          };
        });
    
        return {
          matrixWorld,
          meshes
        };
      }
    
      var meshInfo = getComponentGeometry( viewer, 1234 );
    

    由于 Forge 分片的这些信息存储在扁平化存储中,如果您想重建网格关系,请查看演示扩展 Autodesk.ADN.Viewing.Extension.MeshData.js

    希望对你有帮助!

    【讨论】:

    • 感谢您的回答。该函数返回一个非常大的位置数组,其中包含接近 400k 个条目。你知道如何将它减少到一个合理的数字吗?考虑到位置数组中的 3 个条目是一个顶点并除以面,我应该得到每个面 4 个条目,但我得到 22k 个条目。
    • 这个函数应该应用于叶节点[比如 InstanceTree.getChildCount( dbId ) 为零],例如 Revit Element,而不是 Category 节点。此外,如果所选项目复杂,您将获得更多碎片。
    • 我刚刚使用instanceTree.getChildCount(dbId) 进行了测试,而我用于测试的元素没有子元素,它只是一个 Revit 墙。我的目标是我想使用定制的边界框进行碰撞检测。我的想法是遍历所有 dbId 并从每个元素中逐个获取顶点,并检查它是否与我的边界框发生冲突。
    • Forge 片段是由一组三角形网格组成的,因此至少根据我的经验,可能有 6 个顶点来表示一张脸。您可以使用上面提到的 Autodesk.ADN.Viewing.Extension.MeshData.js 来查看它的样子。
    • 这是一个 SO 讨论,展示了如何从 Forge 片段中绘制边界框,请尝试一下:stackoverflow.com/questions/43871636/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 2013-06-29
    • 2016-11-28
    • 1970-01-01
    • 2017-07-08
    • 2013-09-28
    • 2015-08-01
    相关资源
    最近更新 更多