作者:taco
常规的水面效果,都是通过三维面数据的风格设置制作的。当然这样的水面有一个好处,在于它可以反射水面上的物体,倒影之类的相对来说比较真实。但是如果我视角调整到水面以下就会出现水面下面并无水的效果,更像是一个表面的模型。
本篇文章基于一个真实的地形数据,制作一份可以在前端流动的水体模型。
一、导入一份地形数据
我们新建一份数据源,右键数据源【导入数据集】导入我们已经准备好的栅格数据集。注意数据集类型此时选择栅格类型,不要选择影像哦。
二、栅格矢量转化
使用【空间分析】=>【栅格矢量化】工具,将栅格转换为矢量点数据集。
三、属性更新
为了避免修改原始数据,我们新建一个字段为底部高程字段,字段名为【height】。用来存储河流底面高度。并通过更新列的方式将value更新至改字段。
新建河流顶部高度字段【height_ding】,该字段存储河流顶部位置信息。
右键【height】字段选择降序排列,找到栅格的最大值为当前地形最高点值。示例以最大值+100的值为水体高度的整体高度。根据实际河流情况可直接赋值修改。通过更新列的方式修改【height_ding】字段即可。
四、绘制水体范围
将点数据集添加至场景中,新建面数据集绘制所需范围。进行裁剪
面数据需要绘制两份,其中一份范围较大用于裁剪出点数据集,一份为实际所需面数据集,此数据集根据实际河流面即可,可为条带状面数据集。此处采用矩形面便于展示。
五、构建水体
使用【数据】模块下【类型转换】中的【二维】=>【三维】将二维点转换为三维点数据集,分别转为顶点和底点
【三维数据】模块中使用地质体中的【构建地质体】功能进行构建,范围选择实际面范围。
构建出的水体为两层的数据,将模型添加至场景中。将需要的数据集(上层水面)找到另存为新的模型数据集。
右键模型进行【材质编辑】,新建材质,材质可以自行找图片或者使用提供图片进行贴图,按照下图中【重新计算纹理坐标】,设置贴图方式,后并【保存到模型】上。
右键模型数据集生成缓存即可,将缓存后的数据发布为三维服务,前端进行调用。
六、前端代码
为了让水流能正常运动起来,按照下面代码设置为例坐标运动即可
var modellayer = viewer.scene.layers.find("test2caizhi");
var style3D = new Cesium.Style3D();
var color = new Cesium.Color(0.0, 0.4, 0.2, 0.6);
modellayer.style3D.fillForeColor = color;
modellayer.textureUVSpeed = new Cesium.Cartesian2(-0.1, -0.1);
水体模型