计算机图形学-Transformation
线性变换
齐次坐标
理解:将一个n维的坐标或者向量,使用n+1维来表示。
-
2D-Point = (x,y,1)
-
2D-Vector = ⎣⎡xy0⎦⎤
-
3D-Point = (x,y,z,1)
-
3D-Vector = ⎣⎡xyz0⎦⎤
2D视图变换
缩放变换(Scale)

如图所示:很容易看出,变换后的每个点坐标,都是原坐标的S倍。
x′=Sxy′=Sy
联想矩阵的乘法计算:
[x′y′]=[s00s]⋅[xy]=[s∗x+0∗y0∗x+s∗y]
因此定义缩放矩阵=S。
S=[Sx00Sy]
注意Sx和Sy可以不等,此时会导致变形。
镜像变换(Reflection)
x′y′=−x=y
因此定义缩放矩阵=S。
S=[−1001]
裁剪变换(Shear)

此时:裁剪后的图形:y′=a1x′ (计算的是0到点(a,1)这条线。其他地方要加上原本x的坐标)。 y不变。因此 y=y′
x′y′y′=x+a=x+ay=y
[x′y′]=[10a1]⋅[xy]
因此定义裁剪矩阵=S。
S=[10a1]
旋转变换(Rotate)

x′y′=x∗cos θ+(−y)∗sin θ=y∗sin θ+y∗cos θ
因此定义旋转矩阵=R。
R=[cos θsin θ−sin θcos θ]
推导过程:
先假设矩阵
R=[ACBD]
点p(1,0)旋转后求得:p'=(cosθ,sinθ)。即:
[ACBD]⋅[10]=[cos θsin θ]
推出:A=cosθ,C=sinθ。
同理可推导:
点p(0,1), 旋转后求得:p'=(−sinθ,cosθ)。即:
[cosθsinθBD]⋅[01]=[−sinθcosθ]
推出:B=−sinθ, D=cosθ。
即:
R=[cos θsin θ−sin θcos θ]
复合变换(Composite)
具有顺序性,先平移再旋转的结果不等于先旋转再平移。即:
R45⋅T(1,0)=T(1,0)⋅R45
复合变换矩阵计算:从右向左。
旋转矩阵、缩放矩阵、裁剪矩阵、镜像矩阵总结:
都是线性变换,都可以用矩阵来表示这几种变换。即:
[x′y′]=[acbd]⋅[xy]
即:
x′=ax+byy′=cx+dy
即:x′=Mx
视图变换:以上结果均是基于坐标原点来平移缩放旋转等操作。
实际上:如果不是绕着原点做视图变换:
可以先将 视图变换的 "原点" 平移到坐标原点(0,0)。再做变换,再平移回去。
T(c)⋅R(α)⋅T(−c)
平移变换(Translation)
x′=x+txy′=y+ty
得出:平移变换不是线性变换
[x′y′]=[acbd]⋅[xy]+[txty]
但是我们不想让平移变换成为一种特殊的变换表示,所以我们引入了齐次坐标的概念来解决这个问题,也不是问题吧,就是解决这个特殊存在。
⎣⎡x′y′w′⎦⎤=⎣⎡100010txty1⎦⎤⋅⎣⎡xy1⎦⎤=⎣⎡x+txy+ty1⎦⎤
3D视图变换
平移变换(Translation)
x′y′z′=x+tx=x+ty=z+tz
⎣⎡x′y′z′1⎦⎤=⎣⎡adh0bei0cfj0txtytz1⎦⎤⋅⎣⎡xyz1⎦⎤
类似2D模式下的平移变换因此可求出平移矩阵:
T(tx,ty,tz)=⎣⎡100001000010txtytz1⎦⎤
缩放变换(Scale)
类似2D模式下的缩放变换因此可求出缩放矩阵:
S(sx,sy,sz)=⎣⎡sx0000sy0000sz00001⎦⎤
旋转变换(Rotates)
在三维坐标系下求解过程:
-
我们可以先考虑简单情况:假设只绕x轴渲染 α 度,其他轴不变。

此时:x保持不变。简化成了在z和y平面上的旋转:
很容易写出绕x轴的旋转矩阵:
Rx(α)=⎣⎡10000cosαsinα00−sinαcosα00001⎦⎤
-
假设只绕z轴渲染 α 度,其他轴不变。
同理:z保持不变。简化成了在x和y平面上的旋转:
很容易写出旋转矩阵:
Rz(α)=⎣⎡cosαsinα00−sinαcosα0000100001⎦⎤
-
假设只绕y轴渲染 α 度,其他轴不变。
同理:y保持不变。简化成了在x和z平面上的旋转:
Ry(α)=⎣⎡cosα0−sinα00100sinα0cosα00001⎦⎤
解释:为什么sinα符号变了?
定义规则:我们默认定义
根据右手定则可以判断:
-
绕x轴旋转,此时由 y→z 旋转,大拇指方向指向x轴正方向。符号无异常。
-
绕z轴旋转,同理:即2d模式下的旋转由x→y旋转,大拇指方向指向z轴正方向(屏幕外)。符号无异常。
-
绕y轴旋转:此时由z→x,此时大拇指方向指向y轴正方向。符号无异常。此时需要反过来:即从x→z旋转了−α角度。即:
sin(−α)cos(−α)=−sin(α)=cos(α)
因此:
Ry(α)=⎣⎡cosα0−sinα00100sinα0cosα00001⎦⎤
因此3维的旋转都可以分解成绕着不同轴的旋转的组合:
Rxyz(α,β,γ)=Rx(α)⋅Ry(β)⋅Rz(γ)
todo: 罗德里格旋转公式推导(Rodrigues' rotation formula)
投影变换
正交投影
透视投影
如图所示:

透视投影的推导:
问题简化:先挤压成正视投影,在利用正式投影进行投影。
定义规则:
-
近裁剪面保持不变
-
远裁剪面向内挤压,Z保持不变。
-
f为远裁剪面距离。
-
n为近裁剪面距离。
-
远裁剪面的中心点保持不变。(向内挤压,远裁剪面中心点坐标为 p(0,0,f,1) )。
我们假设沿着X轴负方向观察物体:

远裁剪面上一点:p(x,y,z,1)
经过透视投影M后变成了 p′(x′,y′,z′,1)
Mpersp→ortho⋅⎣⎡xyz1⎦⎤=⎣⎡x′y′z′1⎦⎤
根据相似三角形:
y′=zn⋅y
x′=zn⋅x
代入上式得到:
M⋅⎣⎡xyz1⎦⎤=⎣⎡zn⋅xzn⋅yz′1⎦⎤
根据齐次坐标定义:
在三维中:空间中任意一个点(x,y,z,1), (kx,ky,kz,k!=0), (xz,yz,z2,z!=0) 都表示的是同一个点 (x, y, z)。
因此
Mpersp→ortho⋅⎣⎡xyz1⎦⎤=⎣⎡nxnyz′∗zz⎦⎤
此时很容易得到:
Mpersp→ortho=⎣⎡n0?00n?000?100?0⎦⎤
根据规则定义:
M_{persp\rightarrow ortho}$ 后保持不变。
我们假设M的第三行为:
M(3j)persp→ortho=[ABCD]
近裁剪面有一点为 N(x,y,n,1) 投影后保持不变、
根据齐次坐标:
Mpersp→ortho⋅⎣⎡xyn1⎦⎤=⎣⎡xyn1⎦⎤==⎣⎡nxnyn2n⎦⎤
[ABCD]⋅⎣⎡xyn1⎦⎤=n2
因为n是近裁剪面的距离,n为常数。
因此 Ax+By+Cn+D=n2。
因此 必然:A=0,B=0。
根据规则定义:
- 远裁剪面的中心点保持不变。(向内挤压,远裁剪面中心点坐标为 k(0,0,f,1) )
我们取远裁剪面的中心点为 K(0,0,f,1)
中心点经过投影后也保持不变.K′(0,0,f,1)、
根据齐次坐标:
Mpersp→ortho⋅⎣⎡00f1⎦⎤=⎣⎡00f1⎦⎤==⎣⎡00f2f⎦⎤
[00CD]⋅⎣⎡00f1⎦⎤=f2
联合以上:
Cn+D=n2Cf+D=f2
得出:
CD=n+f=−nf
因此第三行:
M(3j)persp→ortho=[00n+f−nf]
即:
Mpersp→ortho=⎣⎡n0000n0000n+f100−nf0⎦⎤
因此得出:
Mpersp=Mortho⋅Mpersp→ortho