经纬志
首页 / three.js / API 文档

Euler

先看结论

欧拉角。用三个绕轴的角度描述旋转,直觉上最好理解, 但结果依赖旋转顺序,并在特定角度出现万向锁。

最后验证 2026-11-03 · three.js 0.160.0 · 更新 2026-10-29 · 引用本文
new THREE.Euler(x, y, z, order)

构造参数

参数默认说明
x0绕 X 轴角度,弧度
y0绕 Y 轴角度,弧度
z0绕 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)。