threejs 山脉地形高度可视化

参考资料:threejs中文网

threejs qq交流群:814702116

山脉地形高度可视化

一个山脉地形的高度可视化,具体说就是地形不同的高度设置不同的颜色值。有多种方式,下面就举一个设置顶点颜色.attributes.color的例子

在这里插入图片描述

本节课算是一个练习题,用到的知识点前面几节都将讲解过,所以视频主要把思路给大家说一遍,然后大家根据课程课程思路自己手写一遍。

1. 山脉几何体y坐标范围

loader.load("../地形.glb", function (gltf) { 
    model.add(gltf.scene);
    const mesh = gltf.scene.children[0];
    const pos = mesh.geometry.attributes.position;
    const count = pos.count;

    // 1. 计算模型y坐标高度差
    const yArr = [];//顶点所有y坐标,也就是地形高度
    for (let i = 0; i < count; i++) {
        yArr.push(pos.getY(i));//获取顶点y坐标,也就是地形高度
    }
    yArr.sort();//数组元素排序,从小到大
    const miny = yArr[0];//y最小值
    const maxy = yArr[yArr.length - 1];//y最大值
    const height = maxy - miny; //山脉整体高度 
})

2.根据山脉顶点高度设置渐变颜色

借助颜色对象的颜色插值方法.lerp(),计算山脉不同高度位置点的颜色。

// 2. 计算每个顶点的颜色值
const colorsArr = [];
const c1 = new THREE.Color(0x0000ff);//山谷颜色
const c2 = new THREE.Color(0xff0000);//山顶颜色
for (let i = 0; i < count; i++) {
    //当前高度和整体高度比值
    const percent = (pos.getY(i) - miny) / height;
    const c = c1.clone().lerp(c2, percent);//颜色插值计算
    colorsArr.push(c.r, c.g, c.b); 
}
const colors = new Float32Array(colorsArr);
// 设置几何体attributes属性的颜色color属性
mesh.geometry.attributes.color = new THREE.BufferAttribute(colors, 3);

3. Mesh渲染山脉顶点颜色

// 3. 设置材质,使用顶点颜色渲染
mesh.material = new THREE.MeshLambertMaterial({
    vertexColors:true,
});
  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
three.js 是一个基于 WebGL 的 JavaScript 3D 渲染库,可以用它来实现各种复杂的 3D 效果,包括山脉效果。 要实现山脉效果,可以使用 three.js 中的地形几何体(THREE.Terrain)库。该库提供了一些方法和函数,可以帮助您创建 3D 地形山脉效果。 首先,您需要创建一个地形几何体,并设置其参数,例如地形宽度、深度、高度范围等。然后,您可以使用地形几何体的方法来生成地形山脉。 例如,您可以使用 `THREE.Terrain.DiamondSquare()` 方法来生成一个具有随机山脉地形。该方法使用钻石-方形算法来生成地形高度图,并根据您提供的参数来控制山脉的数量和高度。 接下来,您可以使用 `THREE.Terrain.fromHeightmap()` 方法将高度图转换为实际的地形几何体。该方法会自动创建地形几何体,并将高度图中的每个像素转换为几何体中的一个顶点。 最后,您可以将地形几何体添加到场景中,并使用 three.js 的相机和灯光来渲染它。您还可以为地形添加纹理和材质,以实现更真实的山脉效果。 下面是一个简单的例子,演示了如何使用 three.js地形几何体库来创建一个随机山脉地形: ```javascript // 创建地形几何体 var terrain = new THREE.Terrain({ width: 1024, height: 1024, segments: 64, maxHeight: 200, minHeight: -200, easing: THREE.Terrain.Linear, frequency: 2.5, octaves: 3, type: 'DiamondSquare' }); // 将高度图转换为实际的地形几何体 var geometry = THREE.Terrain.fromHeightmap(terrain.heightmap(), { scaleX: 50, scaleY: 50, scaleZ: 50 }); // 创建材质和纹理 var material = new THREE.MeshLambertMaterial({ color: 0xffffff, wireframe: false }); var texture = new THREE.TextureLoader().load('textures/terrain.jpg'); material.map = texture; // 创建地形网格并添加到场景中 var mesh = new THREE.Mesh(geometry, material); scene.add(mesh); // 创建灯光和相机 var light = new THREE.PointLight(0xffffff, 1, 1000); light.position.set(0, 500, 0); scene.add(light); var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); camera.position.z = 500; // 渲染场景 function render() { requestAnimationFrame(render); mesh.rotation.y += 0.01; renderer.render(scene, camera); } render(); ``` 上面的代码创建了一个宽度和高度为 1024,深度为 64 的地形几何体,并使用钻石-方形算法生成随机的山脉高度图。然后,它将高度图转换为实际的地形几何体,并为其创建材质和纹理。最后,它将地形网格添加到场景中,并创建了一个灯光和相机来渲染场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Threejs可视化

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

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

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

打赏作者

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

抵扣说明:

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

余额充值