跳到主要内容
腾讯题库 · Q30
先读 30 秒回答

第 30 题 / 50

学习状态 未开始

Quaternion 旋转

面试官问

PDF 第 64 页

请推导四元数(Quaternion)绕任意轴旋转的公式,并说明为何游戏引擎优先使用四元数而非欧拉角?(常问题,理清逻辑)

数学基础 quaternion · rotation 对应课程:transform-math

先把问题答上

你可以直接这样回答

约 30 秒

绕单位轴 a、角度 θ 的四元数可写成 (a sin(θ/2), cos(θ/2)),向量通过 q(v,0)q⁻¹ 旋转。引擎偏好它是因为组合和插值稳定、避免欧拉角万向节锁;实现仍需归一化、明确乘法顺序和坐标系。

这道题真正想听什么?

先确认比较对象和回答边界,再决定要不要展开公式、工程实现或性能取舍。

考的是约束和使用边界:单位轴 a、半角 θ/2、四元数长度、乘法顺序、插值和坐标系。四元数不是“更高级的欧拉角”,它用四个数表达旋转,避免欧拉角组合时的万向节锁,但仍然要归一化和明确左右乘。

把答案讲到 2 分钟面试必答 · 约 2 分钟 · 补足因果、输入和取舍

我会先确认左/右手、局部/世界和旋转顺序,再用单位四元数表达骨骼/物体姿态。动画插值用 slerp 或合适近似,网络传输可压缩但要恢复单位长度。验证包含长度、正交基底、极端角度和父子层级。

面试官可能继续追问什么?补充自测 · 约 3 分钟 · 检查自己是不是真的懂了
  • 问:为什么是半角? 答:四元数共轭乘法会让轴角效果出现两次,所以构造时使用半角。
  • 问:四元数会不会也出问题? 答:会,未归一化、插值路径、坐标系或乘法顺序错都可能产生漂移。
  • 因果链: 轴/角 → q 构造 → qv q⁻¹ → 基底/向量 → 动画稳定性。
如果概念还是悬空,就去做实验关键证据 · 约 5–15 分钟 · 预测 → 单变量 → 观察

实验不是第二份答案,它只负责证明答案

如果上面的解释已经听懂,可以直接跳过。卡住时,再沿着这三步把抽象词变成画面证据。

  1. 先猜 先把变量画成箭头、角度或范围:它变大时,画面应该怎样变化?
  2. 去取证 固定其他条件,只改一个参数。先写下变化,不用“更真实”“更高级”这种空词代替证据。
  3. 再追问为什么 是哪一步造成这个结果?如果结果相反,先检查输入、空间、算法,还是显示输出?
我完全没头绪,给我一个起点

先截下默认状态,只动页面当前开放的那个参数。你只需要说清楚“原来怎样 → 改了什么 → 现在怎样”。

1. 先预测

打开 Transform Math Lab,选 scene=quaterniondebugMode=basisaxis=yangleDeg=70。先预测:改变角度只转方向,不应改变向量长度;换轴会改变基向量响应。输入 → 变化 → 输出: 轴角 → 单位四元数旋转 → 向量/基底方向、长度和插值稳定性。

公式的口语翻译:

q = (axis * sin(angle / 2), cos(angle / 2))
v' = q * (v, 0) * inverse(q)

前一行把“绕哪根轴转多少”装进四元数,后一行把向量夹在 q 和逆之间;你不必死背展开式,但要知道逆、乘法顺序和单位长度的作用。

老师追问

先别急着查答案: 先把每个符号翻译成方向、长度、夹角或范围:变量变大时,哪个边界会先被碰到?

为什么: 你刚才的预测依赖哪个前提?如果把“Quaternion 旋转”里最关键的变量或约束关掉,画面/输出会先坏在哪里?

如果结果相反: 先排除哪一层,再谈结论?这个规则的边界是什么?

2. 再动手

固定 axis=y,只改 angleDeg=0/70/140;再固定角度换 axis=x/z,切 basis/final,记录单位长度和基底箭头。读 Quaternion,把“欧拉角输入、四元数内部、最终矩阵”画成三步。

3. 最后对证据

角度变化时基底转动、长度基本保持;不同轴改变方向响应。这个 Lab 用二维/教学向量解释旋转,不代表引擎所有 handedness 和动画插值实现;真实项目还要测 slerp、父子层级、网络压缩和长时间归一化。

答案在代码哪里发生?实现定位 · 约 3 分钟 · 变量、函数和关键行
完整 5 分钟版本面试扩展 · 约 5 分钟 · 项目边界、验证与降级

生产中会记录 quaternion 版本、坐标约定和归一化策略,避免导入/DCC 互相翻转。低端设备不会因为四元数“免费”而忽略骨骼数量、矩阵上传和动画更新;性能与质量仍要 profile。没有真实引擎代码时,我会把公式和可观察证据分开说。

哪些说法最容易答歪?必看陷阱 · 约 1 分钟 · 面试前最后检查
  • 忘记半角或把轴当成未归一化向量。
  • 把乘法顺序当成可交换。
  • 认为四元数自动解决 handedness/父子空间。
  • 长时间积分不归一化导致漂移。