更新相机

时间:2017-12-20 08:43:16

标签: autodesk-forge autodesk-viewer

根据所选节点的dbid更新摄像头和目标。代码以MobileVR函数开头。我正在根据用dbid检索的frag网格更新相机和目标,然后移动到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 个答案:

答案 0 :(得分:1)

尝试在初始化查看器之后和加载文档之前连接事件:

word_dict = {}

with open('probability.txt', 'r') as prob, open('text.txt', 'r') as textfile:
    for line in prob:
        if (-2.123456 < float(line.split()[0]) < 0):
            word_dict[line.split()[1]] = line.split()[0]

    for line in textfile:
        for word in line.split():
            if word in word_dict.keys():
                print('MATCH, {}: {}'.format(word, word_dict[word]))

此外,我不知道您使用Autodesk.Viewing.EXTENSION_LOADED_EVENT的原因,查看器在启动或模型加载时会自动加载多个扩展,此事件将被多次触发。如果您正在寻找正在加载的特定扩展,您需要检查extensionId并仅在您正在等待的扩展名时删除处理程序...

希望有所帮助