Transformation

发布时间:2024年01月14日

Transformation

笔记来源:GAMES101-现代计算机图形学入门-闫令琪

1. Why do we study transformation?

Modeling Transformation(模型变换)、Viewing Transformation(视图变换)
Modeling:translation

Modeling:rotation

Modeling:scaling

Viewing:(3D to 2D)projection

2. 2D Transformations

representing transformations using matrices

rotation、scale、shear

2.1 Scale Transform


Scale Transform
x ′ = s x ? y ′ = s y x'=sx\\~ y'=sy x=sx?y=sy
Scale Matrix

2.2 Reflection Transform

Reflection Matrix

2.3 Shear Transform

Shear Matrix

2.4 Rotation Transform


2.5 Linear Transform

Linear Transforms = Matrices (of the same dimension)

2.6 Inverse Transform

Inverse Transform

2.7 Composite 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?先乘起来得到一个矩阵,让这个矩阵乘向量,把向量做变换

2.8 Decomposing Complex Transform

移动图形使得其某一点处于原点,对其进行旋转操作,最后再次移动会原来位置

3. Homogeneous Coordinate

translation


无法使用一个矩阵表示平移变换(不是线性变换),由此引入齐次坐标,使得平移变换可以用一个矩阵表示

齐次坐标中若写1则表示该向量表示点,若写0则表示该向量表示向量


齐次坐标下点+点=两点间中点

Affine Transformation(仿射变换)

齐次坐标下的二维变换的各种变换矩阵

4. 3D Transformations

类比 2D Transformation

变换顺序:先应用线性变换后平移

4.1 Scaling,Translation

缩放变换与平移变换

4.1 Rotation

4.1.1 Fixed axes

绕固定轴旋转
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?内四个三角函数位置不一样

4.1.2 Euler

绕任意轴的旋转可以分解为绕三轴的旋转

4.1.3 Rodrigues

本人博客:罗德里格斯公式推导

若轴 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?? ?

4.1.4 Quaternion

四元数的引入更多是为了旋转与旋转之间的插值
本人博客:四元数公式推导

5. Viewing transformation(观测变换)

5.1 View(视图)/Camera transformation

Model transformation、View transformation、Projection transformation 简称MVP变换

相机位置、相机镜头朝向、相机镜头垂直方向(如果相机旋转则拍出照片不一样,所以需要用此方向标识)

相机和所拍摄物体如果同时做相同变换,则拍摄的照片相同,所以将相机固定在原点

利用view变换矩阵将相机变换到原点,使其三轴方向与坐标系吻合


先平移后旋转,但这个由这个etg三轴旋转到xy-z不好求,但我们可以反过来思考,由xy-z旋转到etg的方向,然后求逆得到etg旋转到xy-z方向的旋转矩阵(正交矩阵的逆为其转置)

5.2 Projection(投影)transformation

正交投影并没有近大远小特点,而透视投影有此特点

透视投影中相机离物体近,正交投影中相机离物体无限远

5.2.1 Orthographic(正交) projection



物体在长方体(空间)内,将物体(包含其内的物体)平移到原点(物体中心与原点重合),缩放长方体(包含其内的物体)各边为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)

5.2.2 Perspective(透视)projection

透视投影近大远小,平行线不再平行,收敛到同一个点



定义视锥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+fb=?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)

文章来源:https://blog.csdn.net/weixin_48524215/article/details/135545698
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。