返回

使用 three.js 创建交互式地球体验

前端

探索 three.js 的世界

three.js 是一个基于 WebGL 的 JavaScript 库,用于创建和渲染交互式 3D 场景。它广泛应用于游戏开发、虚拟现实和数据可视化等领域。

使用 three.js 绘制地球

创建场景

首先,我们需要创建一个 three.js 场景,作为地球的容器。场景包含所有物体、光线和相机。

const scene = new THREE.Scene();

加载地球纹理

接下来,加载地球纹理以应用于球体表面。

const texture = new THREE.TextureLoader().load('earth.jpg');

创建球体几何体

地球是一个球体,因此我们使用 THREE.SphereGeometry 创建一个球体几何体。

const geometry = new THREE.SphereGeometry(1, 32, 32);

参数表示球体的半径、水平分段数和垂直分段数。

应用材质

使用纹理和材质将外观应用于球体几何体。

const material = new THREE.MeshPhongMaterial({ map: texture });

创建网格对象

将几何体和材质结合起来创建网格对象,代表地球。

const earth = new THREE.Mesh(geometry, material);

添加至场景

将地球网格对象添加到场景中。

scene.add(earth);

添加交互功能

可拖拽

使用 THREE.OrbitControls 使地球可拖拽。

const controls = new THREE.OrbitControls(camera, renderer.domElement);

自转

在渲染循环中让地球自转。

function animate() {
  requestAnimationFrame(animate);

  earth.rotation.y += 0.005;

  renderer.render(scene, camera);
}

城市点击事件

使用 THREE.Raycaster 实现城市点击事件。

const raycaster = new THREE.Raycaster();

function onMouseDown(event) {
  const mouseX = (event.clientX / window.innerWidth) * 2 - 1;
  const mouseY = -(event.clientY / window.innerHeight) * 2 + 1;

  raycaster.setFromCamera({ x: mouseX, y: mouseY }, camera);
  const intersects = raycaster.intersectObjects([earth]);

  if (intersects.length > 0) {
    console.log(intersects[0].point);
  }
}

优化技巧

  • 使用 MeshStandardMaterial 代替 MeshPhongMaterial 以获得更好的照明效果。
  • 启用抗锯齿以平滑边缘。
  • 优化纹理大小以提高性能。
  • 限制可拖拽范围以防止相机穿透地球。

结论

恭喜您!您已经创建了一个交互式地球体验,展示了 three.js 的强大功能。通过结合可拖拽、自转和城市点击事件,您创建了一个身临其境的地球模型,可以探索和互动。随着进一步的探索,您可以使用 three.js 创建更复杂的 3D 可视化和应用程序。