2017-12-20 7 views
0

Aktualisieren von Kamera und Ziel basierend auf dbid eines ausgewählten Knotens. Der Code beginnt mit der MobileVR-Funktion. Ich aktualisiere Kamera und Ziel gemäß frag Mesh, das mit dbid abgerufen wurde, und gehe dann in den VR-Modus. Momentan habe ich einen Ereignis-Listener für GEOMETRY_LOADED_EVENT, OBJECT_TREE_CREATED_EVENT und EXTENSION_LOADED_EVENT. Momentan funktioniert es mit einem Timeout setTimeout (() => {onSpaceObjectTreeCreated();}, 3000); siehe Bild 1, aber nicht ohne das Timeout-Bild 2. Gibt es ein anderes Ereignis, das ich warten sollte, bevor ich den Code ausführe oder die Kamera aktualisiere?Vor dem Aktualisieren der Kamera zu erfassende Ereignisse

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

Antwort

1

Versuchen Sie, die Ereignisse hookup nach den Betrachter zu initialisieren und vor Laden des Dokuments:

viewer.initialize(); 

afterViewerEvents(); 

loadDocument(arkUrn, zOffset); 

Auch bekomme ich nicht, warum Sie Autodesk verwenden .Viewing.EXTENSION_LOADED_EVENT werden beim Start oder beim Laden des Modells automatisch mehrere Erweiterungen vom Viewer geladen. Dieses Ereignis wird f mehrmals gesendet. Wenn Sie für eine bestimmte Erweiterung suchen, die geladen Sie die extensionID und entfernen Sie den Handler nur überprüfen müssen, wenn dies der Erweiterung warten Sie noch ...

Hoffnung, die

+0

hilft Obwohl loaded mehrere Erweiterung gibt es scheint die Erweiterung, die den Callback auslöst, der richtige zu sein, das bekomme ich in der Konsole. Ereignis: extensionLoaded Ev: Autodesk.Viewing.WebVR. Ich habe auch den Code geändert, sodass die Ereignisse nach viewer.initialize() und vor loadDocument angeschlossen sind, aber das behebt das Problem nicht. Gibt es noch etwas, das der Grund sein könnte? Oder etwas anderes habe ich falsch in meinem Code? –

Verwandte Themen