1

Autodesk Forge ビューアがノード要素を複数の 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.Mesh オブジェクトとは異なり、geometry.computeBoundaryBox() の実行後に境界ジオメトリは常にゼロになります。

Forge 要素の境界がゼロであるため、THREE.Raycaster を使用してオーバーレイ要素を投影し、マウス ピックで dbId を取得することはできません。外側の dbId を取得するため、内側の dbId を選択するにはどうすればよいですか? Forge ビューアでは、外側のオブジェクトをクリックしても内側のオブジェクトを選択できません。別の要素内の要素を選択する方法は?

メイン シーンにも空の子がいます。すべての要素はどこにあり、画面上でどのようにレンダリングできますか?

API を完全に制御するには、Forge ビューアーのデータ構造を理解するためのより適切なドキュメントが必要です。Autodesk Forge ビューアの viewer3D.js と wgs.js を独学で習得する必要があります。

4

1 に答える 1

1

以下に、fragmentId に基づいて特定のコンポーネントの境界ボックスにアクセスする方法を示す 2 つの方法を示します。

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

以下のブログ投稿から包括的なサンプルを見つけることができます。

ビューアで各コンポーネントのバウンディング ボックスを取得する

于 2016-12-21T00:28:20.203 に答える