当前位置: 首页 > news >正文

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

1. 什么是欧拉角?

欧拉角是描述三维空间中物体旋转的三种角度表示方法,在三维图形学中,欧拉角通过三个独立旋转分量描述物体方向:

  • - X轴(俯仰角 Pitch)
  • - Y轴(偏航角 Yaw)
  • - Z轴(滚转角 Roll)

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

2. 环境准备

# 创建Vue3项目
npm create vue@latest
cd your-project

# 安装依赖
npm install three @types/three

3. 创建基本的 3D 场景

<script setup>
import { onMounted, ref } from 'vue'
import * as THREE from 'three'

const container = ref(null)

onMounted(() => {
  // 场景初始化
  const scene = new THREE.Scene()
  const camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000)
  
  // 渲器配置
  const renderer = new THREE.WebGLRenderer({ antialias: true })
  renderer.setSize(window.innerWidth, window.innerHeight)
  container.value.appendChild(renderer.domElement)
  
  // 添加坐标轴辅助
  const axesHelper = new THREE.AxesHelper(5)
  scene.add(axesHelper)
})
</script>

<template>
  <div ref="container"></div>
</template>

4. 使用欧拉角旋转物体

// 在组件中添加以下方法
function animate() {
  requestAnimationFrame(animate)
  
  // 获取立方体对象(需先创建)
  cube.rotation.x += 0.01 // X轴旋转(弧度)
  cube.rotation.y += 0.01 // Y轴旋转
  
  renderer.render(scene, camera)
}

// 创建立方体示例
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)

5. 完整代码

<script setup>
import { onMounted, ref } from 'vue'
import * as THREE from 'three'

const container = ref(null)

onMounted(() => {
  // ...(前文场景初始化代码)
  
  // 添加控制器(可选)
  const gui = new dat.GUI()
  gui.add(cube.rotation, 'x', 0, Math.PI*2)
  gui.add(cube.rotation, 'y', 0, Math.PI*2)
})

function animate() {
  // ...(动画循环代码)
}
</script>

<style scoped>
canvas { width: 100%; height: 100vh; }
</style>

6. 进阶技巧

  1. 角度单位转换:THREE.MathUtils.degToRad(180) 实现度数转弧度
  2. 旋转顺序控制:通过Matrix4.setEulerFromQuaternion()指定XYZ/ZYX等顺序
  3. 可视化调试:添加gizmo辅助工具显示当前旋转轴向

相关文章:

  • 第六天 - os/subprocess模块 - 系统进程管理 - 练习:服务状态监控脚本
  • Qt远程连接数据库,注册,登录
  • 2025年江苏省职业院校技能大赛 (高职组)大数据应用开发赛项任务书 (样题)
  • 大语言模型智体的综述:方法论、应用和挑战(下)
  • C#高级:利用LINQ进行实体列表的集合运算
  • 基于SpringBoot的网上订餐系统(源码+数据库+万字文档+开题报告+ppt)
  • 核心知识——Spark核心数据结构:RDD
  • Libevent TCP开发指南
  • Python Web 框架 django-vue3-admin快速入门 django后台管理
  • STM32智能手表——任务线程部分
  • anaconda安装 创建虚拟环境+pycharm中conda环境配置
  • 复杂的数据类型03--指针和数组
  • 线程等待与唤醒的几种方法与注意事项
  • Scala 正则表达式
  • 【技术白皮书】ChatBI架构设计:如何构建上下文感知的企业级问答引擎?
  • 搭建FTP服务器
  • Mac 终端命令大全
  • 太阳能储能路灯杆:点亮绿色未来的新篇章
  • 视频孪生赋能电力数字化转型:构建智能电网的未来蓝图
  • 图解AUTOSAR_SWS_CANNetworkManagement
  • 取得金奖西瓜品种独家使用权的上海金山,为何要到异地“试种”?
  • 福建、广西等地有大暴雨,国家防总启动防汛四级应急响应
  • 蒲慕明院士:未来数十年不是AI取代人,而是会用AI的人取代不会用的
  • 科普|认识谵妄:它有哪些表现?患者怎样走出“迷雾”?
  • 通往国际舞台之路:清政府与万国公会的交往
  • 武大校长:人工智能不存在“过度使用”,武大不会缩减文科