使用three.js/webgl实现简易地形

4 篇文章 4 订阅
4 篇文章 3 订阅

在cesium等三维地球引擎,是使用Quantized-mesh瓦片来加载地形,但在小场景地图中,我们有更简便的方式来实现简易地形。本篇以mapbox地形瓦片为例,说明在three.js中使用mapbox地形瓦片的方法。

一、获取地形瓦片和影像

        地形瓦片我使用了mapbox的mapbox.terrain-rgb服务,地形影像我使用了mapbox的mapbox_satellite服务,再根据瓦片行列号算法,可以直接获取到具体的地形和影像瓦片。

 地形瓦片本身是高度图,我们根据其某个点的像素rgb值,就可以计算出这个点的高程。

terrainHeight = -10000.0 + ((r * 256.0 * 256.0 * 256.0 + r * 256.0 * 256.0 + b * 256.0) * 0.1)"

二、地形网格构建

        地形瓦片有确切的地理范围,因此构建地形网格时,我们直接构建宽高为瓦片地理宽高的Plane,再根据实际的地形精度需求,对Plane进行细分。

let planeGeometry = new THREE.PlaneGeometry(width, height, density, density);

三、从地形瓦片中获取网格顶点高度

        关于从地形瓦片中获取高度,我尝试了两种方式,第一种是使用自定义着色器,在顶点着色器中对地形瓦片进行采样,并根据采样结果对顶点高度进行计算,这个好处是计算全部在着色器中进行,高效,但是缺点是片元的法向量计算以及三角面拾取会存在问题。

  vertexShader:  "    varying vec2 v_uv;" +
                "    uniform sampler2D u_terrainRGB;" +
                "    void main() {" +
                "        vec4 finalPosition = vec4(position, 1.0);" +
                "        vec4 terrainPixel = texture2D(u_terrainRGB, uv);"+
                "        float terrainHeight = -10000.0 + ((terrainPixel.x*256.0* 256.0 * 256.0 + terrainPixel.y * 256.0 * 256.0 + terrainPixel.z*256.0) * 0.1);"+
                "        finalPosition.z += terrainHeight;"+
                "        v_uv = uv;" +
                "        gl_Position = projectionMatrix * modelViewMatrix * finalPosition;" +
                "    }",

第二种方式是,遍历Plane几何中每个顶点,根据位置从地形瓦片中采样并计算出高度值,直接对Plane中顶点的高度进行修改。

四、渲染地形网格

        构建好地形网格后,就可以直接对其进行渲染,这里我设置了两种模式,地形渲染模式和地形贴图模式,都具有实际应用场景。

地形渲染模式

地形渲染模式

 

地形+影像模式

 

 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

evomap

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值