补充
对于旋转矩阵
Rθ=(cosθsinθ−sinθcosθ)
R−θ=(cosθ−sinθsinθcosθ)=RθT
R−θ=Rθ−1
如果一个矩阵的逆等于其转置,我们这个矩阵为正交矩阵。
3D变换

3维旋转矩阵有3个矩阵,分别绕x轴,y轴,z轴旋转。由于我们采用的是右手系,因此旋转是有定向的,正如在二维中,是x轴向y轴旋转,对应到3维中便是绕z轴旋转(x轴转向y轴),绕x轴旋转(y转向z),绕y轴旋转(z转向x)。
Rx(α)=⎝⎛10000cosαsinα00−sinαcosα00001⎠⎞
绕x轴旋转,故x不变,且y转向z
Ry(α)=⎝⎛cosα0−sinα00100sinα0cosα00001⎠⎞
绕y轴旋转,故y不变,因为是z转向x,所以此处需要求逆
Rz(α)=⎝⎛cosαsinα00−sinαcosα0000100001⎠⎞
绕z轴旋转,故z不变,x转向y
绕任意轴旋转
绕任意轴旋转,首先将该轴旋转到任意的x, y, z轴上,然后可以应用基本的旋转矩阵,最后再逆旋转回来即可
R1RxR1T×(x,y,z)T
这里Rx的求法,从上面的解释可以得到,问题是如何求R1,设想我们围绕旋转的轴为u,R1便是将u转到x的矩阵。具体来说,这里需要以u为一轴,构造一个3维正交坐标系,然后将u-x对齐,其他两轴和y,z对齐。
构造如下,任取一t方向不与u重合。
w=t×uv=u×w
此时,u, w, v便是我们构造出来的新坐标。注,这里是用叉乘。
如何将新坐标和原始坐标系重合呢?取R1=(u,w,v),该旋转矩阵的含义便是将x, y, z旋转到u, w, v的旋转矩阵。因此
⎣⎡xuyuzuxvyvzvxwywzw⎦⎤⎣⎡1000cosαsinα0−sinαcosα⎦⎤⎣⎡xuxvxwyuyvywzuzvzw⎦⎤
罗德里格旋转公式
引用 zhuanlan.zhihu.com/p/451579313
一个向量绕旋转轴旋转给定角度以后得到新向量的计算公式。
⎣⎡xayaza⎦⎤×⎣⎡xbybzb⎦⎤=⎣⎡0za−ya−za0xaya−xa0⎦⎤⎣⎡xbybzb⎦⎤
a×(b×c)=(a⋅c)b−(a⋅b)c

问题描述如下,已知 v 是三维空间中一向量,k 是与转轴同向的单位向量,θ 是 v 绕 k 的右手(逆时针)方向旋转经过的角度,求旋转后向量 vrot。
将 v 分为与 k 垂直的分量 v⊥ 和平行的分量 v//,有 v=v⊥+v//。
v//=(k⋅v)⋅k
v⊥=v−v//=(k⋅k)⋅v−(k⋅v)⋅k=−k×(k×v)
从图中可以看出几何关系
vrot//=v//
现在只要求出 vrot⊥ 就能求出 vrot 了。
由于∣∣vrot⊥∣∣=∣∣v⊥∣∣,可以得到如下公式。
vrot⊥=∣∣v⊥∣∣v⊥⋅∣∣v⊥∣∣cos(θ)+∣∣k×v∣∣k×v⋅∣∣k×v∣∣sin(θ)
vrot⊥=v⊥⋅cos(θ)+k×v⋅sin(θ)
注意这里 k×v 的标量和 v⊥ 是相等的。
综上可得
vrot=vrot//+vrot⊥
vrot=v//+v⊥⋅cos(θ)+k×v⋅sin(θ)=v//+(v−v//)⋅cos(θ)+k×v⋅sin(θ)=cos(θ)⋅v+(1−cos(θ))⋅v//+k×v⋅sin(θ)=cos(θ)⋅v+(1−cos(θ))⋅(k⋅v)⋅k+k×v⋅sin(θ)
根据公式可得
vrot=v+(1−cos(θ))⋅k×(k×v)+k×v⋅sin(θ)
vrot=v+(1−cos(θ))⋅Rk2⋅v+Rk⋅v⋅sin(θ)=[I+(1−cos(θ))⋅Rk2+Rk⋅sin(θ)]⋅v
M=I+(1−cos(θ))⋅Rk2+Rk⋅sin(θ)vrot=M⋅v
视图变换(Viewing/Camera transformation)
什么是视图变换
用拍照来比喻一下:
- 找一个好位置,安排模特(model transformation)
- 找一个好的角度,摆放相机(view transformation)
- 拍照! (projection transformation)
如何视图变换
首先定义相机:
- Position e
- Look-at / gaze direction g^
- Up direction t^

如果相机和物体一起变换,那么相对不变。

所以,我们规定将相机放在原点,up在Y轴,看向-z方向

这样做的原因是,以后有很多操作会非常方便。
那么如何求变换矩阵Mview?
- 将e平移到原点
- 旋转g到-Z
- 旋转t到Y
- 旋转(g×t)到X

Mview=RviewTview
首先
Tview=⎣⎡100001000010−xe−ye−ze1⎦⎤
旋转g到-Z,t到Y,g×t到X。
反向考虑一下,X到(g×t),Y到t,Z到-g。

投影变换(Projection transformation)
- 投影的目的是将3D映射为2D
- 正交投影(orthographic projection)
- 透视投影(perspective projection)

对于正交投影,3D中平行的线,投影之后还是平行。而透视投影则不是。

正交投影
- 相机位于原点,朝向-Z,up位于Y
- 丢弃Z轴
- 平移并且缩放结果在一个矩形中[−1,1]2

更常规得看,我们是将一个立方体[l,r]×[b,t]×[f,n]映射到一个(正则,规范、标准)的立方体[−1,1]3

变换矩阵
先平移,再缩放
Mortho=⎣⎡r−l20000t−b20000n−f200001⎦⎤⎣⎡100001000010−2r+l−2t+b−2n+f1⎦⎤
这里可能会有人有疑问,为什么要压缩到一个小立方体呢?其实是为了之后计算方便,在转换到屏幕坐标的时候就会重新拉伸回来,不必太纠结。
透视投影(Perspective Projection)

在齐次坐标系中
- (x, y, z, 1), (kx, ky, kz, k!=0), (xz, yz, z2, z!=0),在3D中都表示相同的点(x, y, z)
- (1, 0, 0, 1)和(2, 0, 0, 2)都表示(1, 0, 0)
如何完成投影变换
- 首先,把截锥压成一个长方体(n->n, f->f)(Mpersp−>ortho)
- 做正交投影(Mortho)

第一步的关键因素是,发现变换点(x′, y′, z′)和原始点(x, y, z)之间的关系

很明显,根据相似三角形公式,可以得到如下的结论:

而由这个公式,我们可以推出以下矩阵:

目前,我们还无法得知第三行是什么,不过,通过观察可以发现:
- 近平面中任何点是不会改变的

第三行必须是(0 0 A B),其中A和B是未知的

- 远平面中任何点的z值是不会改变的

从上面,可以推出两个方程:
An+B=n2Af+B=f2
解得:
A=n+fB=−nf
最后
Mpersp=MorthoMpersp−>ortho
闫令琪 <<现代计算机图形学>>,blog.csdn.net/qq_38065509…