1、项目地址
https://github.com/zhengjie9510/webgis-demo
2、实现效果
3、实现思路
构建一个三维曲面类SurfaceGeometry和一个着色器材质类SurfaceMaterial,同时提供了一个App类,用于在canvas上渲染曲面。其中,SurfaceGeometry类用于生成曲面的顶点坐标和面索引,SurfaceMaterial类用于根据顶点高度信息渲染曲面颜色。App类则用于初始化渲染器、场景、相机等参数,并将曲面对象添加到场景中进行渲染。
具体实现思路如下:
- SurfaceGeometry类继承自THREE.BufferGeometry类,用于生成曲面的顶点坐标和面索引。在构造函数中,首先对传入的参数进行处理,获取曲面的宽度、高度和高度矩阵,然后计算出曲面的网格数量、每个网格的宽度和高度,以及顶点和面的数量等信息。接着通过循环遍历每个网格,计算出顶点的位置坐标,并将其存储在一个Float32Array数组中。然后再循环遍历每个网格,计算出面的索引,并将其存储在一个Uint16Array数组中。最后通过setIndex和setAttribute方法将顶点和面信息设置到缓冲区中,并计算出顶点的法向量信息。
- SurfaceMaterial类继承自THREE.ShaderMaterial类,用于根据顶点高度信息渲染曲面颜色。在构造函数中,首先设置着色器代码,其中顶点着色器代码将顶点的高度信息传递给片元着色器,片元着色器代码根据高度信息计算出曲面的颜色,并将其输出。在片元着色器中,采用了线性插值的方法将低值颜色(绿色)和高值颜色(红色)进行混合,同时根据阈值控制了曲面的透明度。
- App类用于初始化渲染器、场景、相机等参数,并将曲面对象添加到场景中进行渲染。在构造函数中,首先创建一个THREE.WebGLRenderer对象,并设置它的canvas、像素比例和大小等参数。然后创建一个THREE.Scene对象和一个THREE.PerspectiveCamera对象,并设置相机的位置。接着调用generateMatrix方法生成一个高度矩阵,并使用它来创建一个SurfaceGeometry对象和一个SurfaceMaterial对象,并将它们合并为一个THREE.Mesh对象。最后将Mesh对象添加到场景中,并调用渲染函数进行渲染。