Autodesk Forge 查看器如何管理多个场景到 select 多个元素

How Autodesk Forge viewer manages multiple scenes to select multiple elements

我想了解 Autodesk Forge 查看器如何将节点元素存储在多个 THREE.Scene 对象中。有几个场景:

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

每当在 Forge 查看器中 select 编辑一个元素时,它的 THREE.Mesh 对象就会添加到 viewer.impl.overlayScenes.selection.scene.children。然而它的边界几何总是零,不像原始的 THREE.Mesh 对象在执行 geometry.computeBoundaryBox()

后会有边界

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

主场景也有空子。所有元素在哪里?它们如何在屏幕上呈现?

最好有更好的文档来理解 Forge 查看器的数据结构以获得完整的 API 控制。我必须通过 Autodesk Forge 查看器的 viewer3D.js 和 wgs.js 自学。

这里有两个方法向您展示如何根据它们的 fragmentIds 访问特定组件的边界框:

//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;
 }

您可以从下面的博客 post 中找到全面的示例:

Getting bounding boxes of each component in the viewer