笔记来源:GAMES101-现代计算机图形学入门-闫令琪
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
Linear Transforms = Matrices (of the same dimension)
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 = ia1a2jb1b2kc1c2 = a2b3−a3b2−(a1b3−a3b1)a1b2−a2b1 = 0a3−a2−a30a1a2−a10 b1b2b3
四元数的引入更多是为了旋转与旋转之间的插值
本人博客:四元数公式推导
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= n0000n0000n+f000−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=MorthoMpersp->ortho = r−l20000t−b20000n−f20−r−lr+l−t−bt+b−n−fn+f1 n0000n0000n+f000−nf1 Mperp= r−l2n0000t−b2n00l−rl+rb−tb+tn−fn+f100f−n2fn0
视口变换矩阵
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= 2width00002height0000102width2height01
综上:将空间中任意物体在屏幕上显示的变换矩阵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=MviewMperpMcamMmodel
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)