正交矩阵
上节课已经知道, 旋转的变换矩阵为
Rθ=[cosθsinθ−sinθcosθ]
当θ为负, 即反向(顺时针)旋转的变换矩阵为
R−θ=[cosθ−sinθsinθcosθ]
可以发现
R−θ=Rθ−1=RθT
即旋转矩阵的逆矩阵等于其转置矩阵, 数学上称这样的矩阵为正交矩阵
3D 旋转
绕轴旋转
绕x 轴
Rx(α)=⎣⎢⎢⎢⎡10000cosαsinα00−sinαcosα00001⎦⎥⎥⎥⎤
绕y轴
Ry(α)=⎣⎢⎢⎢⎡cosα0−sinα00100sinα0cosα00001⎦⎥⎥⎥⎤
注意 z×x=y,x×z=−y, 此处的 sinα 和 −sinα 需要调换
绕z轴
Rz(α)=⎣⎢⎢⎢⎡cosαsinα00−sinαcosα0000100001⎦⎥⎥⎥⎤
绕任意轴旋转
任意旋转可以分解为绕轴旋转的叠加
Rxyz(α,β,γ)=Rx(α)Ry(β)Rz(γ)
给定旋转角度 α 和旋转轴 n
Rn,α=cos(α)I+(1−cos(α))nnT+sin(α)⎣⎢⎡0nz−ny−nz0nxny−nx0⎦⎥⎤
如何定义一个相机?
- 位置 e
- 看的朝向 g^
- 向上的方向 t^
思考
物体和相机做相同的变换后, 得到的结果不变
约定:
相机永远位于原点, 看向-z方向, 向上为y轴
如何从任意坐标转换到约定的相机坐标系?
- 将e平移到相机坐标系的原点
- 将g^旋转到相机坐标系的-z方向
- 将t^旋转到相机坐标系的y方向
- 将g^×t^旋转到x方向
使用矩阵表示, 即:
Mview=RviewTview
其中, Tview 表示平移到原点
Tview=⎣⎢⎢⎢⎡100001000010−xe−ye−ze1⎦⎥⎥⎥⎤
然后旋转; 由于从g到-Z, t到Y, g^×t^ 到 X 较为复杂, 尝试写出它的逆变换:
Rview−1=⎣⎢⎢⎢⎡xg^×t^yg^×t^zg^×t^0xtytzt0x−gy−gz−g00001⎦⎥⎥⎥⎤
又旋转矩阵为正交矩阵, 则:
Rview=⎣⎢⎢⎢⎡xg^×t^xtx−g0yg^×t^yty−g0zg^×t^ztz−g00001⎦⎥⎥⎥⎤
正交投影 Orthographic Projection
定义: 一个立方体, 其左右/上下/前后边界为: [l, r]/[b, t]/ [f, n], 将其映射到 [−1,1]3(被称为canonical cube: 标准立方体) 的立方体上
由于向-z方向看, f和n是相反的
做法: 先平移立方体中心到原点, 再缩放
矩阵表示:
Mortho=⎣⎢⎢⎢⎡r−l20000t−b20000n−f200001⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡100001000010−2r+l−2t+b−2n+f1⎦⎥⎥⎥⎤
透视投影 Perspective Projection
做法: 将一个任意立方体, “挤压” 成一个边垂直的立方体, 然后做正交投影, “挤压”时, 近平面上的点不变
从侧面看
可以得到
⎝⎜⎜⎜⎛xyz1⎠⎟⎟⎟⎞→⎝⎜⎜⎜⎛znxzny?1⎠⎟⎟⎟⎞同时乘z⎝⎜⎜⎜⎛nxny?z⎠⎟⎟⎟⎞
尝试填充变换矩阵
Mpersp→ortho=⎝⎜⎜⎜⎛n0?00n?000?100?0⎠⎟⎟⎟⎞
据观察
- 近平面上的点不变 ⎝⎜⎜⎜⎛xyn1⎠⎟⎟⎟⎞⇒⎝⎜⎜⎜⎛xyn1⎠⎟⎟⎟⎞==⎝⎜⎜⎜⎛nxnyn2n⎠⎟⎟⎟⎞
所以, 第三行 (00AB)⎝⎜⎜⎜⎛xyn1⎠⎟⎟⎟⎞=n2
- 远平面上的 z 不变 ⎝⎜⎜⎜⎛00f1⎠⎟⎟⎟⎞⇒⎝⎜⎜⎜⎛00f1⎠⎟⎟⎟⎞==⎝⎜⎜⎜⎛00f2f⎠⎟⎟⎟⎞
综上
An+B=n2Af+B=f2}→AB=n+f=−nf
最终得到
Mpersp→ortho=⎝⎜⎜⎜⎛n0000n0000n+f100−nf0⎠⎟⎟⎟⎞
系列说明

本系列文章 是 @Lingqi Yan(闫令琪) 教授《现代计算机图形学入门》 视频课程的文字笔记, 方便各位图形学爱好者朋友学习巩固使用
原课程链接: GAMES101: 现代计算机图形学入门
同时, 该教程已上传哔哩哔哩, 链接: GAMES101-现代计算机图形学入门-闫令琪
附
课件源文件: GAMES101_Lecture_04.pdf
哔哩哔哩视频传送门: GAMES101-现代计算机图形学入门-闫令琪