Model Derivative API:メタデータの活用 でもご紹介したとおり、シードファイル(元のデザインファイル)を Forge Viewer で表示するために Model Derivative API で SVF/SVF2 に変換すると、マニフェストにビュー情報が書き出されます。
ビューの視点(カメラ)情報は、マニフェストの "type": "geometry", "role": "3d" 属性を持つスコープ下の "children" 名の配列内、"type": "view", "role": "3d" 属性を持つスコープの "camera" 配列にシードファイルに設定されている視点(カメラ)の詳細値を見ることが出来るはずです。
マニフェスト JSON をパースして "camera" 配列のみを抽出出来れば、その値を setViewFromArray() に渡して Forge Viewer で視点を変更することが出来ます。
ただし、この方法で再現したビューは、シードファイルが Revit プロジェクト(.rvt)の場合、一部のビューとギャップが存在します。また、シードファイルのビュー設定時に切断ボックスや前方/後方クリップが設定されていると、それらが反映されない問題が起こります。
つまり、"camera" 配列のみ方法だけでは、視点を再現出来るものの、切断ボックスや前方/後方クリップを Forge Viewer で表現することが出来ません。(https://forge-viewer-restore-camera.herokuapp.com/)
この方法では、マニフェストの "camera" 配列に後続する "sectionBox" 配列、"sectionBoxTransform" 配列を用いた setCutPlanes メソッドでの反映が必要になってしまい煩雑です。setCutPlanes メソッドは、Forge Viewer:レベル別の表示 でご紹介しています。
このような状態を考慮した場合、Forge Viewer の初期化時に、表示に使用する viewables の "type" に "geometry" を指定してビューを直接表示する方法が一般的です。"type" に "view" を指定すると、上記のマニフェストの view をフェッチすることも出来ます。(https://forge-viewer-restore-view.herokuapp.com/)
function onDocumentLoadSuccess(viewerDocument) { var viewables = viewerDocument.getRoot().search({ 'type': 'geometry', 'role': '3d' }); if (viewables.length == 0) { _viewer.uninitialize(); _viewer = null; alert("No view type contained in the model!"); } else { var index = 0; $('#cameras').children().remove(); viewables.forEach(function (value) { $('#cameras').append($('').val(index).text(value.data.name)); index = index + 1; }); _viewerDocument = viewerDocument; _viewables = viewables; _viewer.loadDocumentNode(viewerDocument, viewables[0]).then(i => { _viewer.setTheme("dark-theme"); }); } }
By Toshiaki Isezaki
コメント