学习目标
你要能够解释什么
能解释局部到世界到观察到裁剪的变换链,并定位常见的 handedness 与顺序错误。
Interview evidence
题库练习
把这一节课的画面证据,接回 PDF 里的原题。先做一个小预测,再去题目页整理成自己的回答。
-
Quaternion 旋转
先自己猜:这道题在考什么?
参考答案:绕单位轴 a、角度 θ 的四元数可写成 (a sin(θ/2), cos(θ/2)),向量通过 q(v,0)q⁻¹ 旋转。引擎偏好它是因为组合和插值稳定、避免欧拉角万向节锁;实现仍需归一化、明确乘法顺序和坐标系。
可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。
-
向量夹角与精度
先自己猜:这道题在考什么?
参考答案:两向量夹角先归一化,再用 acos(clamp(dot(a,b),-1,1));若只是阈值,直接比较 dot 更便宜。Shader 精度问题先查空间、长度、范围和非法输入,再做 clamp/重排/精度选择,并用目标设备复测。
可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。
-
齐次坐标
先自己猜:这道题在考什么?
参考答案:齐次坐标用第四维 w 把仿射变换和投影统一到矩阵乘法:点通常 w=1,会受到平移;方向 w=0,不应被平移;clip 后再除以 w 得 NDC。法线要用逆转置并归一化。
可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。
-
Skinning 权重
先自己猜:这道题在考什么?
参考答案:顶点先由 inverse bind 从模型姿态回到骨骼局部,再乘当前骨骼矩阵,按归一化权重混合,最后乘 model/world。检查权重和、bind pose、矩阵空间和法线;权重 0.35 到 0.8 的变化应可在实验中观察。
可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。
-
Bezier 曲线
先自己猜:这道题在考什么?
参考答案:三次 Bezier 用四个控制点和 t∈[0,1] 插值位置/切线;t 不等于距离,所以需要弧长采样来做匀速。编辑器工具要有控制点约束、Undo、序列化和运行时一致性。
可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。
-
IK 校正
先自己猜:这道题在考什么?
参考答案:我先检查目标可达域、骨骼长度/轴向、pole、关节限位、bind pose 和空间,再调迭代。不可达时保留约束并显示误差,自动脚本输出修正建议和回滚,不把扭曲的末端硬贴到目标。
可观察证据:只改一个参数,记下画面变化,再写一句“所以它说明了什么”。
实验循环
按顺序做一次实验
-
Step 1
只做局部变换
- 改什么
- TRS = local
- 怎么做
- 固定父节点,分别调整位置、旋转、缩放。
- 你会看到
- 局部坐标中的轴与对象一起移动。
- 它代表
- 局部空间描述资产本身,不能直接当作世界位置。
Code anchor · transform-math · local matrix
-
Step 2
叠加父子层级
- 改什么
- Parent rotation / scale
- 怎么做
- 先旋转父节点,再改变子节点位置。
- 你会看到
- 子节点沿父节点的基底移动,缩放也会传递。
- 它代表
- 矩阵乘法顺序编码了层级语义。
Code anchor · transform-math · compose
-
Step 3
比较插值方法
- 改什么
- Euler / Quaternion / Matrix
- 怎么做
- 在同一时间轴上比较三种插值。
- 你会看到
- 欧拉角可能产生万向节锁,四元数更平滑。
- 它代表
- 表示方式会影响动画路径,不只是存储格式。
Code anchor · transform-math · interpolation
快速复习
用三分钟找回因果链
这里没有第二套答案。以下内容直接来自上面的课程事实,方便你在面试前快速检索。
一句话核心
把平移、旋转、缩放和层级分别打开,观察矩阵乘法顺序如何改变结果。
- 局部空间描述资产本身,不能直接当作世界位置。
画面证据:局部坐标中的轴与对象一起移动。
- 矩阵乘法顺序编码了层级语义。
画面证据:子节点沿父节点的基底移动,缩放也会传递。
- 表示方式会影响动画路径,不只是存储格式。
画面证据:欧拉角可能产生万向节锁,四元数更平滑。
代码定位
- transform-math · local matrix
- transform-math · compose
- transform-math · interpolation