此问题出现在entity需要贴图时,由于cesium在生成entity时会默认指定白色材质,在entity生成完成之后才开始贴图逻辑,因此导致,每次鼠标点击生成entity时,有一个闪白的效果
要解决这个问题有两种思路,一种是,当entity材质贴完之后再进行显示,当然要准确做到这一点需要修改cesium底层
简单一点,我们可以设置定时器来控制entity的显示即可。
一种方式:
var sStartFlog = false;
setTimeout(function() {
sStartFlog = true;
}, 700);
//当变700毫秒为7的时候,仍然可以看见闪白的效果
semiMinorAxis: new Cesium.CallbackProperty(function() {
if (sStartFlog) {
s1 = s1 + data.circleSize / 20;
if (s1 >= data.circleSize) {
s1 = data.circleSize;
}
}
return s1;
}, false),
semiMajorAxis: new Cesium.CallbackProperty(function() {
if (sStartFlog) {
s2 = s2 + data.circleSize / 20;
if (s2 >= data.circleSize) {
s2 = data.circleSize;
}
}
return s2;
}, false),
完成代码:
let viewer = new Cesium.Viewer('cesiumContainer',{
imageryProvider:new Cesium.WebMapTileServiceImageryProvider({
url:"http://t0.tianditu.com/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles"+"&tk=ebf64362215c081f8317203220f133eb",
layer: "tdtBasicLayer",
style: "default",
format: "image/jpeg",
maximumLevel:18, //天地图的最大缩放级别
tileMatrixSetID: "GoogleMapsCompatible",
show: false
}),
selectionIndicator : false,
infoBox : false,
//terrainProvider: Cesium.createWorldTerrain(),
shouldAnimate : true,
baseLayerPicker:true,
// selectedImageryProviderViewModel:cs[7],
});
//取消双击事件
viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
//设置homebutton的位置
Cesium.Camera.DEFAULT_VIEW_RECTANGLE =
Cesium.Rectangle.fromDegrees(110.15, 34.54, 110.25, 34.56); //Rectangle(west, south, east, north)
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(117.21579, 31.80749, 15000.0),
});
var rotation = Cesium.Math.toRadians(30);
function getRotationValue() {
rotation += 0.05;
return rotation;
}
let entity= viewer.entities.add({
id: "_2",
name: "椭圆",
position: Cesium.Cartesian3.fromDegrees(117.21579, 31.80749,150000.0),
ellipse: {
semiMinorAxis :1000, //直接这个大小 会有一个闪白的材质;直接加载不会出现这个问题
semiMajorAxis : 1000,
material: "./circle2.png",
//rotation: new Cesium.CallbackProperty(getRotationValue, false),
stRotation: new Cesium.CallbackProperty(getRotationValue, false),
zIndex: 2,
}
});
viewer.trackedEntity=entity
data={
circleSize:2000,
maxR:2000,
deviationR:1
}
var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function(e) {
var s1=0.001
var s2=s1
var sStartFlog = false;
setTimeout(function() {
console.log("延迟开放加载标志")
sStartFlog = true;
}, 70);
var cartesian = viewer.camera.pickEllipsoid(e.position, viewer.scene.globe.ellipsoid);
var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
var lon = Cesium.Math.toDegrees(cartographic.longitude).toFixed(5); //四舍五入 小数点后保留五位
var lat = Cesium.Math.toDegrees(cartographic.latitude).toFixed(5); //四舍五入 小数点后保留五位
// var height = Math.ceil(viewer.camera.positionCartographic.height); //获取相机高度
if (cartesian) {
viewer.entities.removeById("_2");
console.log("添加entity")
let en= viewer.entities.add({
id: "_2",
name: "椭圆",
position: Cesium.Cartesian3.fromDegrees(lon, lat,150000.0),
ellipse: {
semiMinorAxis :new Cesium.CallbackProperty(function() {
console.log("半径回调")
if (sStartFlog) {
s1 = s1 + data.circleSize / 20;
if (s1 >= data.circleSize) {
s1 = data.circleSize;
}
}
return s1;
}, false), //直接这个大小 会有一个闪白的材质 因为cesium材质默认是白色 所以我们先将大小设置为0
semiMajorAxis :new Cesium.CallbackProperty(function() {
if (sStartFlog) {
s1 = s1 + data.circleSize / 20;
if (s1 >= data.circleSize) {
s1 = data.circleSize;
}
}
return s1;
}, false),
material: "./circle2.png",
stRotation: new Cesium.CallbackProperty(getRotationValue, false),
zIndex: 2,
}
})
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);