【问题标题】:Orbiting same in both Forge Viewer while having two viewer在有两个查看器的同时在两个 Forge Viewer 中轨道相同
【发布时间】:2021-05-31 17:08:39
【问题描述】:

我的应用程序中有两个查看器,并且希望它们都以相同的位置和摄像机角度绕同一轨道运行,并且在放大和缩小时也遵循相同的轨道。

有什么办法吗?

我已应用以下解决方案,但延迟了一秒。

viewer2.addEventListener(Autodesk.Viewing.CAMERA_CHANGE_EVENT, function()
       {
        if(!viewer1CameraChangeMutex) {
              clearTimeout(viewer2CameraChangeMutex);
              viewer.restoreState(viewer2.getState());
              viewer2CameraChangeMutex=setTimeout(function(){viewer2CameraChangeMutex=undefined},1000)
           }
       });
viewer.addEventListener(Autodesk.Viewing.CAMERA_CHANGE_EVENT, function()
       {
        if(!viewer2CameraChangeMutex) {
               clearTimeout(viewer1CameraChangeMutex);
               viewer2.restoreState(viewer.getState());
               viewer1CameraChangeMutex=setTimeout(function(){viewer1CameraChangeMutex=undefined},1000)
           }
        });

【问题讨论】:

    标签: autodesk-forge autodesk-viewer forge


    【解决方案1】:

    您可以停止不必要的事件 ping-pong b/w 查看器,例如更改查看器1上的视图->更改查看器1上的事件然后将视图状态设置为查看器2->更改查看器2上的事件然后更改查看器1状态->更改查看器1上的事件.....,通过比较视口状态和仅当视口状态不同时才将视图状态设置为其他查看器。

    下面是上面解释的示例代码sn-p。

        function compare(stateA, stateB)
        {
            var viewportA = stateA["viewport"] || {};
            var viewportB = stateB["viewport"] || {};
    
            //compare all members of viewportA and viewportB, return true when all members are same. 
           if( viewportA["name"] !== viewportB["name"] ||
                viewportA["projection"] !== viewportB["projection"] ||
                viewportA["isOrthographic"] !== viewportB["isOrthographic"] ||
                .......//compare all other members of viewport. 
                       //Please note you need to afforded small numeric error for numeric value comparison.
                 )
           {
    
                return false;
           }
           
           return true;
        }
    
    
        var sfilter = {
           viewport: true
        };
    
        viewer3d1.addEventListener(Autodesk.Viewing.CAMERA_CHANGE_EVENT, function () {
            var v1state = viewer3d1.getState(sfilter);
            var v2state = viewer3d2.getState(sfilter);
    
            if (!compare(v1state, v2state)) {
                viewer3d2.restoreState(viewer3d1.getState(sfilter), sfilter, true);
            }
        });
    
        viewer3d2.addEventListener(Autodesk.Viewing.CAMERA_CHANGE_EVENT, function () {
            var v1state = viewer3d1.getState(sfilter);
            var v2state = viewer3d2.getState(sfilter);
            if (!compare(v1state, v2state)) {
                viewer3d1.restoreState(viewer3d2.getState(sfilter), sfilter, true);
            }
        });
    

    【讨论】:

      猜你喜欢
      • 2019-10-22
      • 2018-11-26
      • 2019-03-23
      • 2020-03-01
      • 2021-02-13
      • 2018-07-16
      • 1970-01-01
      • 2013-11-25
      • 2020-05-31
      相关资源
      最近更新 更多