更新相机前要收听的事件

Posted

技术标签:

【中文标题】更新相机前要收听的事件【英文标题】:Events to listen to before updating camera 【发布时间】:2018-06-02 18:28:18 【问题描述】:

根据选定节点的 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】:

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

viewer.initialize();

afterViewerEvents();

loadDocument(arkUrn, zOffset);

另外我不明白您为什么要使用 Autodesk.Viewing.EXTENSION_LOADED_EVENT,查看器会在启动或模型加载时自动加载几个扩展,此事件将被多次触发。如果您正在寻找正在加载的特定扩展,则需要检查 extensionId 并仅在这是您等待的扩展时才删除处理程序...

希望对你有帮助

【讨论】:

即使加载了几个扩展,触发回调的扩展似乎是正确的,这就是我在控制台中得到的。事件:extensionLoaded Ev:Autodesk.Viewing.WebVR。我还更改了代码,以便在 viewer.initialize() 之后和 loadDocument 之前连接事件,但这并不能解决问题。还有什么可能是原因吗?还是我的代码中有其他错误?

以上是关于更新相机前要收听的事件的主要内容,如果未能解决你的问题,请参考以下文章

收听 Youtube 上传事件 Java

如何在 Windows 通知上收听点击事件?

谷歌日历关注事件更新

孩子们如何收听/捕捉父母的事件

在后台模式下收听设备抖动事件[重复]

如何收听消息阅读事件