cesium-动态添加entity闪白材质

此问题出现在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);
发布了243 篇原创文章 · 获赞 36 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/A873054267/article/details/103984402