计算机图形学|[Games101] Lecture 03-04 Transformation

Transformation 2D 线性变换

  • 线性变换:变换能够用矩阵乘法得到
可以说,Linear Transformation = Matrices (of the same dimension)
我们将如下所示的简单矩阵乘法定义为对向量( x , y ) T (x, y)^{T} (x,y)T 的线性变换。
[ a 11 a 12 a 21 a 22 ] [ x y ] = [ a 11 x + a 12 y a 21 x + a 22 y ] \left[\begin{array}{ll} a_{11} & a_{12} \\ a_{21} & a_{22} \end{array}\right]\left[\begin{array}{l} x \\ y \end{array}\right]=\left[\begin{array}{l} a_{11} x+a_{12} y \\ a_{21} x+a_{22} y \end{array}\right] [a11?a21??a12?a22??][xy?]=[a11?x+a12?ya21?x+a22?y?]
缩放 (scale) 缩放变换是一种沿着坐标轴作用的变换,定义如下:
scale ? ( s x , s y ) = [ s x 0 0 s y ] \operatorname{scale}\left(s_{x}, s_{y}\right)=\left[\begin{array}{cc} s_{x} & 0 \\ 0 & s_{y} \end{array}\right] scale(sx?,sy?)=[sx?0?0sy??]
即除了( 0 , 0 ) T (0,0)^{T} (0,0)T 保持不变之外,所有的点变为( s x x , s y y ) T \left(s_{x} x, s_{y} y\right)^{T} (sx?x,sy?y)T
剪切 (shearing) shear 变换直观理解就是把物体一边固定,然后拉另外一边,定义如下:
s h e a r ? x ( s ) = [ 1 s 0 1 ] , s h e a r ? y ( s ) = [ 1 0 s 1 ] shear-x(s)=\left[\begin{array}{ll}1 & s \\ 0 & 1\end{array}\right], \\shear-y (s)=\left[\begin{array}{ll}1 & 0 \\ s & 1\end{array}\right] shear?x(s)=[10?s1?],shear?y(s)=[1s?01?]
  • 拉向x x x 轴
计算机图形学|[Games101] Lecture 03-04 Transformation
文章图片

  • 拉向y y y 轴
计算机图形学|[Games101] Lecture 03-04 Transformation
文章图片

旋转 (rotation)
  • 在无特殊说明的情况下,默认关于( 0 , 0 ) (0,0) (0,0) 点,逆时针方向旋转θ \theta θ 角度(弧度)的公式如下
R θ = [ cos ? θ ? sin ? θ sin ? θ cos ? θ ] \mathbf{R}_{\theta}=\left[\begin{array}{cc} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{array}\right] Rθ?=[cosθsinθ??sinθcosθ?]
推导如下

齐次坐标
  • 以上的线性变换矩阵不能描述平移变换,为了统一平移变换和线性变换(以上三种变换),引入平移变换
定义 2D 坐标和 2D向量如下
  • 2D 坐标: ( x , y , 1 ) T (x,y,1)^T (x,y,1)T
  • 2D 向量: ( x , y , 0 ) T (x,y,0)^T (x,y,0)T
    • 由于向量具有平移不变性,第3维的0保护了向量不会因为平移而改变
齐次坐标下向量和点的操作
  • vector + vector = vector
  • point – point = vector
  • point + vector = point (一个点沿着向量移动)
  • point + point = 两个点的中点
此外,当第三维为w ( w ≠ 0 ) w(w\ne 0) w(w=0)时,定义
( x y w )is the2 Dpoint( x / w y / w 1 ) , w ≠ 0 \left(\begin{array}{c} x \\ y \\ w \end{array}\right) \text { is the } 2 \mathrm{D} \text { point }\left(\begin{array}{c} x / w \\ y / w \\ 1 \end{array}\right), w \neq 0 ? ??xyw?? ?? is the 2D point ? ??x/wy/w1?? ??,w=0
仿射变换
  • 仿射变换使用一个矩阵统一了所有操作
  • 先应用线性变换再应用平移变换
计算机图形学|[Games101] Lecture 03-04 Transformation
文章图片
仿射变换下 2D 变换的描述
Scale S ( s x , s y ) = ( s x 0 0 0 s y 0 0 0 1 ) \mathbf{S}\left(s_{x}, s_{y}\right)=\left(\begin{array}{ccc} s_{x} & 0 & 0 \\ 0 & s_{y} & 0 \\ 0 & 0 & 1 \end{array}\right) S(sx?,sy?)=? ??sx?00?0sy?0?001?? ??
Rotation R ( α ) = ( cos ? α ? sin ? α 0 sin ? α cos ? α 0 0 0 1 ) \mathbf{R}(\alpha)=\left(\begin{array}{ccc} \cos \alpha & -\sin \alpha & 0 \\ \sin \alpha & \cos \alpha & 0 \\ 0 & 0 & 1 \end{array}\right) R(α)=? ??cosαsinα0??sinαcosα0?001?? ??
Translation T ( t x , t y ) = ( 1 0 t x 0 1 t y 0 0 1 ) \mathbf{T}\left(t_{x}, t_{y}\right)=\left(\begin{array}{ccc} 1 & 0 & t_{x} \\ 0 & 1 & t_{y} \\ 0 & 0 & 1 \end{array}\right) T(tx?,ty?)=? ??100?010?tx?ty?1?? ??
逆变换
  • 使用逆矩阵
  • M ? 1 \mathbf{M}^{-1} M?1 is the inverse of transformM \mathbf{M} M in both a matrix and geometric sense
计算机图形学|[Games101] Lecture 03-04 Transformation
文章图片
复合变换
  • 复杂变换可由简单变换得到
  • 变换的顺序非常重要,如先旋转再平移和先平移再旋转得到的结果不同
  • 矩阵变换不满足交换律
  • 计算是右结合的
3D 线性变换 再次使用齐次坐标描述
  • 3D point= ( x , y , z , 1 ) T =(x, y, z, 1)^{T} =(x,y,z,1)T
  • 3D vector= ( x , y , z , 0 ) T =(x, y, z, 0)^{T} =(x,y,z,0)T
  • In general,( x , y , z , w ) ( w ≠ 0 ) (x, y, z, w)(w \ne0) (x,y,z,w)(w=0) is the 3D point:( x / w , y / w , z / w ) (x / w, y / w, z / w) (x/w,y/w,z/w)
    • e.g.( 1 , 0 , 0 , 1 ) (1, 0, 0, 1) (1,0,0,1) and( 2 , 0 , 0 , 2 ) (2, 0, 0, 2) (2,0,0,2) both represent( 1 , 0 , 0 ) (1, 0, 0) (1,0,0)
  • 先应用线性变换再应用平移变换
Use4 × 4 4 \times 4 4×4 matrices for affine transformations
( x ′ y ′ z ′ 1 ) = ( a b c t x d e f t y g h i t z 0 0 0 1 ) ? ( x y z 1 ) \left(\begin{array}{l} x^{\prime} \\ y^{\prime} \\ z^{\prime} \\ 1 \end{array}\right)=\left(\begin{array}{lllc} a & b & c & t_{x} \\ d & e & f & t_{y} \\ g & h & i & t_{z} \\ 0 & 0 & 0 & 1 \end{array}\right) \cdot\left(\begin{array}{l} x \\ y \\ z \\ 1 \end{array}\right) ? ??x′y′z′1?? ??=? ??adg0?beh0?cfi0?tx?ty?tz?1?? ???? ??xyz1?? ??
Scale
S ( s x , s y , s z ) = ( s x 0 0 0 0 s y 0 0 0 0 s z 0 0 0 0 1 ) \mathbf{S}\left(s_{x}, s_{y}, s_{z}\right)=\left(\begin{array}{cccc} s_{x} & 0 & 0 & 0 \\ 0 & s_{y} & 0 & 0 \\ 0 & 0 & s_{z} & 0 \\ 0 & 0 & 0 & 1 \end{array}\right) S(sx?,sy?,sz?)=? ??sx?000?0sy?00?00sz?0?0001?? ??
Translation
T ( t x , t y , t z ) = ( 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ) \mathbf{T}\left(t_{x}, t_{y}, t_{z}\right)=\left(\begin{array}{cccc} 1 & 0 & 0 & t_{x} \\ 0 & 1 & 0 & t_{y} \\ 0 & 0 & 1 & t_{z} \\ 0 & 0 & 0 & 1 \end{array}\right) T(tx?,ty?,tz?)=? ??1000?0100?0010?tx?ty?tz?1?? ??
? Rotation
  • aroundx ? , y ? x-, y- x?,y?, orz z z-axis
  • sin ? α \sin \alpha sinα 的正负号由右手定则确定,顺序是x → z x\to z x→z
    计算机图形学|[Games101] Lecture 03-04 Transformation
    文章图片
R x ( α ) = ( 1 0 0 0 0 cos ? α ? sin ? α 0 0 sin ? α cos ? α 0 0 0 0 1 ) R y ( α ) = ( cos ? α 0 sin ? α 0 0 1 0 0 ? sin ? α 0 cos ? α 0 0 0 0 1 ) R z ( α ) = ( cos ? α ? sin ? α 0 0 sin ? α cos ? α 0 0 0 0 1 0 0 0 0 1 ) \begin{aligned} \mathbf{R}_{x}(\alpha) &=\left(\begin{array}{cccc} 1 & 0 & 0 & 0 \\ 0 & \cos \alpha & -\sin \alpha & 0 \\ 0 & \sin \alpha & \cos \alpha & 0 \\ 0 & 0 & 0 & 1 \end{array}\right) \\ \mathbf{R}_{y}(\alpha) &=\left(\begin{array}{cccc} \cos \alpha & 0 & \sin \alpha & 0 \\ 0 & 1 & 0 & 0 \\ -\sin \alpha & 0 & \cos \alpha & 0 \\ 0 & 0 & 0 & 1 \end{array}\right) \\ \mathbf{R}_{z}(\alpha) &=\left(\begin{array}{cccc} \cos \alpha & -\sin \alpha & 0 & 0 \\ \sin \alpha & \cos \alpha & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array}\right) \end{aligned} Rx?(α)Ry?(α)Rz?(α)?=? ??1000?0cosαsinα0?0?sinαcosα0?0001?? ??=? ??cosα0?sinα0?0100?sinα0cosα0?0001?? ??=? ??cosαsinα00??sinαcosα00?0010?0001?? ???
  • 所有的 3D 变换都可以被描述为在x , y , z x,y,z x,y,z 轴上的旋转
    • 也叫欧拉角
    • Often used in flight simulators: roll, pitch, yaw
R x y z ( α , β , γ ) = R x ( α ) R y ( β ) R z ( γ ) \mathbf{R}_{x y z}(\alpha, \beta, \gamma)=\mathbf{R}_{x}(\alpha) \mathbf{R}_{y}(\beta) \mathbf{R}_{z}(\gamma) Rxyz?(α,β,γ)=Rx?(α)Ry?(β)Rz?(γ)
Rodrigues’ Rotation Formula
Rotation by angleα \alpha α around axisn n n
R ( n , α ) = cos ? ( α ) I + ( 1 ? cos ? ( α ) ) n n T + sin ? ( α ) ( 0 ? n z n y n z 0 ? n x ? n y n x 0 ) ? N \mathbf{R}(\mathbf{n}, \alpha)=\cos (\alpha) \mathbf{I}+(1-\cos (\alpha)) \mathbf{n} \mathbf{n}^{T}+\sin (\alpha) \underbrace{\left(\begin{array}{ccc} 0 & -n_{z} & n_{y} \\ n_{z} & 0 & -n_{x} \\ -n_{y} & n_{x} & 0 \end{array}\right)}_{\mathbf{N}} R(n,α)=cos(α)I+(1?cos(α))nnT+sin(α)N? ??0nz??ny???nz?0nx??ny??nx?0?? ????
View / Camera Transformation Think about how to take a photo
  • Find a good place and arrange people (model transformation)
  • Find a good “angle” to put the camera (view transformation)
  • Cheese! (projection transformation 将三维空间投影到二维视图上)
Projection transformation Orthographic projection
正则投影的步骤 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fx3Pqwmp-1660291810051)(https://cdn.jsdelivr.net/gh/QiuHong-1202/FigureBed/2021/202208071729657.png)]
正则立方体
  • map a cuboid[ l , r ] × [ b , t ] × [ f , n ] [l, r] \times [b, t] \times [f, n] [l,r]×[b,t]×[f,n] to the “canonical (正则、规范、标准)” cube[ ? 1 , 1 ] 3 [-1, 1]^3 [?1,1]3
    • 因为是朝着z z z 轴负方向看,所以坐标小的是更远的f f f ,坐标大的是更近的n n n
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZTM6RjtF-1660291810052)(https://cdn.jsdelivr.net/gh/QiuHong-1202/FigureBed/2021/202208071733145.png)]
正则投影的变换矩阵 Translate (center to origin) first, then scale (length/width/height to 2)
M ortho= [ 2 r ? l 0 0 0 0 2 t ? b 0 0 0 0 2 n ? f 0 0 0 0 1 ] [ 1 0 0 ? r + l 2 0 1 0 ? t + b 2 0 0 1 ? n + f 2 0 0 0 1 ] M_{\text {ortho }}=\left[\begin{array}{cccc} \frac{2}{r-l} & 0 & 0 & 0 \\ 0 & \frac{2}{t-b} & 0 & 0 \\ 0 & 0 & \frac{2}{n-f} & 0 \\ 0 & 0 & 0 & 1 \end{array}\right]\left[\begin{array}{cccc} 1 & 0 & 0 & -\frac{r+l}{2} \\ 0 & 1 & 0 & -\frac{t+b}{2} \\ 0 & 0 & 1 & -\frac{n+f}{2} \\ 0 & 0 & 0 & 1 \end{array}\right] Mortho ?=? ??r?l2?000?0t?b2?00?00n?f2?0?0001?? ??? ??1000?0100?0010??2r+l??2t+b??2n+f?1?? ??
Perspective projection
透视投影的步骤
  • First “squish” the frustum into a cuboid( n → n , f → f ) ( M p e r s p → o r t h o ) (n \to n, f \to f) (M_{persp\to ortho}) (n→n,f→f)(Mpersp→ortho?) (将远平面挤压为与近平面相同的大小)
    • 挤压规则
      • 近平面永远不变,任何点在近平面上不变
      • 远平面z z z 值不变,任何远平面上的点z z z 值不变
      • 远平面的中心不变
  • Do orthographic projection ( M o r t h o M_{ortho} Mortho?) (做正则投影)
计算机图形学|[Games101] Lecture 03-04 Transformation
文章图片
透视投影的变换矩阵推导 计算机图形学二:视图变换(坐标系转化,正交投影,透视投影,视口变换)
透视投影的变换矩阵 M per= M orthoM persp→ortho\mathrm{M}_{\text {per }}=\mathrm{M}_{\text {ortho }} \mathrm{M}_{\text {persp } \rightarrow\text { ortho }} Mper ?=Mortho ?Mpersp → ortho ?
【计算机图形学|[Games101] Lecture 03-04 Transformation】 M per= [ 2 r ? l 0 0 0 0 2 t ? b 0 0 0 0 2 n ? f 0 0 0 0 1 ] [ 1 0 0 ? r + l 2 0 1 0 ? t + b 2 0 0 1 ? n + f 2 0 0 0 1 ] [ n 0 0 0 0 n 0 0 0 0 n + f ? f n 0 0 1 0 ] \mathrm{M}_{\text {per }}=\left[\begin{array}{cccc} \frac{2}{r-l} & 0 & 0 & 0 \\ 0 & \frac{2}{t-b} & 0 & 0 \\ 0 & 0 & \frac{2}{n-f} & 0 \\ 0 & 0 & 0 & 1 \end{array}\right]\left[\begin{array}{cccc} 1 & 0 & 0 & -\frac{r+l}{2} \\ 0 & 1 & 0 & -\frac{t+b}{2} \\ 0 & 0 & 1 & -\frac{n+f}{2} \\ 0 & 0 & 0 & 1 \end{array}\right] \left[\begin{array}{cccc} n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ 0 & 0 & n+f & -f n \\ 0 & 0 & 1 & 0 \end{array}\right] Mper ?=? ??r?l2?000?0t?b2?00?00n?f2?0?0001?? ??? ??1000?0100?0010??2r+l??2t+b??2n+f?1?? ??? ??n000?0n00?00n+f1?00?fn0?? ??

    推荐阅读