2017-12-20 15 views
0

선택한 노드의 dbid를 기반으로 카메라 및 대상을 업데이트합니다. 코드는 MobileVR 함수로 시작합니다. dbid로 검색된 frag mesh에 따라 카메라와 타겟을 업데이트하고 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 전에 연결되도록 코드를 변경했지만 문제가 해결되지 않습니다. 이유가 될만한 것이 있습니까? 아니면 내 코드에서 잘못된 점이 있습니까? –