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

问题描述 投票:1回答:1

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

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

[每当在Forge查看器中选择一个元素时,其THREE.Mesh对象都会添加到viewer.impl.overlayScenes.selection.scene.children中。但是,其边界几何形状始终为零,这与原始THREE不同。网格对象在执行geometry.computeBoundaryBox()

之后将具有边界。

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

主要场景也有空孩子。所有元素在哪里,以及如何在屏幕上呈现?

将有更好的文档来了解Forge查看器数据结构以具有完整的API控件。我必须自己学习Autodesk Forge查看器的viewer3D.js和wgs.js。

autodesk-forge autodesk-viewer
1个回答
1
投票

这是两种方法,向您展示如何根据其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;
 }

您可以从下面的博客文章中找到完整的示例:

Getting bounding boxes of each component in the viewer

© www.soinside.com 2019 - 2024. All rights reserved.