Modeling Transformation(模型变换)、Viewing Transformation(视图变换)
Modeling:translation
Modeling:rotation
Modeling:scaling
Viewing:(3D to 2D)projection
representing transformations using matrices
rotation、scale、shear
Scale Transform
x
′
=
s
x
?
y
′
=
s
y
x'=sx\\~ y'=sy
x′=sx?y′=sy
Scale Matrix
Reflection Matrix
Shear Matrix
Linear Transforms = Matrices (of the same dimension)
Inverse Transform
Composite Transform(组合变换)
变换顺序很重要,由于矩阵乘法一般不满足交换律
A
?
B
≠
B
?
A
A\cdot B\neq B\cdot A
A?B=B?A
从右向左变换
多次变换,可以从
A
1
A_1
A1?到
A
n
A_n
An?先乘起来得到一个矩阵,让这个矩阵乘向量,把向量做变换
移动图形使得其某一点处于原点,对其进行旋转操作,最后再次移动会原来位置
translation
无法使用一个矩阵表示平移变换(不是线性变换),由此引入齐次坐标,使得平移变换可以用一个矩阵表示
齐次坐标中若写1则表示该向量表示点,若写0则表示该向量表示向量
齐次坐标下点+点=两点间中点
Affine Transformation(仿射变换)
齐次坐标下的二维变换的各种变换矩阵
类比 2D Transformation
变换顺序:先应用线性变换后平移
缩放变换与平移变换
绕固定轴旋转
xyzxyz
x叉乘y得到z,则
R
x
、
R
y
、
R
z
R_x、R_y、R_z
Rx?、Ry?、Rz?内四个三角函数位置都一样
xyzxyz
x叉乘z得到-y,
R
y
R_y
Ry?与
R
x
、
R
z
R_x、R_z
Rx?、Rz?内四个三角函数位置不一样
绕任意轴的旋转可以分解为绕三轴的旋转
本人博客:罗德里格斯公式推导
若轴
n
n
n不经过原点,我们可以先将其移动到原点,经过旋转操作后,再将其移动到初始位置
N是叉乘的矩阵形式为反对称矩阵
a
?
=
(
a
1
,
b
1
,
c
1
)
T
\vec{a}=(a_1,b_1,c_1)^T
a=(a1?,b1?,c1?)T、
b
?
=
(
a
2
,
b
2
,
c
2
)
T
\vec{b}=(a_2,b_2,c_2)^T
b=(a2?,b2?,c2?)T
c
?
=
a
?
×
b
?
?
=
∣
i
j
k
a
1
b
1
c
1
a
2
b
2
c
2
∣
?
=
(
a
2
b
3
?
a
3
b
2
?
(
a
1
b
3
?
a
3
b
1
)
a
1
b
2
?
a
2
b
1
)
?
=
(
0
?
a
3
a
2
a
3
0
?
a
1
?
a
2
a
1
0
)
(
b
1
b
2
b
3
)
\vec{c}=\vec{a}×\vec{b}\\ ~\\ =\left | \begin{matrix} i & j & k \\ a_1 & b_1 & c_1 \\ a_2 & b_2 & c_2 \\ \end{matrix} \right | \\ ~\\ =\begin{pmatrix} a_2b_3-a_3b_2\\ -(a_1b_3-a_3b_1)\\ a_1b_2-a_2b_1 \end{pmatrix}\\ ~\\ =\begin{pmatrix} 0 & -a_3 & a_2\\ a_3 & 0 & -a_1\\ -a_2 & a_1 & 0 \end{pmatrix} \begin{pmatrix} b_1\\ b_2\\ b_3 \end{pmatrix}
c=a×b?=
?ia1?a2??jb1?b2??kc1?c2??
??=
?a2?b3??a3?b2??(a1?b3??a3?b1?)a1?b2??a2?b1??
??=
?0a3??a2???a3?0a1??a2??a1?0?
?
?b1?b2?b3??
?
四元数的引入更多是为了旋转与旋转之间的插值
本人博客:四元数公式推导
Model transformation、View transformation、Projection transformation 简称MVP变换
相机位置、相机镜头朝向、相机镜头垂直方向(如果相机旋转则拍出照片不一样,所以需要用此方向标识)
相机和所拍摄物体如果同时做相同变换,则拍摄的照片相同,所以将相机固定在原点
利用view变换矩阵将相机变换到原点,使其三轴方向与坐标系吻合
先平移后旋转,但这个由这个etg三轴旋转到xy-z不好求,但我们可以反过来思考,由xy-z旋转到etg的方向,然后求逆得到etg旋转到xy-z方向的旋转矩阵(正交矩阵的逆为其转置)
正交投影并没有近大远小特点,而透视投影有此特点
透视投影中相机离物体近,正交投影中相机离物体无限远
物体在长方体(空间)内,将物体(包含其内的物体)平移到原点(物体中心与原点重合),缩放长方体(包含其内的物体)各边为2(由于标准的cube边范围为[-1,1]),经过变换后长方体内的物体,然后进行正交投影(从z轴看向负方向),此时的投影是被拉伸过的,把投影再作视口变换(缩放到屏幕宽高),最终得到正确的投影
为什么要把物体放到cube中?因为只有缩放到[-1,1]范围内,屏幕上物体才能显示完全
下图中x=l(left plane)、x=r(right plane)、y=b(bottom plane)、y=t(top plane)、z=n(near plane)、z=f(far plane)
透视投影近大远小,平行线不再平行,收敛到同一个点
定义视锥Frustum需要可视角度、宽高比
视场角FOV:你所能看到的视野范围,此范围用宽高定义
下图来自:视锥体剔除(Frustum Culling)算法详解
给定FOV和宽高比就能得到l,r,b,t(各个平面的部分坐标值)
x=l(left plane)、x=r(right plane)、y=b(bottom plane)、y=t(top plane)、z=n(near plane)、z=f(far plane)
类比正交投影,我们也定义near plane 和 far plane
透视投影过程:将视锥Frustum挤压为Cuboid,随后进行正交投影
物体在视锥Frustum内部,挤压Frustum的同时,物体也被挤压
物体在视锥Frustum内部,挤压Frustum的同时,物体也被挤压,挤压过程中near plane上的所有点不变,far plane的中心点位置不变,z坐标不变,y坐标变,而在n与f plane之间的点(x,y,z)坐标均变化,也就是物体上的点坐标均变化
在挤压过程中near plane上所有点坐标均不变,far plane上z坐标不变
(1)我们先来看看从near plane上所有点坐标均不变这条信息能够让我们得知有关M矩阵的哪些信息?
near平面上点的坐标齐次形式
(
x
,
y
,
n
,
1
)
T
(x,y,n,1)^T
(x,y,n,1)T挤压过程中不变仍为
(
x
,
y
,
n
,
1
)
T
(x,y,n,1)^T
(x,y,n,1)T,齐次坐标乘n后
(
n
x
,
n
y
,
n
2
,
n
)
T
(nx,ny,n^2,n)^T
(nx,ny,n2,n)T仍表示三维空间点
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)
M
persp->ortho
?
(
n
x
,
n
y
,
n
2
,
n
)
T
=
(
n
x
,
n
y
,
n
2
,
n
)
T
M_{\text{persp->ortho}}\cdot (nx,ny,n^2,n)^T=(nx,ny,n^2,n)^T
Mpersp->ortho??(nx,ny,n2,n)T=(nx,ny,n2,n)T(矩阵第三行与坐标相乘结果为
n
2
n^2
n2)
M
persp->ortho
M_{\text{persp->ortho}}
Mpersp->ortho?的第三行形式为
(
0
,
0
,
a
,
b
)
(0,0,a,b)
(0,0,a,b)
(
0
,
0
,
a
,
b
)
?
(
x
,
y
,
n
,
1
)
T
=
n
2
(0,0,a,b)\cdot (x,y,n,1)^T=n^2
(0,0,a,b)?(x,y,n,1)T=n2
得到式子:
a
n
+
b
=
n
2
an+b=n^2
an+b=n2
(2)接下来我们看看far plane上z坐标不变这条信息能够让我们得知关于M矩阵的哪些信息?
far平面z坐标的值为
f
f
f,far 平面上中心点的坐标齐次形式
(
0
,
0
,
f
,
1
)
T
(0,0,f,1)^T
(0,0,f,1)T将其乘f得到
(
0
,
0
,
f
2
,
f
)
T
(0,0,f^2,f)^T
(0,0,f2,f)T
M
persp->ortho
?
(
0
,
0
,
f
2
,
f
)
T
=
(
0
,
0
,
f
2
,
f
)
T
M_{\text{persp->ortho}}\cdot (0,0,f^2,f)^T=(0,0,f^2,f)^T
Mpersp->ortho??(0,0,f2,f)T=(0,0,f2,f)T(矩阵第三行与坐标相乘结果为
f
2
f^2
f2)
M
persp->ortho
M_{\text{persp->ortho}}
Mpersp->ortho?的第三行形式为
(
0
,
0
,
a
,
b
)
(0,0,a,b)
(0,0,a,b)
(
0
,
0
,
a
,
b
)
?
(
0
,
0
,
f
2
,
f
)
T
=
f
2
(0,0,a,b)\cdot (0,0,f^2,f)^T=f^2
(0,0,a,b)?(0,0,f2,f)T=f2
得到式子:
a
f
+
b
=
f
2
af+b=f^2
af+b=f2
{
a
n
+
b
=
n
2
a
f
+
b
=
f
2
?
a
=
n
+
f
、
b
=
?
n
f
\begin{cases} an+b=n^2\\ af+b=f^2 \end{cases}\\ ~\\ a=n+f、b=-nf
{an+b=n2af+b=f2??a=n+f、b=?nf
最终
M
persp->ortho
=
(
n
0
0
0
0
n
0
0
0
0
n
+
f
?
n
f
0
0
0
1
)
M_{\text{persp->ortho}}=\left( \begin{array} {cccc} n&0&0&0\\ 0&n&0&0\\ 0&0&n+f&-nf\\ 0 & 0& 0&1 \end{array} \right)
Mpersp->ortho?=
?n000?0n00?00n+f0?00?nf1?
?
挤压完成后,下一步进行正交投影
M
ortho
M_{\text{ortho}}
Mortho?
透视投影矩阵
M
perp
=
M
ortho
M
persp->ortho
?
=
(
2
r
?
l
0
0
?
r
+
l
r
?
l
0
2
t
?
b
0
?
t
+
b
t
?
b
0
0
2
n
?
f
?
n
+
f
n
?
f
0
0
0
1
)
(
n
0
0
0
0
n
0
0
0
0
n
+
f
?
n
f
0
0
0
1
)
?
M
perp
=
(
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
2
f
n
f
?
n
0
0
1
0
)
M_{\text{perp}}=M_{\text{ortho}}M_{\text{persp->ortho}}\\ ~\\ =\left( \begin{array} {cccc} \frac{2}{r-l}&0&0&-\frac{r+l}{r-l}\\ 0&\frac{2}{t-b}&0&-\frac{t+b}{t-b}\\ 0&0&\frac{2}{n-f}&-\frac{n+f}{n-f}\\ 0 & 0& 0&1 \end{array} \right) \left( \begin{array} {cccc} n&0&0&0\\ 0&n&0&0\\ 0&0&n+f&-nf\\ 0 & 0& 0&1 \end{array} \right)\\ ~\\ M_{\text{perp}}=\left( \begin{array} {cccc} \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{2fn}{f-n}\\ 0 & 0& 1&0 \end{array} \right)
Mperp?=Mortho?Mpersp->ortho??=
?r?l2?000?0t?b2?00?00n?f2?0??r?lr+l??t?bt+b??n?fn+f?1?
?
?n000?0n00?00n+f0?00?nf1?
??Mperp?=
?r?l2n?000?0t?b2n?00?l?rl+r?b?tb+t?n?fn+f?1?00f?n2fn?0?
?
视口变换矩阵
M
viewport
=
(
width
2
0
0
width
2
0
height
2
0
height
2
0
0
1
0
0
0
0
1
)
M_{\text{viewport}}=\left( \begin{array} {cccc} \frac{\text{width}}{2}&0&0&\frac{\text{width}}{2}\\ 0&\frac{\text{height}}{2}&0&\frac{\text{height}}{2}\\ 0&0&1&0\\ 0 & 0& 0&1 \end{array} \right)
Mviewport?=
?2width?000?02height?00?0010?2width?2height?01?
?
综上:将空间中任意物体在屏幕上显示的变换矩阵M(MVP变换)
M
=
M
view
M
perp
M
cam
M
model
M=M_{\text{view}}M_{\text{perp}}M_{\text{cam}}M_{\text{model}}
M=Mview?Mperp?Mcam?Mmodel?
M
model
M_{\text{model}}
Mmodel?将3D物体移动到某个位置(modeling transformation)
M
cam
M_{\text{cam}}
Mcam?相机选择合适角度(Camera transformation)
M
perp
M_{\text{perp}}
Mperp?视锥Frustum中的物体 变换为 标准立方体canonical cube中的物体(Projection transformation中的Perspective transformation)
M
view
M_{\text{view}}
Mview?视口变换主是将视景体内投影的物体显示到二维的视口平面上(Viewport transformation)