Three.js中调整相机视角的方式

发布于:2025-02-11 ⋅ 阅读:(81) ⋅ 点赞:(0)

在 Three.js 中,相机的视角(即相机的朝向)可以通过多种方式进行设置。以下是一些常用的方法:


1. 使用 lookAt 设置视角

camera.lookAt() 是 Three.js 中最常用的方法之一,用于设置相机看向特定的目标点。

示例:
camera.position.set(0, 10, 20); // 设置相机的位置
camera.lookAt(new THREE.Vector3(0, 0, 0)); // 设置相机看向世界坐标 (0, 0, 0)
  • lookAt(target):
    • 参数 target 是一个 THREE.Vector3,表示目标点的世界坐标。
    • 相机会调整自己的方向,以使得它的视线对准目标点。

2. 直接设置相机的旋转(rotation

相机的旋转可以通过设置 rotation 属性的值来实现。rotation 是一个 THREE.Euler 对象,包含三个轴的旋转值:x, y, 和 z

示例:
camera.position.set(0, 10, 20); // 设置相机的位置
camera.rotation.x = Math.PI / 4; // 绕 X 轴旋转 45 度
camera.rotation.y = Math.PI / 6; // 绕 Y 轴旋转 30 度
camera.rotation.z = 0;           // 绕 Z 轴不旋转
  • 注意
    • rotation 是欧拉角(Euler Angles),单位是弧度(radians)。
    • 顺序是 XYZ(先绕 X 轴旋转,再绕 Y 轴旋转,最后绕 Z 轴旋转)。

3. 使用四元数(quaternion)设置方向

四元数提供了一种更稳定的方式来设置相机的方向,特别适用于避免万向锁问题。

示例:
const quaternion = new THREE.Quaternion();
const axis = new THREE.Vector3(0, 1, 0); // 绕 Y 轴旋转
const angle = Math.PI / 4; // 旋转角度为 45 度

quaternion.setFromAxisAngle(axis, angle); // 生成四元数
camera.quaternion.copy(quaternion); // 应用到相机
  • setFromAxisAngle(axis, angle):
    • axis 是旋转轴(THREE.Vector3)。
    • angle 是旋转的角度(单位为弧度)。
  • 使用四元数设置方向更适合动态旋转的场景。

4. 通过轨道控制(OrbitControls)设置视角

OrbitControls 是一种交互式工具,用于实时调整相机视角,通常由用户通过鼠标或触摸手势操作。

示例:
const controls = new THREE.OrbitControls(camera, renderer.domElement);
controls.target.set(0, 0, 0); // 设置相机围绕的目标点
controls.update(); // 更新控制器
  • controls.target
    • 相机围绕的目标点,类似于 lookAt 的功能。
  • 用户可以通过拖动鼠标来旋转相机视角。

5. 通过视线向量(getWorldDirection)设置方向

可以通过直接操作相机的方向向量来设置视角。

示例:
const direction = new THREE.Vector3(1, 0, 0); // 设置方向向量
camera.lookAt(camera.position.clone().add(direction)); // 相机沿指定方向看
  • getWorldDirection
    • 返回相机当前的朝向向量。
    • 可以通过计算新的方向向量来动态设置视角。

6. 围绕目标旋转(通过矩阵变换)

通过矩阵变换,可以让相机围绕目标点旋转。

示例:
const radius = 10; // 半径
const angle = Math.PI / 4; // 旋转角度

camera.position.x = radius * Math.cos(angle); // 设置 X 位置
camera.position.z = radius * Math.sin(angle); // 设置 Z 位置
camera.lookAt(new THREE.Vector3(0, 0, 0)); // 看向目标点
  • 使用三角函数(Math.cosMath.sin)计算相机在圆周上的位置。

7. 通过动画动态调整视角

如果需要平滑调整相机视角,可以通过动画库(如 gsap 或自定义动画)实现。

示例:
const target = new THREE.Vector3(10, 10, 10); // 目标点

// 动画平滑调整相机视角
gsap.to(camera.position, {
  x: target.x,
  y: target.y,
  z: target.z,
  duration: 2, // 动画持续时间
  onUpdate: () => {
    camera.lookAt(new THREE.Vector3(0, 0, 0)); // 保持看向目标点
  }
});
  • gsap.to
    • 动画库用于动态修改相机位置。
    • onUpdate 回调中不断更新相机视角。

8. 通过极坐标计算视角

可以将视角设置为基于极坐标的角度(例如俯仰和方位角):

示例:
const radius = 10; // 距离目标点的半径
const theta = Math.PI / 4; // 方位角(绕 Y 轴旋转)
const phi = Math.PI / 6;   // 俯仰角(绕 X 轴旋转)

// 极坐标转直角坐标
camera.position.x = radius * Math.sin(phi) * Math.cos(theta);
camera.position.y = radius * Math.cos(phi);
camera.position.z = radius * Math.sin(phi) * Math.sin(theta);

// 保持看向目标点
camera.lookAt(new THREE.Vector3(0, 0, 0));

总结

方法 描述 优点 使用场景
lookAt 设置相机看向某个目标点 简单直接,常用 静态或简单视角调整
rotation 手动调整相机的旋转属性 灵活但易受欧拉角限制影响 静态场景,手动计算角度
quaternion 使用四元数调整相机方向 避免万向锁问题 动态场景或复杂旋转
OrbitControls 用户交互控制相机视角 用户操作友好 可交互的三维场景
方向向量 (lookAt) 基于方向向量调整视角 适合动态方向调整 动态设置视角,如相机跟随移动的物体
矩阵变换(极坐标) 围绕目标点进行旋转 数学计算简单 圆周运动、围绕目标点观察模型
动画(如 gsap 平滑调整相机视角 视觉效果更自然 需要动态过渡的场景

网站公告

今日签到

点亮在社区的每一天
去签到