Three.js(5):基于geotiff.js与DEM生成三维地形场景

1、DEM数据准备


2、引入geotiff库

npm i geotiff

3、使用geotiff库读取DEM数据

import * as GeoTIFF from "geotiff";

const tif = await GeoTIFF.fromUrl("hjq/feature/dem/dem1_108_100_84_clip2.tif");
const tifImage = await tif.getImage();
const image = {
    width: tifImage.getWidth(),
    height: tifImage.getHeight()
    };
const data = await tifImage.readRasters({
    interleave: true
});

4、创建于DEM相同分辨率的平面格网并设置对应的高度值

  const geometry = new THREE.PlaneGeometry(
        bound.width, bound.height,
        image.width - 1, image.height - 1
    );

    const posAttr = geometry.attributes.position;
    //遍历顺序:从左至右,从上至下
    for (let i = 0; i < posAttr.count; i++) {
        posAttr.array[3 * i + 2] = (data[i] / 50);
    }


5、添加纹理

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
以下是使用 three.js 生成地形地图,并添加地形贴图的示例代码: ```javascript // 创建一个场景 var scene = new THREE.Scene(); // 创建一个相机 var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); camera.position.set(0, 10, 20); // 创建一个渲染器 var renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); // 创建一个地形几何体 var terrainGeometry = new THREE.PlaneGeometry(100, 100, 128, 128); THREE.Terrain.generateHeightmap(terrainGeometry.vertices, { after: function() { terrainGeometry.verticesNeedUpdate = true; terrainGeometry.computeVertexNormals(); } }); // 创建一个灰度贴图 var heightmapCanvas = THREE.Terrain.toHeightmap(terrainGeometry.vertices, { power: 0.8, width: 128, height: 128 }); var heightmapTexture = new THREE.CanvasTexture(heightmapCanvas); heightmapTexture.wrapS = THREE.RepeatWrapping; heightmapTexture.wrapT = THREE.RepeatWrapping; heightmapTexture.repeat.set(10, 10); // 创建一个地形贴图 var textureLoader = new THREE.TextureLoader(); var texture = textureLoader.load('textures/terrain.jpg'); texture.wrapS = THREE.RepeatWrapping; texture.wrapT = THREE.RepeatWrapping; texture.repeat.set(10, 10); // 创建一个地形材质 var terrainMaterial = new THREE.MeshPhongMaterial({ color: 0xffffff, map: texture, specularMap: heightmapTexture, shininess: 0, flatShading: true }); // 创建一个地形网格 var terrain = new THREE.Mesh(terrainGeometry, terrainMaterial); terrain.rotation.x = -Math.PI / 2; scene.add(terrain); // 创建一个光源 var light = new THREE.DirectionalLight(0xffffff, 1); light.position.set(0, 1, 0); scene.add(light); // 添加一个控制器 var controls = new THREE.OrbitControls(camera, renderer.domElement); // 渲染场景 function render() { requestAnimationFrame(render); renderer.render(scene, camera); } render(); ``` 上述代码中,我们创建了一个场景、一个相机和一个渲染器,并将渲染器的输出添加到 HTML 页面中。然后,我们创建了一个地形几何体,并使用 `THREE.Terrain.generateHeightmap` 方法生成高度图。接下来,我们创建了一个灰度贴图,并将其应用到地形材质的 `specularMap` 属性上,用于控制地形的高度。我们还创建了一个地形贴图,并将其应用到地形材质的 `map` 属性上,用于控制地形的颜色。最后,我们创建了一个地形网格、一个光源和一个控制器,并使用 `requestAnimationFrame` 方法进行场景渲染。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

碰碰qaq

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

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

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

打赏作者

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

抵扣说明:

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

余额充值