概述
变换
- 1、为什么学习变换
- 2、2D变换
- 3、齐次坐标
- 1、为什么使用齐次坐标?
- 2、解决方法
- 3、仿射变换
- 4、2维变换
- 1、缩放
- 2、旋转(证明)
- 3、平移
- 5、逆(反)变换
- 4、变换组合
- 5、3维变换
- 1、齐次坐标
- 2、仿射变换
- 3、3维变换
- 1、缩放
- 2、旋转
- 3、平移
- 4、3维旋转
- 5、罗德里格斯公式
- 6、模型变换
- 7、视图变换
- 1、什么是视图变换
- 2、如何表示视图变换
- 3、数学中的 M v i e w M_{view} Mview
- 4、总结
- 8、投影变换
- 1、计算机图形学中的投影变换
- 2、正交投影
- 3、透视投影
- 9、将标准立方体投影到屏幕
- 什么是屏幕
- 屏幕空间
- 视口变换
- 10、参考和引用
1、为什么学习变换
动画、游戏、3D、2D中都要用到变换
2、2D变换
缩放矩阵
[
s
0
0
s
]
left[begin{matrix} s&0\ 0&s end{matrix} right]
[s00s]
反射矩阵
[
−
1
0
0
1
]
left[begin{matrix} -1&0\ 0&1 end{matrix} right]
[−1001]
错切矩阵
[
−
1
a
0
1
]
left[begin{matrix} -1&a\ 0&1 end{matrix} right]
[−10a1]
旋转矩阵
[
c
o
s
(
θ
)
−
s
i
n
(
θ
)
s
i
n
(
θ
)
c
o
s
(
θ
)
]
left[begin{matrix} cos(theta)&-sin(theta)\ sin(theta)&cos(theta) end{matrix} right]
[cos(θ)sin(θ)−sin(θ)cos(θ)]
以上都是线性变换,都可以用以下式子统一表示:
[
x
′
y
′
]
=
[
a
b
c
d
]
[
x
y
]
(1)
left[ begin{matrix} x^{'}\ y^{'} end{matrix} right]=left[begin{matrix} a&b\ c&d end{matrix} right]left[begin{matrix} x\ y end{matrix} right] tag{1}
[x′y′]=[acbd][xy](1)
3、齐次坐标
1、为什么使用齐次坐标?
- 平移不能用(1)统一表示
[ x ′ y ′ ] = [ a b c d ] [ x y ] + [ t x t y ] left[ begin{matrix} x^{'}\ y^{'} end{matrix} right]=left[begin{matrix} a&b\ c&d end{matrix} right]left[begin{matrix} x\ y end{matrix} right]+left[begin{matrix} t_{x}\ t_{y} end{matrix} right] [x′y′]=[acbd][xy]+[txty]
平移不是线性变换
2、解决方法
- 增加第三项坐标(w坐标)
- 2维点: ( x , y , 1 ) T (x,y,1)^T (x,y,1)T
- 2维向量:
(
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 ) left(begin{matrix} x^{'}\ y^{'}\ w^{'} end{matrix} right)=left(begin{matrix} 1&0&t_{x}\ 0&1&t_{y}\ 0&0&1 end{matrix} right) cdotleft(begin{matrix} x\ y\ 1 end{matrix} right)+left(begin{matrix} x+t_{x}\ y+t_{y}\ 1 end{matrix} right) ⎝⎛x′y′w′⎠⎞=⎝⎛100010txty1⎠⎞⋅⎝⎛xy1⎠⎞+⎝⎛x+txy+ty1⎠⎞
( x y w ) left(begin{matrix} x\ y\ w end{matrix} right) ⎝⎛xyw⎠⎞是2维点 ( x / w y / w 1 ) ( w ≠ 0 ) left(begin{matrix} x/w \ y/w \ 1 end{matrix} right)(wnot=0) ⎝⎛x/wy/w1⎠⎞(w=0)
3、仿射变换
- 仿射变换=线性变换+平移
( x ′ y ′ ) = ( a b c d ) ( x y ) + ( t x t y ) left( begin{matrix} x^{'}\ y^{'} end{matrix} right)=left(begin{matrix} a&b\ c&d end{matrix} right)left(begin{matrix} x\ y end{matrix} right)+left(begin{matrix} t_{x}\ t_{y} end{matrix} right) (x′y′)=(acbd)(xy)+(txty) - 使用齐次坐标
( x ′ y ′ 1 ) = ( a b t x c d t y 0 0 1 ) ⋅ ( x y 1 ) left( begin{matrix} x^{'}\ y^{'}\ 1 end{matrix} right)=left(begin{matrix} a&b&t_x\ c&d&t_y\ 0&0&1 end{matrix} right) cdot left(begin{matrix} x\ y\ 1 end{matrix} right) ⎝⎛x′y′1⎠⎞=⎝⎛ac0bd0txty1⎠⎞⋅⎝⎛xy1⎠⎞
4、2维变换
1、缩放
S ( s x , s y ) = ( s x 0 0 0 s y 0 0 0 1 ) S(s_x,s_y)=left(begin{matrix} s_x&0&0\ 0&s_y&0\ 0&0&1 end{matrix} right) S(sx,sy)=⎝⎛sx000sy0001⎠⎞
2、旋转(证明)
R ( α ) = ( c o s ( α ) − s i n ( α ) 0 s i n ( α ) c o s ( α ) 0 0 0 1 ) R(alpha)=left(begin{matrix} cos(alpha)&-sin(alpha)&0\ sin(alpha)&cos(alpha)&0\ 0&0&1 end{matrix} right) R(α)=⎝⎛cos(α)sin(α)0−sin(α)cos(α)0001⎠⎞
3、平移
T ( t x , t y ) = ( 1 0 t x 0 1 t y 0 0 1 ) T(t_x,t_y)=left(begin{matrix} 1&0&t_x\ 0&1&t_y\ 0&0&1 end{matrix} right) T(tx,ty)=⎝⎛100010txty1⎠⎞
5、逆(反)变换
M − 1 M^{-1} M−1同时是M变换在代数上和几何上的逆
4、变换组合
- 矩阵相乘不具有交换性
R ( 45 ) ⋅ T ( 1 , 0 ) ≠ T ( 1 , 0 ) ⋅ R ( 45 ) R(45) cdot T(1,0) not=T(1,0) cdot R(45) R(45)⋅T(1,0)=T(1,0)⋅R(45) - 矩阵是从右到左应用到矩阵上的
- T ( 1 , 0 ) ⋅ R ( 45 ) [ x y 1 ] = [ 1 0 t x 0 1 t y 0 0 1 ] [ c o s ( 4 5 ∘ ) − s i n ( 4 5 ∘ ) 0 s i n ( 4 5 ∘ ) c o s ( 4 5 ∘ ) 0 0 0 1 ] [ x y 1 ] T(1,0) cdot R(45) left[ begin{matrix} x\ y\ 1 end{matrix} right]=left[begin{matrix} 1&0&t_x\ 0&1&t_y\ 0&0&1 end{matrix} right] left[begin{matrix} cos(45^{circ})&-sin(45^{circ})&0\ sin(45^{circ})&cos(45^{circ})&0\ 0&0&1 end{matrix} right]left[ begin{matrix} x\ y\ 1 end{matrix} right] T(1,0)⋅R(45)⎣⎡xy1⎦⎤=⎣⎡100010txty1⎦⎤⎣⎡cos(45∘)sin(45∘)0−sin(45∘)cos(45∘)0001⎦⎤⎣⎡xy1⎦⎤
5、3维变换
1、齐次坐标
3维点:
(
x
,
y
,
z
,
1
)
T
(x,y,z,1)^T
(x,y,z,1)T
3维向量:
(
x
,
y
,
z
,
0
)
T
(x,y,z,0)^T
(x,y,z,0)T
2、仿射变换
( 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{matrix} x^{'}\ y^{'}\ z^{'}\ 1 end{matrix} right)=left(begin{matrix} a&b&c&t_x\ d&e&f&t_y\ g&h&i&t_z\ 0&0&0&1 end{matrix} right) cdot left(begin{matrix} x\ y\ z\ 1 end{matrix} right) ⎝⎜⎜⎛x′y′z′1⎠⎟⎟⎞=⎝⎜⎜⎛adg0beh0cfi0txtytz1⎠⎟⎟⎞⋅⎝⎜⎜⎛xyz1⎠⎟⎟⎞
3、3维变换
1、缩放
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 ) S(s_x,s_y,s_z)=left(begin{matrix} s_x&0&0&0\ 0&s_y&0&0\ 0&0&s_z&0\ 0&0&0&1 end{matrix} right) S(sx,sy,sz)=⎝⎜⎜⎛sx0000sy0000sz00001⎠⎟⎟⎞
2、旋转
旋转矩阵是正交矩阵
R
x
(
α
)
=
(
1
0
0
0
0
c
o
s
(
α
)
−
s
i
n
(
α
)
0
0
s
i
n
(
α
)
c
o
s
(
α
)
0
0
0
0
1
)
R_x(alpha)=left(begin{matrix} 1&0&0&0\ 0&cos(alpha)&-sin(alpha)&0\ 0&sin(alpha)&cos(alpha)&0\ 0&0&0&1 end{matrix} right)
Rx(α)=⎝⎜⎜⎛10000cos(α)sin(α)00−sin(α)cos(α)00001⎠⎟⎟⎞
R
y
(
α
)
=
(
c
o
s
(
α
)
0
s
i
n
(
α
)
0
0
1
0
0
−
s
i
n
(
α
)
0
c
o
s
(
α
)
0
0
0
0
1
)
R_y(alpha)=left(begin{matrix} cos(alpha)&0&sin(alpha)&0\ 0&1&0&0\ -sin(alpha)&0&cos(alpha)&0\ 0&0&0&1 end{matrix} right)
Ry(α)=⎝⎜⎜⎛cos(α)0−sin(α)00100sin(α)0cos(α)00001⎠⎟⎟⎞
因为
z
×
x
z times x
z×x得到
y
y
y
R
z
(
α
)
=
(
c
o
s
(
α
)
−
s
i
n
(
α
)
0
0
s
i
n
(
α
)
c
o
s
(
α
)
0
0
0
0
1
0
0
0
0
1
)
R_z(alpha)=left(begin{matrix} cos(alpha)&-sin(alpha)&0&0\ sin(alpha)&cos(alpha)&0&0\ 0&0&1&0\ 0&0&0&1 end{matrix} right)
Rz(α)=⎝⎜⎜⎛cos(α)sin(α)00−sin(α)cos(α)0000100001⎠⎟⎟⎞
3、平移
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 ) T(t_x,t_y,t_z)=left(begin{matrix} 1&0&0&t_x\ 0&1&0&t_y\ 0&0&1&t_z\ 0&0&0&1 end{matrix} right) T(tx,ty,tz)=⎝⎜⎜⎛100001000010txtytz1⎠⎟⎟⎞
4、3维旋转
R
(
α
,
β
,
γ
)
=
R
x
(
α
)
R
y
(
β
)
R
z
(
γ
)
R(alpha,beta,gamma)=R_x(alpha)R_y(beta)R_z(gamma)
R(α,β,γ)=Rx(α)Ry(β)Rz(γ)
被称为欧拉旋转。
会有万向节死锁(Gimbal Lock)
可以改用四元数(Quaternion)来避免
5、罗德里格斯公式
(证明)
- 绕任意轴旋转
α
alpha
α度
R ( n , α ) = c o s ( α ) I + ( 1 − c o s ( α ) ) n n T + s i n ( α ) ( 0 − n z n y n z 0 − n x − n y n x 0 ) R(n,alpha)=cos(alpha)I+(1-cos(alpha))nn^T+sin(alpha)left(begin{matrix} 0&-n_z&n_y\ n_z&0&-n_x\ -n_y&n_x&0\ end{matrix} right) R(n,α)=cos(α)I+(1−cos(α))nnT+sin(α)⎝⎛0nz−ny−nz0nxny−nx0⎠⎞
6、模型变换
利用基础的变换矩阵将世界当中的物体调整至我们想要的地方(旋转,平移,缩放)。
7、视图变换
1、什么是视图变换
得到物体与摄像机的相对位置
- 如何拍照
- 找到一个好地方并安排好人的站位(模型变换 model transformation)
- 找到一个好的角度取放置相机(视图变换 view transformation)
- 拍照(投影变换 projection transformation)
2、如何表示视图变换
- 定义相机
1、所在位置 e ⃗ vec{e} e
2、视线方向 g ^ widehat{g} g
3、朝上方向 t ^ widehat{t} t
(垂直于视线方向)- 如何变换相机
将相机放到原点,朝上方向为Y轴,视线方向放在-Z
- 如何变换相机
3、数学中的 M v i e w M_{view} Mview
- 将 e ⃗ vec{e} e放到原点
- 将 g ^ widehat{g} g 旋转到-Z
- 将 t ^ widehat{t} t 旋转到Y
- 旋转(
g
⃗
×
t
^
vec{g} times widehat{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 - 将
e
⃗
vec{e}
e放到原点
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}=left(begin{matrix} 1&0&0&-x_e\ 0&1&0&-y_e\ 0&0&1&-z_e\ 0&0&0&1 end{matrix} right) Tview=⎝⎜⎜⎛100001000010−xe−ye−ze1⎠⎟⎟⎞
因为直接求 R v i e w R_{view} Rview很困难,反过来求从原点旋转到相机的位置 R v i e w − 1 R_{view}^{-1} Rview−1。
因为 R v i e w R_{view} Rview旋转矩阵为正交矩阵,所以 R v i e w − 1 = R v i e w T R_{view}^{-1}=R_{view}^{T} Rview−1=RviewT
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}=left(begin{matrix} x_{widehat{g} times widehat{t}}& x_{t}&x_{-g}&0\ y_{widehat{g} times widehat{t}}&y_{t}&y_{-g}&0\ z_{widehat{g} times widehat{t}}&z_{t}&z_{-g}&0\ 0&0&0&1 end{matrix} right) Rview−1=⎝⎜⎜⎛xg ×t yg ×t zg ×t 0xtytzt0x−gy−gz−g00001⎠⎟⎟⎞
所以
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}=left(begin{matrix} x_{widehat{g} times widehat{t}}& y_{widehat{g} times widehat{t}}&z_{widehat{g} times widehat{t}}&0\ x_{t}&y_{t}&z_{t}&0\ x_{-g}&y_{-g}&z_{-g}&0\ 0&0&0&1 end{matrix} right) Rview=⎝⎜⎜⎛xg ×t xtx−g0yg ×t yty−g0zg ×t ztz−g00001⎠⎟⎟⎞
4、总结
1、将物体与相机一起变换
2、让相机位于原点,朝上方位为Y轴,视线方向为-Z轴
3、也被称为模型视口变换
4、为什么需要该变换?
为了投影变换
8、投影变换
1、计算机图形学中的投影变换
将三维物体投影到二维中
2、正交投影
坐标的相对位置不变,光线是平行的,将物体变换到 [ − 1 , 1 ] 3 [-1,1]^3 [−1,1]3的立方体中(即坐标范围为[-1,1])。
M
o
r
t
h
o
=
(
2
r
−
l
0
0
−
r
+
l
r
−
l
0
2
t
−
b
0
−
r
+
b
r
−
b
0
0
2
n
−
f
−
n
+
f
n
−
f
0
0
0
1
)
M_{ortho}=left(begin{matrix} frac{2}{r-l}&0&0&-frac{r+l}{r-l}\ 0&frac{2}{t-b}&0&-frac{r+b}{r-b}\ 0&0&frac{2}{n-f}&-frac{n+f}{n-f}\ 0&0&0&1 end{matrix} right)
Mortho=⎝⎜⎜⎛r−l20000t−b20000n−f20−r−lr+l−r−br+b−n−fn+f1⎠⎟⎟⎞
3、透视投影
类似人眼看到的真实世界,近大远小。平行线在远处会相交于一点。(如何求出下列矩阵)
M
p
r
e
s
→
o
r
t
h
o
=
(
n
0
0
0
0
n
0
0
0
0
n
+
f
−
n
f
0
0
1
0
)
M_{pres rightarrow ortho}=left(begin{matrix} n&0&0&0\ 0&n&0&0\ 0&0&n+f&-nf\ 0&0&1&0 end{matrix} right)
Mpres→ortho=⎝⎜⎜⎛n0000n0000n+f100−nf0⎠⎟⎟⎞
M
p
r
e
s
=
M
o
r
t
h
o
M
p
r
e
s
→
o
r
t
h
o
M_{pres}=M_{ ortho}M_{pres rightarrow ortho}
Mpres=MorthoMpres→ortho
M
p
r
e
s
=
(
2
n
r
−
l
0
l
+
r
l
−
r
0
0
2
n
t
−
b
b
+
t
b
−
t
0
0
0
n
+
f
n
−
f
−
n
f
n
−
f
0
0
1
0
)
M_{pres}=left(begin{matrix} frac{2n}{r-l}&0&frac{l+r}{l-r}&0\ 0&frac{2n}{t-b}&frac{b+t}{b-t}&0\ 0&0&frac{n+f}{n-f}&-frac{nf}{n-f}\ 0&0&1&0 end{matrix} right)
Mpres=⎝⎜⎜⎛r−l2n0000t−b2n00l−rl+rb−tb+tn−fn+f100−n−fnf0⎠⎟⎟⎞
- 下图灰色平面为近平面。
Vertical Field of View(fovY) 是垂直可视角度
Aspect ratio是宽高比
-将fovY 和aspect转换成l,r,n,t
9、将标准立方体投影到屏幕
MVP:
Model transformation (placing objects)
View transformation (placing camera)
Projection transformation
MVP之后我们需要把标准立方体投影到屏幕上去。
什么是屏幕
像素的二维数组,大小是固定的。
是一种典型的光栅成像设备。
Raster在德语中就是screen的意思。 Rasterize表示drawing onto the screen
屏幕空间
本课程的定义:
原点位于左下角
每个像素坐标值由(x,y)表示,x,y为整数
像素中心点是
(
x
+
0.5
,
y
+
0.5
)
(x+0.5,y+0.5)
(x+0.5,y+0.5)
屏幕覆盖范围是
(
0
,
0
)
(
w
i
d
t
h
,
h
e
i
g
h
t
)
(0,0) ~ (width, height)
(0,0) (width,height)
视口变换
将
[
−
1
,
1
]
2
[-1,1]^2
[−1,1]2空间变成
[
0
,
w
i
d
t
h
]
×
[
0
,
h
e
i
g
h
t
]
[0,width]times[0,height]
[0,width]×[0,height]
1、拉伸成屏幕一样的aspect ratio
2、平移到中心位置
视口变换矩阵:
M
v
i
e
w
p
o
r
t
=
(
w
i
d
t
h
2
0
0
w
i
d
t
h
2
0
h
e
i
g
h
t
2
0
h
e
i
g
h
t
2
0
0
1
0
0
0
0
1
)
M_{viewport}=left(begin{matrix} frac{width}{2}&0&0&frac{width}{2}\ 0&frac{height}{2}&0&frac{height}{2}\ 0&0&1&0\ 0&0&0&1 end{matrix} right)
Mviewport=⎝⎜⎜⎛2width00002height0000102width2height01⎠⎟⎟⎞
M
=
M
v
i
e
w
p
o
r
t
M
p
e
r
M
v
i
e
w
M
m
o
d
e
l
M=M_{viewport}M_{per}M_{view}M_{model}
M=MviewportMperMviewMmodel
10、参考和引用
来自bilibili:GAMES101-现代计算机图形学入门-闫令琪
来自变换(二维与三维).pdf
来自变换(模型、视图、投影).pdf
来自罗德里格斯公式证明.pdf
来自CSDN:计算机图形学一:基础变换矩阵总结(缩放,旋转,位移)
来自CSDN:计算机图形学二:视图变换(坐标系转化,正交投影,透视投影,视口变换)
来自CSDN:Game101课程笔记_lecture03_transformation变换
来自知乎:【GAMES101-现代计算机图形学课程笔记】Lecture 05 光栅化(三角形)
最后
以上就是疯狂胡萝卜为你收集整理的Game101现代计算机图形学入门学习笔记(三)1、为什么学习变换2、2D变换3、齐次坐标4、变换组合5、3维变换6、模型变换7、视图变换8、投影变换9、将标准立方体投影到屏幕10、参考和引用的全部内容,希望文章能够帮你解决Game101现代计算机图形学入门学习笔记(三)1、为什么学习变换2、2D变换3、齐次坐标4、变换组合5、3维变换6、模型变换7、视图变换8、投影变换9、将标准立方体投影到屏幕10、参考和引用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复