基于 Three.js 实现 3D 数学欧拉角

发布于:2025-03-31 ⋅ 阅读:(26) ⋅ 点赞:(0)

大家好!我是 [数擎AI],一位热爱探索新技术的前端开发者,在这里分享前端和Web3D、AI技术的干货与实战经验。如果你对技术有热情,欢迎关注我的文章,我们一起成长、进步!
开发领域:前端开发 | AI 应用 | Web3D | 元宇宙
技术栈:JavaScript、React、ThreeJs、WebGL、Go
经验经验:6 年+ 前端开发经验,专注于图形渲染和 AI 技术
开源项目AI简历晓智科技数擎科技

1. 什么是欧拉角?

欧拉角是描述三维空间中物体旋转的三种角度表示方法。它由三个旋转角度组成,通常称为:

  • 绕 X 轴的旋转角(Roll)
  • 绕 Y 轴的旋转角(Pitch)
  • 绕 Z 轴的旋转角(Yaw)

在 Three.js 中,欧拉角通过 THREE.Euler 对象来实现。通过设置欧拉角的三个值,你可以控制物体在三维空间中的旋转。

2. 环境准备

首先,我们需要准备一个基本的 Three.js 环境。创建一个 HTML 文件,引用 Three.js 库,并设置一个简单的场景:

npm install three

3. 创建基本的 3D 场景

在 JavaScript 中,首先创建一个基本的 Three.js 场景、相机和渲染器:

import * as THREE from 'three';

// 创建场景、相机和渲染器
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.BoxGeometry();
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);

// 设置相机的位置
camera.position.z = 5;

4. 使用欧拉角旋转物体

为了旋转物体,我们可以使用 THREE.Euler 来设置物体的欧拉角。以下代码展示了如何通过欧拉角旋转立方体:

// 创建一个欧拉角实例
const euler = new THREE.Euler(0, 0, 0, 'XYZ'); // 默认欧拉角:Roll, Pitch, Yaw

function animate() {
  requestAnimationFrame(animate);

  // 更新欧拉角(绕Y轴旋转)
  euler.y += 0.01; // 每次旋转一点

  // 应用欧拉角到立方体
  cube.rotation.setFromEuler(euler);

  // 渲染场景
  renderer.render(scene, camera);
}

animate();

解释:

  • THREE.Euler(x, y, z, order) 用于创建一个新的欧拉角实例。x, y, z 是绕各轴旋转的角度(以弧度为单位)。order 是旋转顺序,可以是 ‘XYZ’, ‘YXZ’, ‘ZXY’, ‘ZYX’, ‘YXZ’, ‘ZXY’ 等。

  • cube.rotation.setFromEuler(euler) 将 euler 旋转应用到 cube 上。

  • 在 animate 函数中,我们每次通过 euler.y += 0.01 旋转立方体一点,然后渲染新的帧。

5. 完整代码

import * as THREE from 'three';

// 创建场景、相机和渲染器
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
  75,
  window.innerWidth / window.innerHeight,
  0.1,
  1000,
);
// 设置相机的位置
camera.position.z = 5;

const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 创建一个立方体
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);

// 创建一个有效的 THREE.Euler 实例
const euler = new THREE.Euler(0, 0, 0, 'XYZ'); // 'XYZ' 为旋转顺序

function animate() {
  requestAnimationFrame(animate);

  // 更新 euler 角度
  euler.y += 0.01; // 每次旋转一点(绕 Y 轴)

  //使用 setRotationFromEuler 方法正确地设置物体的旋转
  cube.setRotationFromEuler(euler);

  // 渲染场景
  renderer.render(scene, camera);
}

animate();

6. 总结

通过 THREE.Euler,你可以很方便地控制物体在三维空间中的旋转。利用欧拉角的三种旋转顺序,你可以实现复杂的旋转效果。通过修改 THREE.Euler 的参数,你可以调整物体的旋转角度,甚至可以根据需求进行动态旋转。


网站公告

今日签到

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