如何在 Three.js 中实现动态地形生成?

Number of views 101

请说明如何使用 Perlin 噪声生成动态地形,并将其显示在 Three.js 场景中。

1 Answers

要在Three.js中实现动态地形生成,我们可以使用Perlin噪声算法来生成地形的高度图。以下是一个简单的示例,展示如何使用Perlin噪声生成动态地形并将其显示在Three.js场景中。

首先,确保你已经安装了必要的库。在这个例子中,我们将使用threeperlin-noise库。你可以通过npm安装这些库:

npm install three perlin-noise

然后,在你的项目中创建一个HTML文件,并添加以下代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Dynamic Terrain with Three.js</title>
  <style>
    body { margin: 0; }
    canvas { display: block; }
  </style>
</head>
<body>
  <script src="./node_modules/three/build/three.min.js"></script>
  <script src="./node_modules/perlin-noise/build/perlin-noise.min.js"></script>
  <script>
    // 初始化场景、相机和渲染器
    const scene = new THREE.Scene();
    const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
    const renderer = new THREE.WebGLRenderer();
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(renderer.domElement);

    // 创建平面几何体
    const geometry = new THREE.PlaneGeometry(20, 20, 64, 64);

    // 使用Perlin噪声生成高度图
    const noise = new SimplexNoise(Math.random());
    for (let i = 0; i < geometry.vertices.length; i++) {
      const vertex = geometry.vertices[i];
      vertex.z = noise.noise2D(vertex.x * 0.3, vertex.y * 0.3) * 5;
    }

    geometry.computeVertexNormals();

    // 创建材质
    const material = new THREE.MeshStandardMaterial({ color: 0x00ff00, side: THREE.DoubleSide });

    // 创建网格对象
    const mesh = new THREE.Mesh(geometry, material);
    scene.add(mesh);

    camera.position.z = 10;

    // 渲染循环
    function animate() {
      requestAnimationFrame(animate);

      // 更新地形高度(此处可以添加更复杂的动画逻辑)
      for (let i = 0; i < geometry.vertices.length; i++) {
        const vertex = geometry.vertices[i];
        vertex.z = noise.noise2D(vertex.x * 0.3 + Date.now() * 0.001, vertex.y * 0.3 + Date.now() * 0.001) * 5;
      }

      geometry.verticesNeedUpdate = true;
      geometry.normalsNeedUpdate = true;

      renderer.render(scene, camera);
    }

    animate();
  </script>
</body>
</html>

上述代码创建了一个使用Perlin噪声生成的动态地形。我们首先初始化场景、相机和渲染器。然后,我们创建一个平面几何体,并使用Perlin噪声生成高度图。接着,我们创建一个材质并将网格对象添加到场景中。

最后,我们设置一个渲染循环,其中更新地形的高度以实现动态效果。注意,我们在这里只是简单地根据时间变化更新高度,但你可以根据需要添加更复杂的动画逻辑。