1. 从零开始:理解Cesium的水体材质系统
如果你用过Cesium,想把一片平平无奇的多边形区域变成波光粼粼的湖泊,那你肯定绕不开它的材质系统。我刚开始接触的时候,觉得这玩意儿有点玄乎,一堆参数不知道从哪调起,做出来的水要么像一潭死水,要么像烧开了的锅,完全不是那么回事。后来折腾多了才明白,Cesium的Material对象,其实就是给几何图形“化妆”的工具箱,而Water材质,就是里面专门用来画水的那支神奇画笔。
Cesium内置的Water材质是一种基于着色器(Shader)的 procedural material(程序化材质)。简单来说,它不是简单贴一张水的图片,而是用一套数学算法实时计算水面的波纹、反射和颜色。这样做的好处是,无论你镜头拉多近,水面细节都不会糊,而且波纹是动态的、无限重复的,非常自然。这跟我们平时在游戏里看到的水面效果原理是相通的。理解这一点很重要,这意味着我们调整参数,其实是在调整背后那套数学公式的输入值。
要使用它,核心就是配置一个fabric对象。你可以把这个fabric想象成一个JSON格式的“配方单”,告诉Cesium:“嘿,我要用Water这种类型的材质,然后它的颜色、波纹大小、流速分别是这些值。” 系统就会按照你的配方,在GPU上实时“烹饪”出你想要的水面效果。官方文档里虽然列出了参数,但每个参数具体调成多少,视觉效果差异有多大,文档可不会告诉你,这都是我一个个试出来的经验。
下面我们先来看一个最基础的、能跑通的代码框架。别担心,哪怕你刚学Cesium,照着这个结构也能立刻看到一个湖。
// 1. 准备湖泊的边界坐标(这里用一个小矩形示例)
let lakeCoordinates = Cesium.Cartesian3.fromDegreesArray([
116.391, 39.907, // 左上角
116.398, 39.907, // 右上角
116.398, 39.902, // 右下角
116.391, 39.902 // 左下角
]);
// 2. 创建水面图元
const waterPrimitive = new Cesium.GroundPrimitive({
geometryInstances: new Cesium.GeometryInstance({
geometry: new Cesium.PolygonGeometry({
polygonHierarchy: new Cesium.PolygonHierarchy(lakeCoordinates),
}),
}),
appearance: new Cesium.EllipsoidSurfaceAppearance({
material: new Cesium.Material({
fabric: {
type: 'Water', // 指定材质类型为“水”
uniforms: {
// 这里暂时用默认参数,后面我们会详细调
baseWaterColor: new Cesium.Color(0.2, 0.3, 0.6, 0.8),
normalMap: '//assets.cesium.com/1/Textures/waterNormals.jpg', // 法线贴图
frequency: 1000.0,
animationSpeed: 0.05,
amplitude: 10.0
}
}
}),
}),
});
// 3. 添加到场景
viewer.scene.primitives.add(waterPrimitive);
把这段代码放到你的Cesium Viewer初始化之后执行,你应该就能在地图上看到一个蓝色的、有细微波纹的平面了。这就是我们的起点。你可能注意到了normalMap这个参数,它是一张关键的法线贴图,用来模拟水面的微观起伏和光线反射细节。Cesium提供了一张默认的,你也可以自己找更细腻的来替换,这对提升真实感帮助巨大。
1.1 核心参数初探:让水“活”起来
现在你的湖已经有了,但它可能还不太像真的水。我们来深入看看uniforms里的几个核心参数,它们分别控制着水的不同“性格”。
baseWaterColor(基础水色):这是水的“底色”。注意,它不是一个简单的纯色。在Cesium的Water材质里,这个颜色会与场景中的天空盒、周围地形进行混合,形成最终你看到的颜色。如果你把它设成纯蓝(0,0,1),效果会非常假。我通常会用一种偏青或偏绿的蓝色,并给一个较高的透明度(alpha值,比如0.7-0.9),让水看起来通透。比如new Cesium.Color(0.165, 0.463, 0.725, 0.85),这个颜色模拟晴天下的湖水就挺不错。
frequency(频率):这个参数控制波纹的“密度”或“数量”。值越大,水面上的波纹就越细密;值越小,波纹就越稀疏、越像大的浪涌。想象一下,频率就像是你在抖动一块绸布,抖得快(高频),布面就是细密的涟漪;抖得慢(低频),就是大的波浪起伏。对于一般规模的湖泊,我建议从800.0到1500.0之间开始尝试。太小了像海,太大了又可能像雨后的积水坑。
animationSpeed(动画速度):顾名思义,就是波纹流动的速度。这个值很好理解,调大,水流就快,显得有风或处于河流中;调小,水流就慢,显得平静。但这里有个坑:速度太快且频率高时,水面会给人一种不自然的“躁动”感。对于平静的湖泊,0.03到0.08是个安全范围。如果你想做山间激流,可以调到0.15甚至


3132

被折叠的 条评论
为什么被折叠?



