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);
因此,您的console.log
仍在打印'Tick',因为onTick
会继续触发,无论时钟是否前进。如您所怀疑的,您只需切换canAnimate
和shouldAnimate
即可。所以,你的例子将主要是:
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
没有前进,因为canAnimate
和shouldAnimate
。一旦这两者都切换回true
,则currentTime
将前进。
谢谢,这是我一直在使用的同时。尽管我之后是emackey提出的解决方案。它可以让你完全控制滴答/帧周期,所以你仍然可以注册onTick调用和切换canAnimate等,只是使应用程序非实时(我正在渲染视频到磁盘)。 – maxdownunder
谢谢,这正是我需要的! – maxdownunder