图形学笔记 - 1. 变换Transformation

模型变换
视图变换

2D变换

缩放scale

( x ′ y ′ ) = ( s x 0 0 s y ) ( x y ) \begin{pmatrix} x' \\ y' \\ \end{pmatrix}= \begin{pmatrix} s_x & 0 \\ 0 & s_y \\ \end{pmatrix}\begin{pmatrix} x\\ y \\ \end{pmatrix} (xy)=(sx00sy)(xy)

反射Reflection

( x ′ y ′ ) = ( − 1 0 0 1 ) ( x y ) \begin{pmatrix} x' \\ y' \\ \end{pmatrix}= \begin{pmatrix} -1 & 0 \\ 0 & 1 \\ \end{pmatrix}\begin{pmatrix} x\\ y \\ \end{pmatrix} (xy)=(1001)(xy)

切变Shear

( x ′ y ′ ) = ( 1 a 0 1 ) ( x y ) \begin{pmatrix} x' \\ y' \\ \end{pmatrix}= \begin{pmatrix} 1 & a \\ 0 & 1 \\ \end{pmatrix}\begin{pmatrix} x\\ y \\ \end{pmatrix} (xy)=(10a1)(xy)
在这里插入图片描述

旋转Rotation

默认绕原点,逆时针旋转。
( x ′ y ′ ) = ( cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ) ( x y ) \begin{pmatrix} x' \\ y' \\ \end{pmatrix}= \begin{pmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \\ \end{pmatrix}\begin{pmatrix} x\\ y \\ \end{pmatrix} (xy)=(cosθsinθsinθcosθ)(xy)

线型变换

( x ′ y ′ ) = ( a b c d ) ( x y ) \begin{pmatrix} x' \\ y' \\ \end{pmatrix}= \begin{pmatrix} a & b \\ c & d \\ \end{pmatrix}\begin{pmatrix} x\\ y \\ \end{pmatrix} (xy)=(acbd)(xy)
x ′ = M x x'=Mx x=Mx

齐次坐标

平移变换

x ′ = x + t x ,   y ′ = x + t y x'=x+t_x,\ \\ y'=x+t_y x=x+tx, y=x+ty
不能写成矩阵乘法形式 –仿射变换Affine
( x ′ y ′ ) = ( a b c d ) ( x y ) + ( t x t y ) \begin{pmatrix} x' \\ y' \\ \end{pmatrix}= \begin{pmatrix} a & b \\ c & d \\ \end{pmatrix}\begin{pmatrix} x\\ y \\ \end{pmatrix} + \begin{pmatrix} t_x\\ t_y \\ \end{pmatrix} (xy)=(acbd)(xy)+(txty)
平移不是线性变换。那么能不能统一起来?
算法中trade-off

齐次坐标

二维点 ( x , y , 1 ) T (x,y,1)^T (x,y,1)T
二维向量 ( x , y , 0 ) T (x,y,0)^T (x,y,0)T ,向量表示方向,平移不变性
齐次坐标:
( x ′ y ′ w ′ ) = ( 1 0 t x 0 1 t y 0 0 1 ) ( x y 1 ) = ( x + t x y + t y 1 ) \begin{pmatrix} x' \\ y' \\ w' \end{pmatrix}= \begin{pmatrix} 1 & 0 & t_x\\ 0 & 1 & t_y\\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} x\\ y \\ 1 \end{pmatrix} = \begin{pmatrix} x+t_x \\ y+t_y \\ 1 \end{pmatrix} xyw = 100010txty1 xy1 = x+txy+ty1
w左边为1或0为有效运算:

  • 向量+向量=向量
  • 点 - 点 = 向量
  • 点 + 向量 = 点, 点移动
  • 点 + 点 =??两个点的中点
    ( x , y , w ) (x,y,w) (x,y,w)是二维点 ( x / w , y / w . 1 ) , w ≠ 0 (x/w,y/w.1), w\ne 0 (x/w,y/w.1),w=0

齐次坐标下仿射变换
( x ′ y ′ 1 ) = ( a b t x c d t y 0 0 1 ) ( x y 1 ) = ( x + t x y + t y 1 ) \begin{pmatrix} x' \\ y' \\ 1 \end{pmatrix}= \begin{pmatrix} a & b & t_x\\ c & d & t_y\\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} x\\ y \\ 1 \end{pmatrix} = \begin{pmatrix} x+t_x \\ y+t_y \\ 1 \end{pmatrix} xy1 = ac0bd0txty1 xy1 = x+txy+ty1
变换矩阵理论上只需存储六个值

逆变换

矩阵的逆

组合变换

变换顺序很重要

推广到多个变换

如何绕一个给定点 c c c旋转
1.平移中心到原点 2. 旋转 3. 平移到原位置
在这里插入图片描述

T ( c ) ⋅ R ( α ) ⋅ T ( − c ) T(c)\cdot R(\alpha)\cdot T(-c) T(c)R(α)T(c)

3D变换

三维点 ( x , y , z , 1 ) T (x,y,z,1)^T (x,y,z,1)T
三维向量 ( x , y , z , 0 ) T (x,y,z,0)^T (x,y,z,0)T
仿射变换
( x ′ y ′ z ′ 1 ) = ( a b c t x c d f t y g h i t z 0 0 0 1 ) ( x y z 1 ) \begin{pmatrix} x' \\ y' \\ z'\\ 1 \end{pmatrix}= \begin{pmatrix} a & b & c&t_x\\ c & d & f&t_y\\ g & h & i & t_z\\ 0 & 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} x\\ y \\ z\\ 1 \end{pmatrix} xyz1 = acg0bdh0cfi0txtytz1 xyz1
先线性变换再平移

R θ = ( cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ) R_\theta = \begin{pmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \\ \end{pmatrix} Rθ=(cosθsinθsinθcosθ)
R − θ = ( cos ⁡ θ sin ⁡ θ − sin ⁡ θ cos ⁡ θ ) R_{-\theta}=\begin{pmatrix} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \\ \end{pmatrix} Rθ=(cosθsinθsinθcosθ)
R − θ = R θ T R_{-\theta} = R_\theta^T Rθ=RθT, R − θ = R θ − 1 R_{-\theta}=R_\theta^{-1} Rθ=Rθ1

旋转

绕x,y,z轴
在这里插入图片描述

R x ( θ ) = ( 1 0 0 0 0 cos ⁡ θ − sin ⁡ θ 0 0 sin ⁡ θ cos ⁡ θ 0 0 0 0 1 ) R_x(\theta)=\begin{pmatrix} 1&0&0&0\\ 0&\cos\theta & -\sin\theta &0\\ 0&\sin\theta & \cos\theta &0\\ 0&0&0&1 \end{pmatrix} Rx(θ)= 10000cosθsinθ00sinθcosθ00001

R y ( θ ) = ( cos ⁡ θ 0 sin ⁡ θ 0 0 1 0 0 − sin ⁡ θ 0 cos ⁡ θ 0 0 0 0 1 ) R_y(\theta)=\begin{pmatrix} \cos\theta&0&\sin\theta&0\\ 0& 1& 0 &0\\ -\sin\theta&0 & \cos\theta &0\\ 0&0&0&1 \end{pmatrix} Ry(θ)= cosθ0sinθ00100sinθ0cosθ00001

R z ( θ ) = ( cos ⁡ θ − sin ⁡ θ 0 0 sin ⁡ θ cos ⁡ θ 0 0 0 0 1 0 0 0 0 1 ) R_z(\theta)=\begin{pmatrix} \cos\theta&-\sin\theta &0&0\\ \sin\theta&\cos\theta & 0&0\\ 0&0 & 1&0\\ 0&0&0&1 \end{pmatrix} Rz(θ)= cosθsinθ00sinθcosθ0000100001

任意两个可得到后一个。
y怎么是反的,z叉乘x得到y

R x y z ( α , β , γ ) = R x ( α ) R y ( β ) R y ( γ ) R_{xyz}(\alpha,\beta,\gamma)=R_{x}(\alpha)R_y(\beta)R_y(\gamma) Rxyz(α,β,γ)=Rx(α)Ry(β)Ry(γ)
欧拉角
roll, pitch, yaw

Rodrigues’ Rotation Formula

绕(过原点)轴 n \mathbf{n} n旋转角度 α \alpha α:

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 ) R(\mathbf{n},\alpha) = \cos(\alpha) \mathbf{I} + (1-\cos\alpha)\mathbf{n}\mathbf{n}^T + \sin\alpha\begin{pmatrix} 0 & -n_z & n_y\\ n_z & 0 & -n_x\\ -n_y & n_x & 0 \end{pmatrix} R(n,α)=cos(α)I+(1cosα)nnT+sinα 0nznynz0nxnynx0
绕任意轴旋转:平移,旋转,平移回原位置
证明:待补充

旋转矩阵不适合插值,—四元数

Viewing (观测)transformation

  • View/Camera transformation
  • Projection transformation
    • orthographic projection
    • perspective projection

View/Camera transformation

模型变换:找的到合适的模型(风景/人)
视图变换:找到合适相机角度
投影变换
MVP变换

定义相机

  • 位置 e ⃗ \vec{e} e
  • look-at/gaze direction g ^ \hat{g} g^
  • 上方向 Up direction t ^ \hat{t} t^
    (assuming perp. to look-at)

在这里插入图片描述

key observations:

如果相机和所有的物体一起移动,那么照片相同
在这里插入图片描述

将相机变换到原点,up at Y轴,look at -Z轴
并随着相机变换对象
在这里插入图片描述

通过 M v i e w M_{view} Mview变换相机

  • 平移到原点
  • 旋转g到-z
  • 旋转t到y
  • 旋转( g × t g\times t g×t)到X
    在这里插入图片描述

M v i e w = R v i e w T v i e w M_{view}=R_{view}T_{view}\\ Mview=RviewTview
变换到原点
T v i e w = ( 1 0 0 − x e 0 1 0 − y e 0 0 1 − z e 0 0 0 1 ) T_{view}=\begin{pmatrix} 1 & 0 & 0 & -x_e\\ 0 & 1 & 0 & -y_e\\ 0 & 0 & 1 & -z_e\\ 0 & 0 & 0 & 1 \end{pmatrix} Tview= 100001000010xeyeze1
旋转g到-z, 旋转t到y, 旋转( g × t g\times t g×t)到X

考虑逆旋转:X TO g × t g\times t g×t, y TO t, z TO -g
R v i e w − 1 = ( x g × t x t x − g 0 y g × t y t y − g 0 z g × t z t z − g 0 0 0 0 1 ) R_{view}^{-1}=\begin{pmatrix} x_{g\times t} & x_t & x_{-g} & 0\\ y_{g\times t} & y_t & y_{-g} & 0\\ z_{g\times t} & z_t & z_{-g} & 0\\ 0 & 0 & 0 & 1 \end{pmatrix} Rview1= xg×tyg×tzg×t0xtytzt0xgygzg00001

R v i e w = ( x g × t y g × t z g × t 0 x t y t z t 0 x − g y − g z − g 0 0 0 0 1 ) R_{view}=\begin{pmatrix} x_{g\times t} & y_{g\times t} & z_{g\times t} & 0\\ x_t & y_t & z_t & 0\\ x_{-g} & y_{-g} & z_{-g} & 0\\ 0 & 0 & 0 & 1 \end{pmatrix} Rview= xg×txtxg0yg×tytyg0zg×tztzg00001

ModelView

Projection transformation

3D TO 2D

正交投影, 透视投影
在这里插入图片描述

在这里插入图片描述

Orthographic projection 正交投影

简单理解:

相机放在原点,up at Y轴,look at -Z轴

去掉z坐标

平移缩放结果到 [ − 1 , 1 ] 2 [-1,1]^2 [1,1]2
在这里插入图片描述

(如何区分物体前后?)

一般:

将一个立方体 [ l , r ] × [ b , t ] × [ f , n ] [l,r]\times[b,t]\times[f,n] [l,r]×[b,t]×[f,n]映射到canonical(正则,规范,标准) cube [ − 1 , 1 ] 3 [-1,1]^3 [1,1]3
在这里插入图片描述

M o r t h o = ( 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 − l + r 2 0 1 0 − t + b 2 0 0 1 − n + f 2 0 0 0 1 ) M_{ortho}=\begin{pmatrix} 2/(r-l) & 0 & 0 & 0\\ 0 & 2/(t-b) & 0 & 0\\ 0 & 0 & 2/(n-f) & 0\\ 0 & 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} 1 & 0 & 0 & -\frac{l+r}{2}\\ 0 & 1 & 0 & -\frac{t+b}{2}\\ 0 & 0 & 1 & -\frac{n+f}{2}\\ 0 & 0 & 0 & 1 \end{pmatrix} Mortho= 2/(rl)00002/(tb)00002/(nf)00001 1000010000102l+r2t+b2n+f1
near > far

OpenGL使用左手系

Perspective projection 透视投影

更符合现实

近大远小

平行线可能相交于一个点
在这里插入图片描述

透视投影过程:
将锥体映射到一个立方体( M p e r − > o t h M_{per->oth} Mper>oth),做正交投影( M o t h M_{ oth} Moth
在这里插入图片描述

规定近平面不变

在这里插入图片描述

( x ′ y ′ z ′ 1 ) = ( n x / z n y z u n k n o w 1 ) = = > ( n x n y u n k n o w n z ) \begin{pmatrix}x' \\y' \\z'\\1 \end{pmatrix}=\begin{pmatrix}nx/z\\nyz\\unknow\\1 \end{pmatrix}==>\begin{pmatrix} nx\\ ny\\ unknown\\ z \end{pmatrix} xyz1 = nx/znyzunknow1 ==> nxnyunknownz

M p e r s p − > o r t h o = ( n 0 0 0 0 n 0 0 ? ? ? ? 0 0 1 0 ) M_{persp->ortho}=\begin{pmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0\\ ? & ? & ? & ?\\ 0 & 0 & 1 & 0 \end{pmatrix} Mpersp>ortho= n0?00n?000?100?0
第三行和z’有关

在近平面的点不变
( x y n 1 ) = = ( n x n y n 2 n ) \begin{pmatrix}x\\y\\n\\1 \end{pmatrix}== \begin{pmatrix}nx\\ny\\n^2\\n \end{pmatrix} xyn1 == nxnyn2n
对于变换矩阵第三行
( 0 0 A B ) ( x y n 1 ) = n 2 \begin{pmatrix}0&0&A&B\end{pmatrix}\begin{pmatrix}x\\y\\n\\1 \end{pmatrix}=n^2 (00AB) xyn1 =n2
A n + B = n 2 An+B=n^2 An+B=n2
远平面的点的z不变
( 0 0 f 1 ) \begin{pmatrix}0\\0\\f\\1 \end{pmatrix} 00f1
A f + B = f 2 Af+B=f^2 Af+B=f2
A = n + f , B = − n f A=n+f, B=-nf A=n+f,B=nf

中间的点的z变小?

最后做正交变换
可得透视变换的矩阵

近平面l,r,b,t

vertical field of view, fovY 垂直视场/可视角度

aspect ratio纵横比
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不知不道abc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值