CesiumJS - 我如何控制观众时间和滴答声?

问题描述:

我想要做的是控制一个非实时 Cesium应用程序的时钟滴答。想象一下正在运行昂贵的代码,再加上我希望给观众时间来在继续之前加载分块。所以如何禁用自动滴答功能,然后在我的代码准备就绪时手动调用tick()CesiumJS - 我如何控制观众时间和滴答声?

的文档Cesium.Clock说:“只有当Clock#canAnimate和Clock#shouldAnimate都为真时钟才会打勾。”但那不是我得到的。 我目前看到:

viewer.clock.canAnimate = false; 
viewer.clock.shouldAnimate = false; 
viewer.clock.onTick.addEventListener(function(clock){ 
    console.log("Tick"); 
}); 

在控制台结果显示,时钟滴答作响仍:

Tick 
Tick 
Tick 
Tick 
... 

我想做什么:

viewer.clock.stopTicking(); // or whatever that command would be... 
while (someCondition){ 
    // run expensive code 
    tick(); // issue manual tick 
} 

感谢您的帮助! Max

这是Cesium API的一个遗留怪癖,即时钟的onTick事件会触发每个动画帧的渲染,而不管时钟是否及时前进。

如果你想利用铯的渲染循环的控制自己,你能做到这一点是这样的:

viewer.useDefaultRenderLoop = false; 

function myOwnRenderLoop() { 
    viewer.resize(); 
    viewer.render(); 
    Cesium.requestAnimationFrame(myOwnRenderLoop); 
} 

Cesium.requestAnimationFrame(myOwnRenderLoop); 

上面,我使用​​,所以循环运行尽可能地快。但我可以用setTimeout替换它以获得较慢的循环,模拟较差的渲染性能。请注意,如果使用更长的时间间隔,则交互性和屏幕更新会使用这种方法减慢速度。

viewer.useDefaultRenderLoop = false; 

function myOwnRenderLoop() { 
    viewer.resize(); 
    viewer.render(); 
    window.setTimeout(myOwnRenderLoop, 500); 
} 

window.setTimeout(myOwnRenderLoop, 500); 
+0

谢谢,这正是我需要的! – maxdownunder

因此,您的console.log仍在打印'Tick',因为onTick会继续触发,无论时钟是否前进。如您所怀疑的,您只需切换canAnimateshouldAnimate即可。所以,你的例子将主要是:

viewer.clock.canAnimate = false; 
viewer.clock.shouldAnimate = false; 
while (someCondition){ 
    // run expensive code 
    // toggle someCondition so we can exit this 
} 
// set the animate bools back to true so the clock can advance 
viewer.clock.canAnimate = true; 
viewer.clock.shouldAnimate = true; 

为了更好地看到这个动作,试试这个(也许设置如果条件为1000,而不是100):

viewer.clock.canAnimate = false; 
viewer.clock.shouldAnimate = false; 
var s = 0; 
viewer.clock.onTick.addEventListener(function(clock){ 
    if (s < 100) { 
     console.log(viewer.clock.currentTime); 
    } else { 
     viewer.clock.canAnimate = true; 
     viewer.clock.shouldAnimate = true;   
    } 
    s++; 
}); 

你会看到console.log正在打印相同的值100(或1000)次...这是因为currentTime没有前进,因为canAnimateshouldAnimate。一旦这两者都切换回true,则currentTime将前进。

+0

谢谢,这是我一直在使用的同时。尽管我之后是emackey提出的解决方案。它可以让你完全控制滴答/帧周期,所以你仍然可以注册onTick调用和切换canAnimate等,只是使应用程序非实时(我正在渲染视频到磁盘)。 – maxdownunder