Skip to content

在Three.js中,实现相机视角跟随一个移动的对象是一种常见的技术,可以用于创建引人入胜的视觉效果。这可以通过编程控制相机的位置和视线方向来实现,或者使用OrbitControls来实现交互式的相机控制。

使用OrbitControls实现相机跟随

OrbitControls是一个流行的Three.js扩展,它提供了一个直观的相机控制界面,允许用户通过鼠标和键盘操作相机。通过配置OrbitControls,可以让相机自动跟随一个移动的对象。

引入OrbitControls

首先,需要引入OrbitControls

javascript
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';

确保你的HTML文件中包含了正确的importmap配置。

html
<script type="importmap">
{
  "imports": {
    "three": "https://threejs.org/build/three.module.js",
    "three/addons/": "https://threejs.org/examples/jsm/"
  }
}
</script>

初始化OrbitControls

创建一个OrbitControls实例,并将其绑定到相机和渲染器的DOM元素上。

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

配置OrbitControls

可以通过配置OrbitControls的属性来实现相机跟随对象的效果。

  • .target:设置相机的目标点,即相机跟随的对象的位置。
  • .enablePan.enableZoom.enableRotate:控制相机的平移、缩放和旋转。

示例代码

以下是一个完整的示例,展示如何使用OrbitControls实现相机跟随一个移动的对象。

html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Three.js Camera Follow Object</title>
    <style>
        body { margin: 0; }
        canvas { display: block; }
    </style>
</head>
<body>
    <script type="importmap">
    {
      "imports": {
        "three": "https://threejs.org/build/three.module.js",
        "three/addons/": "https://threejs.org/examples/jsm/"
      }
    }
    </script>
    <script type="module">
      import * as THREE from 'three';
      import { OrbitControls } from 'three/addons/controls/OrbitControls.js';

      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 controls = new OrbitControls(camera, renderer.domElement);
      controls.target.set(0, 0, 0); // 设置相机跟随的目标点

      const cube = new THREE.Mesh(
          new THREE.BoxGeometry(50, 50, 50),
          new THREE.MeshStandardMaterial({ color: 0x00ff00 })
      );
      scene.add(cube);

      camera.position.set(0, 0, 100); // 初始相机位置

      function animate() {
          requestAnimationFrame(animate);

          // 移动立方体
          cube.position.x = Math.sin(Date.now() * 0.001) * 50;
          cube.position.y = Math.cos(Date.now() * 0.001) * 50;

          // 更新相机目标点
          controls.target.copy(cube.position);

          // 更新控制器
          controls.update();

          renderer.render(scene, camera);
      }
      animate();
    </script>
</body>
</html>

Theme by threelab