Cesium1.87+ 實現(xiàn)建筑泛光效果

代碼

Cesium 1.87+增加了customShader自定義著色器,實現(xiàn)建筑泛光效果示例代碼如下:

<template>
    <div id="cesiumContainer"></div>
</template>

<script>
export default {
    name: "Test4",
    data() {
        return {};
    },
    mounted() {
        let defaultRect = Cesium.Rectangle.fromDegrees(90, 20, 130, 50);
        Cesium.Camera.DEFAULT_VIEW_RECTANGLE = defaultRect;
        window.viewer = new Cesium.Viewer("cesiumContainer", {
            animation: false,
            shouldAnimate: true,
            baseLayerPicker: false,
            fullscreenButton: false,
            geocoder: false,
            homeButton: false,
            sceneModePicker: false,
            selectionIndicator: false,
            timeline: false,
            navigationHelpButton: false,
            infoBox: true,
            navigationInstructionsInitiallyVisible: false,
            imageryProvider: new Cesium.UrlTemplateImageryProvider({
                //高德底圖
                url:
                    "https://webst01.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}"
            }),
        });
        window.viewer.scene.debugShowFramesPerSecond = true;

        this.test();
    },
    methods: {
        test() {
            Cesium.ExperimentalFeatures.enableModelExperimental = true;
            let tilesets = viewer.scene.primitives.add(
                new Cesium.Cesium3DTileset({
                    url: "https://lab.earthsdk.com/model/702aa950d03c11e99f7ddd77cbe22fea/tileset.json",
                })
            );
            tilesets.readyPromise.then(function(tileset) {
                tileset.style = new Cesium.Cesium3DTileStyle({
                    color: {
                        conditions: [["true", "color('rgb(51, 153, 255)',1)"]],
                    },
                });
                viewer.flyTo(tileset);
            });

            var customShader = new Cesium.CustomShader({
                lightingModel: Cesium.LightingModel.UNLIT,
                fragmentShaderText: `
                    void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material) {
                        float _baseHeight = 0.0; // 物體的基礎(chǔ)高度,需要修改成一個合適的建筑基礎(chǔ)高度
                        float _heightRange = 60.0; // 高亮的范圍(_baseHeight ~ _baseHeight + _      heightRange) 默認(rèn)是 0-60米
                        float _glowRange = 300.0; // 光環(huán)的移動范圍(高度)
                        float vtxf_height = fsInput.attributes.positionMC.z-_baseHeight;
                        float vtxf_a11 = fract(czm_frameNumber / 120.0) * 3.14159265 * 2.0;
                        float vtxf_a12 = vtxf_height / _heightRange + sin(vtxf_a11) * 0.1;
                        material.diffuse*= vec3(vtxf_a12, vtxf_a12, vtxf_a12);
                        float vtxf_a13 = fract(czm_frameNumber / 360.0);
                        float vtxf_h = clamp(vtxf_height / _glowRange, 0.0, 1.0);
                        vtxf_a13 = abs(vtxf_a13 - 0.5) * 2.0;
                        float vtxf_diff = step(0.005, abs(vtxf_h - vtxf_a13));
                        material.diffuse += material.diffuse * (1.0 - vtxf_diff);
                    }       
                    `,
            });
            tilesets.customShader = customShader;
        },
    },
};
</script>

<style scoped>
#cesiumContainer {
    position: absolute;
    width: 100%;
    height: 100%;
}
</style>

效果

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容