這里所說的動畫不是cesium的Animation或者是czml,是瀏覽器上的動畫requestAnimationFrame。之前我在threejs中使用過該動畫,當時以為是threejs所特有的,在其中充當將靜態網頁動起來的重要對象。最近在cesium效果編寫中覺得根據Animation或者是czml去繪制動畫非常麻煩。得與cesium的時間軸相結合,我只需要點擊后發生動畫就行了。當然各有各的優勢,對于簡單的動畫來說js的動畫無非更加簡單以及移植性更加好。
requestAnimationFrame
其實就是說遞歸,自己不斷根據某個屬性的變化來不斷調用自身,使某個屬性不斷發生變化。比如說我想讓3dtiles不斷上升,可以解析為某個時間段讓該3dtiles發生平移變換。想讓3dtiles平移可以修改他的變換矩陣來實現。
API接口
傳入一個變換矩陣來達到變換的效果。
var distance =0;
function animation(){
requestAnimationFrame(function(){
var translation=Cesium.Cartesian3.fromArray([-distance, distance, distance]);
var m= Cesium.Matrix4.fromTranslation(translation);
distance = distance+0.2;
self.map.tilesets["parkinglot1"]._modelMatrix = m;
self.map.tilesets["parkinglot"]._modelMatrix = m;
if(distance<15){
animation();//不斷調用自身
}else{
addEntrance(self);
queryParkingNumber();
};
})
}
這樣就會有動畫效果了,是不是非常簡單,同時如果你想讓該動畫發生在cesium的flyto函數執行之后,可以調用其完成后的回調函數。我用的是camera的flyto,viewer的flyto我沒發現其回調接口。只要將其放入complete后就行了,代碼中我做過封裝,原理是一樣的。
self.map.flyTo({
destination: new Cesium.Cartesian3(-2506686.9441362103, 4658206.935923001, 3552200.4119844055),
orientation: {
heading: 3.8527405078650916,
pitch: -0.531606095336215,
roll: 6.280831687840141
},
duration: 3,
},function (){
animation();
});
寫的不好之處,還請大家指出來。