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

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

1 ответ

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

viewer.initialize();

afterViewerEvents();

loadDocument(arkUrn, zOffset);

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

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

Другие вопросы по тегам