首页 / three.js / API 文档
Euler
先看结论
欧拉角。用三个绕轴的角度描述旋转,直觉上最好理解, 但结果依赖旋转顺序,并在特定角度出现万向锁。
new THREE.Euler(x, y, z, order)
构造参数
| 参数 | 默认 | 说明 |
|---|---|---|
x | 0 | 绕 X 轴角度,弧度 |
y | 0 | 绕 Y 轴角度,弧度 |
z | 0 | 绕 Z 轴角度,弧度 |
order | 'XYZ' | 旋转顺序,可选 XYZ、YXZ、ZXY、ZYX、YZX、XZY |
属性
| 属性 | 说明 |
|---|---|
x / y / z | 三个轴上的角度,直接赋值会同步更新四元数 |
order | 旋转顺序字符串 |
isEuler | 恒为 true |
方法
| 方法 | 说明 |
|---|---|
set(x, y, z, order) | 一次设置角度与顺序 |
setFromRotationMatrix(m, order, update) | 由旋转矩阵反解欧拉角 |
setFromQuaternion(q, order, update) | 由四元数反解 |
reorder(newOrder) | 换顺序并重新换算角度 |
equals(euler) | 角度与顺序都相同才返回 true |
clone() / copy(euler) | 复制 |
fromArray(array) / toArray() | 与数组互转 |
示例
// 朝向:先抬头,再转向
const euler = new THREE.Euler(
THREE.MathUtils.degToRad(30),
THREE.MathUtils.degToRad(45),
0,
'YXZ'
);
mesh.quaternion.setFromEuler(euler);
// 反解当前朝向,用于显示面板
const current = new THREE.Euler().setFromQuaternion(mesh.quaternion, 'YXZ');
console.log(
THREE.MathUtils.radToDeg(current.x).toFixed(1),
THREE.MathUtils.radToDeg(current.y).toFixed(1),
THREE.MathUtils.radToDeg(current.z).toFixed(1)
);
万向锁
XYZ 顺序下,绕 Y 转到 ±90° 时,X 轴与 Z 轴的重转效果重合,
两个角度失去独立意义。three.js 在反解时会把其中一个角度设为 0,
正向设定时则表现为「无论怎么调另一个角,姿态都不变」。
这是欧拉角的固有缺陷,不是实现错误。
需要大角度连续旋转(如第一人称视角、飞行姿态)时,
用四元数或 'YXZ' 顺序,并把俯仰限制在 ±89°。
顺序会影响结果
同样的三个角度,'XYZ' 与 'YXZ'
得到的姿态完全不同。数据来源不同(建模软件、传感器、GIS 平台)
顺序约定往往不一致,导入前先确认,否则模型会歪。
'YXZ' 是相机与飞行器常用的顺序。
角度用弧度。mesh.rotation.y = 45 不是 45 度,
而是 45 弧度,接近转了七圈多。面板输入的度数先用
THREE.MathUtils.degToRad 转换。
经纬志(2026)。《Euler》。https://www.jingweizhi.com/three/api/euler.html(访问日期 2026-11-03)。