События для прослушивания перед обновлением камеры

Обновление камеры и цели на основе 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();
}

Изображение 1

Изображение 2


person Joni Turunen    schedule 20.12.2017    source источник


Ответы (1)


Попробуйте подключить события после инициализации вьювера и перед загрузкой документа:

viewer.initialize();

afterViewerEvents();

loadDocument(arkUrn, zOffset);

Также я не понимаю, почему вы используете Autodesk.Viewing.EXTENSION_LOADED_EVENT, несколько расширений автоматически загружаются программой просмотра при запуске или загрузке модели, это событие будет запущено несколько раз. Если вы ищете конкретное загружаемое расширение, вам нужно проверить extensionId и удалить обработчик, только если это то расширение, которое вы ждете...

надеюсь, это поможет

person Philippe    schedule 20.12.2017
comment
Несмотря на то, что загружено несколько расширений, расширение, которое запускает обратный вызов, кажется правильным, это то, что я получаю в консоли. Событие: extensionLoaded Ev: Autodesk.Viewing.WebVR. Я также изменил код, чтобы события подключались после viewer.initialize() и перед loadDocument, но это не решает проблему. Есть ли что-то еще, что может быть причиной? Или что-то еще у меня не так в коде? - person Joni Turunen; 20.12.2017