動(dòng)態(tài)水面

// 接受動(dòng)態(tài)水面的數(shù)據(jù) 生成動(dòng)態(tài)的淹沒(méi)效果
export function createWaterSurface(viewer, obj, o) {
    let river = useDrawRiver(o)

    let maxHeight =  Number(27 + o.waterHeight + o.waterDeep)
    let riverHeight = Number(27 + o.waterHeight)

    let timer = setInterval(() => {
        riverHeight += o.rateVal
        river.extrudedHeight = riverHeight
        if (riverHeight >= maxHeight) {
            riverHeight = maxHeight
            // 清除定時(shí)器
            clearInterval(timer)
        }
    }, 1000 / o.rate)

    function useDrawRiver (item) {
        let height = Number(27 + o.waterHeight)
        let riverHeight = Number(27 + o.waterHeight)
        const polygon = useCreatePolygonGeometry(item.position, height, riverHeight)
        let river = null
        river = new Cesium.Primitive({
            geometryInstances: new Cesium.GeometryInstance({
                geometry: polygon,
            }),
            appearance: new Cesium.EllipsoidSurfaceAppearance({
                aboveGround: true,
            }),
            show: true,
            asynchronous: false,
            releaseGeometryInstances: false
        })
    
        const riverMaterial = new Cesium.Material({
            fabric: {
                type: 'Water',
                uniforms: {
                    baseWaterColor: Cesium.Color.fromCssColorString('#475961'), // 水的基本顏色
                    normalMap: require("../image/waterNormal.jpg"), // 水的法線貼圖
                    frequency: 500.0, // 水波紋的數(shù)量
                    animationSpeed: 0.05, // 水的流速
                    amplitude: 5, // 水波紋振幅
                    specularIntensity: 5 // 鏡面反射強(qiáng)度
                }
            }
        })

        river.appearance.material = riverMaterial
        viewer.scene.primitives.add(river) //添加到場(chǎng)景
        river.appearance.material = riverMaterial
        Object.defineProperty(river, 'extrudedHeight', {
            get() {
                return riverHeight
            },
            set(newVal) {
                if (typeof newVal !== 'number') {
                    return
                }
                riverHeight = newVal
                river._state = 3 // 重置primitive狀態(tài)觸發(fā)cesium update方法
                river._appearance = undefined
                river.geometryInstances.geometry = useCreatePolygonGeometry(item.position, height, riverHeight)
            }
        })
        return river
    }

    function useCreatePolygonGeometry (boundary, height, extrudedHeight) {
        const polygon = new Cesium.PolygonGeometry({
            polygonHierarchy: new Cesium.PolygonHierarchy(
                boundary.map(ele => {
                    return Cesium.Cartesian3.fromDegrees(ele[0], ele[1], ele[2])
                })
            ),
            height: height,
            extrudedHeight: extrudedHeight,
            vertexFormat: Cesium.EllipsoidSurfaceAppearance.VERTEX_FORMAT
        })
        return polygon
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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