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

时间:2017-08-06 05:53:46

标签: javascript cesium

我想要做的是控制非实时 Cesium应用程序的时钟滴答。想象一下,那里运行着昂贵的代码,而且我想让观众有时间在继续之前加载瓷砖。那么如何禁用自动滴答,然后在我的代码准备就绪时手动调用tick()

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
}

感谢您的帮助! 最大

2 个答案:

答案 0 :(得分:1)

因此,您的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;

为了更好地看到这一点,请尝试这个(并且可能将if条件设置为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由于canAnimate而没有推进和shouldAnimate。一旦切换回truecurrentTime就会前进。

答案 1 :(得分:0)

Cesium API的一个遗留怪癖是时钟的onTick事件会为每个呈现的动画帧触发,无论时钟是否及时进行。

如果您想自己控制Cesium的渲染循环,可以这样做:

viewer.useDefaultRenderLoop = false;

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

Cesium.requestAnimationFrame(myOwnRenderLoop);

上面,我使用requestAnimationFrame,因此循环尽可能快地运行。但我可以用setTimeout替换它以获得较慢的循环,模拟较差的渲染性能。请注意,当使用较长的时间间隔时,使用此类方法会降低交互性和屏幕更新速度。

viewer.useDefaultRenderLoop = false;

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

window.setTimeout(myOwnRenderLoop, 500);