Skip to content

180. 实战:全国人口柱状地图(二)

Published:

上节完成了人口分布柱状图的基本效果:

2025-08-09 15.25.45.gif

这节我们来完善一下。

现在的柱子颜色都一样,直观看不出高度的差别,我们用渐变色来改一下:

之前做过类似的:

2025-04-08 21.56.21.gif

这里我们不用分那么多颜色,两种就行。

渐变色的实现方式之前讲过,就是用 z 除以一个数值,根据百分比来做颜色插值。

比如 color1 是黄色,color2 是红色,根据插值的百分比来计算具体是什么颜色。

image.png

这里我们从红色到红色过渡,到达 100 就是红色,不到 100 根据比值来做颜色插值。

材质要开启 vertextColors 使用顶点颜色。

const positions = geometry.attributes.position;

const colorsArr = [];
const color1 = new THREE.Color('yellow');
const color2 = new THREE.Color('red');
for (let i = 0; i < positions.count; i++) {
    const z = positions.getZ(i) * 2
    const percent = z / 100;
    const c = color1.clone().lerp(color2, percent);
    colorsArr.push(c.r, c.g, c.b);
}
const colors = new Float32Array(colorsArr);
geometry.attributes.color = new THREE.BufferAttribute(colors, 3);

const material = new THREE.MeshPhongMaterial({
    // color: 'orange'
    vertexColors: true
});

这里 positions.getZ 拿到的是一半的高度,就是没做位移之前的 z,所以要乘以 2

试下效果:

2025-08-09 16.10.00.gif

可以直观看出来,山东、广东的人口最多,红色部分最多。

柱子高度有点低,我们改为除以 50:

image.png

image.png

改成粉到红过渡,最高值大概是 230 多,我们除以 250 计算颜色插值:

image.png

看下效果:

2025-08-09 16.19.41.gif

这样从颜色就可以直观看出每个省人口多少了。

现在省的颜色和高度都是一样的,太单调了,我们加一点随机值:

随机颜色也可以用 lerp 颜色插值来做:

image.png

淡蓝色和蓝色之间随机百分比生成插值颜色。

const color1 = new THREE.Color('lightblue');
const color2 = new THREE.Color('blue');
const percent = Math.random();
const color = color1.clone().lerp(color2, percent);

image.png

image.png

这是个小技巧:用 Math.random 配合 color.lerp 颜色插值可以生成两个颜色之间的随机颜色

现在转的时候地图会翻转:

2025-08-09 17.18.45.gif

其实我们不是想让它这样转。

旋转下:

image.png

chinaMap.rotateX(-Math.PI / 2);

调一下相机位置

image.png

camera.position.set(0, 500, 200);

2025-08-09 17.22.47.gif

这样旋转体验就对了。

对比下之前那个:

2025-08-09 15.25.45.gif

好看很多了。

案例代码上传了小册仓库

总结

这节我们美化了一下地图。

首先用颜色插值,配合 高度 / 最大高度 的比值计算出每个顶点的颜色,实现了与高度有关的渐变色。

这样柱子可以直观看出来哪个更高。

然后用颜色插值给每个省加上了随机的颜色,这个 Math.random 配合 color.lerp 生成两个颜色之间的随机颜色的技巧很常用。

地图美化完之后,下节继续来加功能。

评论