提问者:小点点

Autodesk Forge viewer如何管理多个场景以选择多个元素


我想了解Autodesk Forge viewer如何将节点元素存储在多个节点中。场景对象。有几个场景:

viewer.impl.scene // The main scene
viewer.impl.overlayScenes // Three overlay scenes: selection, pivot and roll

每当在Forge viewer中选择一个元素时,它的三个。网格对象将添加到查看器中。impl。覆盖层。选择场景儿童但是,它的边界几何体始终为零,这与基本体3不同。网格对象在执行几何体后将具有边界。computeBoundaryBox()

由于Forge元素的零边界,我不能使用THREE. Raycaster通过覆盖元素进行投影,以在鼠标选择上获得它们的dbIds。如何选择内部dbId,因为它将获得外部dbId?Forge查看器不允许在点击外部对象时选择内部对象。如何在另一个元素中选择一个元素?

主要场景也有空荡荡的孩子。所有元素都在哪里,如何在屏幕上渲染?

它将有更好的文档来理解Forge viewer数据结构,从而拥有完整的API控件。我必须用viewer3D自己学习。js和wgs。Autodesk Forge viewer的js。


共1个答案

匿名用户

以下两种方法向您展示了如何根据特定组件的碎片ID访问其边界框:

//returns bounding box as it appears in the viewer
// (transformations could be applied)
function getModifiedWorldBoundingBox(fragIds, fragList) {

  var fragbBox = new THREE.Box3();
  var nodebBox = new THREE.Box3();

  fragIds.forEach(function(fragId) {

    fragList.getWorldBounds(fragId, fragbBox);
    nodebBox.union(fragbBox);
  });

  return nodebBox;
 }

 // Returns bounding box as loaded in the file
 // (no explosion nor transformation)
function getOriginalWorldBoundingBox(fragIds, fragList) {

  var fragBoundingBox = new THREE.Box3();
  var nodeBoundingBox = new THREE.Box3();

  var fragmentBoxes = fragList.boxes;

  fragIds.forEach(function(fragId) {
    var boffset = fragId * 6;
    fragBoundingBox.min.x = fragmentBoxes[boffset];
    fragBoundingBox.min.y = fragmentBoxes[boffset+1];
    fragBoundingBox.min.z = fragmentBoxes[boffset+2];
    fragBoundingBox.max.x = fragmentBoxes[boffset+3];
    fragBoundingBox.max.y = fragmentBoxes[boffset+4];
    fragBoundingBox.max.z = fragmentBoxes[boffset+5];
    nodeBoundingBox.union(fragBoundingBox);
  });

  return nodeBoundingBox;
 }

你可以从下面的博客文章中找到一个全面的样本:

在查看器中获取每个组件的边界框