2017-12-20 8 views
0

選択したノードのdbidに基づいてカメラとターゲットを更新します。コードはMobileVR関数から始まります。 dbidで取得したフラグメッシュに従ってカメラとターゲットを更新し、VRモードに移行します。現在、GEOMETRY_LOADED_EVENT、OBJECT_TREE_CREATED_EVENT、EXTENSION_LOADED_EVENTのイベントリスナーがあります。現在は、タイムアウトのsetTimeout(()=> {onSpaceObjectTreeCreated();}、3000)を使用して動作します。画像1を参照してください。ただし、タイムアウト画像はありません。2.コードを実行したりカメラを更新する前に待つ必要のあるイベントがありますか?カメラを更新する前に聴くイベント

function onSpaceObjectTreeCreated() { 
    const nav = viewer.navigation; 
    const cam = nav.getCamera(); 
    const it = viewer.model.getData().instanceTree; 

    let xPos, yPos, zPos;  

    it.enumNodeFragments(nodeId, (frag) => { 
    const mesh = viewer.impl.getRenderProxy(viewer.model, frag); 
    xPos = mesh.matrixWorld.elements[12]; 
    yPos = mesh.matrixWorld.elements[13]; 
    zPos = mesh.matrixWorld.elements[14]; 
    console.log('x: ' + xPos + ' y: ' + yPos + ' z: ' + zPos); 
    }, false); 
    zPos = -41000; 

    cam.position.set(xPos, yPos, zPos); 
    cam.target.set(xPos, yPos + 10000, zPos); 
} 

function onViewerGeometryLoaded() { 
    const nav = viewer.navigation; 
    const cam = nav.getCamera(); 

    if (nodeId == -1) { 
    viewer.setGroundShadow(false); 
    let xValue = viewer.getCamera().position.x; 
    let yValue = viewer.getCamera().position.y; 
    let zValue = viewer.getCamera().position.z; 
    let bbz = viewer.model.getData().bbox.min.z; 
    let zValue2 = zValue - bbz; 

    zValue = zValue * 0.3; 
    yValue = (zValue2 * 0.7071) * -1; 

    let nav = viewer.navigation; 
    let cam = viewer.getCamera(); 
    cam.position.set(xValue, yValue, zValue);   
    } else { 
    setTimeout(() => { 
     onSpaceObjectTreeCreated(); 
    }, 3000); 
    } 

    viewer.impl.sceneUpdated(); 
    viewer.navigation.updateCamera(); 
    document.getElementById("toolbar-vrTool").click(); 
}; 

function afterViewerEvents() { 
    var events = [ 
    Autodesk.Viewing.GEOMETRY_LOADED_EVENT, 
    Autodesk.Viewing.OBJECT_TREE_CREATED_EVENT, 
    Autodesk.Viewing.EXTENSION_LOADED_EVENT 
    ]; 

    async.each(events, 
    function (event, callback) {    
     var handler = function (ev) { 
      viewer.removeEventListener(
       event, handler); 
      console.log('Event: ' + event); 
      console.log('Ev: ' + ev.extensionId); 
      callback(); 
     }; 
     viewer.addEventListener(
      event, handler); 
    }, 
    function (err) { 
     onViewerGeometryLoaded(); 
    }); 
} 

function mobileVR(arkUrn: string, lviUrn: string, zOffset: number, spaceId: number) { 

    let element = document.getElementById("mobileViewer"); 
    viewer = new Autodesk.Viewing.Private.GuiViewer3D(element); 
    let options = { 
    'env': 'AutodeskProduction', 
    'getAccessToken': getToken, 
    'refreshToken': getToken 
    }; 
    av.Initializer(
    options, 
    () => { 
     viewer.initialize(); 

     loadDocument(arkUrn, zOffset); 
     if (lviUrn != "") { 
      loadDocument(lviUrn, zOffset); 
     }    
     viewer.loadExtension('Autodesk.Viewing.WebVR'); 
    } 
); 

    nodeId = spaceId; 
    afterViewerEvents(); 
} 

Image 1

Image 2

答えて

1

ビューアを初期化した後、文書をロードする前に、イベントをフックアップしてください:

viewer.initialize(); 

afterViewerEvents(); 

loadDocument(arkUrn, zOffset); 

あなたがオートデスクを使用している理由も、私は得ることはありません.Viewing.EXTENSION_LOADED_EVENT、いくつかの拡張機能が起動時またはモデルのロード時にビューアによって自動的にロードされますが、このイベントはf複数回泣きました。あなたが特定の拡張子を探している場合は、ロードされたいくつかの拡張機能があるにもかかわらず

+0

を助けること

希望...あなたはextensionIdをチェックし、これがあなたを待っている拡張機能がある場合にのみ、ハンドラを削除する必要がロードされていますコールバックをトリガする拡張機能が正しいと思われる場合、これがコンソールに表示されます。イベント:extensionLoaded Ev:Autodesk.Viewing.WebVR。イベントをviewer.initialize()の後とloadDocumentの前に接続するようにコードを変更しましたが、これで問題は解決されません。理由は他に何かありますか?それとも私のコードで間違っている何か? –

関連する問題