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

news2025/4/6 11:42:24

大家好!我是 [数擎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 的参数,你可以调整物体的旋转角度,甚至可以根据需求进行动态旋转。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2327324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过 Docker Swarm 集群探究 Overlay 网络跨主机通信原理

什么是Overlay网络, 用于解决什么问题 ? Overlay网络通过在现有网络之上创建一个虚拟网络层, 解决不同主机的容器之间相互通信的问题 如果没有Overlay网络,实现跨主机的容器通信通常需要以下方法: 端口映射使用宿主机网络模式 这些方法牺牲了容器网络…

HarmonyOS NEXT开发进阶(十四):HarmonyOS应用开发者基础认证试题集汇总及答案解析

文章目录 一、前言二、判断题(134道)三、单选题(210道)四、多选题(123道)五、拓展阅读 一、前言 鸿蒙原生技能学习阶段,通过官方认证的资格十分有必要,在项目实战前掌握基础开发理论…

MSVC编译遇到C2059、C2143、C2059、C2365、C2059等错误的解决方案

MSVC编译时,遇到如下错误: c:\program files (x86)\windows kits\10\include\10.0.18362.0\um\msxml.h(1842): error C2059: 语法错误:“常数” [D:\jenkins_home\workspace\xxx.vcxproj] c:\program files (x86)\windows kits\10\include\10.0.18362.0…

AI重塑云基础设施,亚马逊云科技打造AI定制版IaaS“样板房”

AI正在彻底重塑云基础设施。 IDC最新《2025年IDC MarketScape:全球公有云基础设施即服务(IaaS)报告》显示,AI正在通过多种方式重塑云基础设施,公有云IaaS有望继续保持快速增长,预计2025年全球IaaS的整体规…

Linux系统之systemctl管理服务及编译安装配置文件安装实现systemctl管理服务

目录 一.systemctl 管理服务 1.systemctl管理 2.设置服务卡机自启动或开机不启动 二.编译安装配置文件编写使得可以使用systemctl管理 1、编写配置文件原因 2、添加配置文件实现systemctl管理服务 一.systemctl 管理服务 1.systemctl管理 基本格式: systemc…

【NLP 52、多模态相关知识】

生活应该是美好而温柔的,你也是 —— 25.4.1 一、模态 modalities 常见: 文本、图像、音频、视频、表格数据等 罕见: 3D模型、图数据、气味、神经信号等 二、多模态 1、Input and output are of different modalities (eg: tex…

Element Plus 常用组件

2025/4/1 向全栈工程师迈进!!! 常见Element Plus组件的使用,其文章中“本次我使用到的按钮如下”是我自己做项目时候用到的,记录以加强记忆。阅读时可以跳过。 一、Button按钮 1.1基础按钮 在element plus中提供的按…

2025年优化算法:真菌生长优化算法(Fungal Growth Optimizer,FGO)

真菌生长优化算法(Fungal Growth Optimizer,FGO) 是发表在中科院一区期刊“ARTIFICIAL INTELLIGENCE REVIEW”(IF:6.7)的2025年3月智能优化算法 01.引言 Fungal Growth Optimizer (FGO) 是一种基于真菌生长行为的元启发式优化算法…

阿里通义千问发布全模态开源大模型Qwen2.5-Omni-7B

Qwen2.5-Omni 是一个端到端的多模态模型,旨在感知多种模态,包括文本、图像、音频和视频,同时以流式方式生成文本和自然语音响应。汇聚各领域最先进的机器学习模型,提供模型探索体验、推理、训练、部署和应用的一站式服务。https:/…

论文阅读:基于增强通用深度图像水印的混合篡改定位技术 OmniGuard

一、论文信息 论文名称:OmniGuard: Hybrid Manipulation Localization via Augmented Versatile Deep Image Watermarking作者团队:北京大学发表会议:CVPR2025论文链接:https://arxiv.org/pdf/2412.01615二、动机与贡献 动机: 随着生成式 AI 的快速发展,其在图像编辑领…

深挖 DeepSeek 隐藏玩法·智能炼金术2.0版本

前引:屏幕前的你还在AI智能搜索框这样搜索吗?“这道题怎么写”“苹果为什么红”“怎么不被发现翘课” ,。看到此篇文章的小伙伴们!请准备好你的思维魔杖,开启【霍格沃茨模式】,看我如何更新秘密的【知识炼金…

【新手初学】SQL注入getshell

一、引入 木马介绍: 木马其实就是一段程序,这个程序运行到目标主机上时,主要可以对目标进行远程控制、盗取信息等功能,一般不会破坏目标主机,当然,这也看黑客是否想要搞破坏。 木马类型: 按照功…

DAY 34 leetcode 349--哈希表.两个数组的交集

题号349 我尝试硬解失败 /*class Solution {public int[] intersection(int[] nums1, int[] nums2) {int n1nums1.length;int n2nums2.length;int sizeMath.min(n1,n2);int []arrnew int[size];int count0;for(int i0;i<n1;i){outerloop:for(int j0;j<n2;j){if(nums1[i…

14-SpringBoot3入门-MyBatis-Plus之CRUD

1、整合 13-SpringBoot3入门-整合MyBatis-Plus-CSDN博客 2、表 3、crud package com.sgu;import com.sgu.mapper.UserMapper; import com.sgu.pojo.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.spri…

三轴云台之相机技术篇

一、结构设计 三轴云台通常由空间上三个互相垂直的框架构成&#xff0c;包括内框&#xff08;俯仰框&#xff09;、中框&#xff08;方位框&#xff09;和外框&#xff08;横滚框&#xff09;。这些框架分别负责控制相机的俯仰运动、方位运动和横滚运动&#xff0c;从而实现对目…

Bugku-再也没有纯白的灵魂

下载文件发现是兽音先用https://roar.iiilab.com/加密flag 得到“~呜嗷嗷嗷嗷呜啊嗷啊呜呜嗷呜呜~嗷嗷~啊嗷啊呜嗷嗷~嗷~嗷~呜呜嗷呜啊啊”&#xff0c;与密文对比对比发现字段少个啊&#xff0c;并且B对应嗷&#xff0c;U对应呜&#xff0c;G对应啊&#xff0c;K对应~补充啊后…

多模态大语言模型arxiv论文略读(一)

Does Transliteration Help Multilingual Language Modeling? ➡️ 论文标题&#xff1a;Does Transliteration Help Multilingual Language Modeling? ➡️ 论文作者&#xff1a;Ibraheem Muhammad Moosa, Mahmud Elahi Akhter, Ashfia Binte Habib ➡️ 研究机构: Pennsyl…

单元测试原则之——不要模拟不属于你的类型

在单元测试中,不要模拟不属于你的类型(Don’t mock types you don’t own)是一个重要的原则。这是因为外部库或框架的类型(如第三方依赖)可能会在未来的版本中发生变化,而你的模拟可能无法反映这些变化,从而导致测试失效。 以下是一个基于Java Mockito 的示例,展示如何…

算法与数据结构面试题

算法与数据结构面试题 加油&#xff01; 考查数据结构本身 什么是数据结构 简单地说&#xff0c;数据结构是以某种特定的布局方式存储数据的容器。这种“布局方式”决定了数据结构对于某些操作是高效的&#xff0c;而对于其他操作则是低效的。首先我们需要理解各种数据结构&a…

边缘检测技术现状初探2:多尺度与形态学方法

一、多尺度边缘检测方法 多尺度边缘检测通过在不同分辨率/平滑度下分析图像&#xff0c;实现&#xff1a; 粗尺度&#xff08;大σ值&#xff09;&#xff1a;抑制噪声&#xff0c;提取主体轮廓细尺度&#xff08;小σ值&#xff09;&#xff1a;保留细节&#xff0c;检测微观…