投影矩阵的计算过程
- 格式:doc
- 大小:23.50 KB
- 文档页数:2
标准正交基所张成的r4子空间上的正交投影的矩阵
标准正交基所张成的R^4子空间上的正交投影的矩阵可以通过以下步骤得到:
假设你的标准正交基是{e1, e2, e3},那么这些向量构成的矩阵E是:
E = [e1 e2 e3]
由于是正交基,所以E的转置乘以E就是单位矩阵I:
E^T * E = I
现在,假设你有一个向量v在R^4中,你希望找到它在由e1, e2, e3张成的子空间上的正交投影。
这个投影可以通过以下公式找到:
proj = E * (E^T * E)^(-1) * E^T * v
注意,因为E^T * E = I,所以(E^T * E)^(-1)实际上就是I。
因此,公式可以简化为:
proj = E * E^T * v
所以,正交投影的矩阵就是E * E^T。
请注意,这只是在由e1, e2, e3张成的子空间上的正交投影。
如果你希望在整个R^4空间上进行正交投影,那么投影矩阵将是单位矩阵I,因为任何向量在其自身空间上的投影就是它自身。
以上是在假设你的子空间是由前三个标准基向量张成的情况下得出的结果。
如果你的子空间是由不同的标准正交基向量张成的,你需要用那些向量来构造矩阵E,然后按照上述步骤进行计算。
深⼊解析投影矩阵的数学⽅法
齐次空间
要理解3d的齐次空间,我们先理解2d的齐次空间。
2d的齐次空间可以理解为三维空间上的向量在(x, y, 1)平⾯上的投影. 投影结果是(x/z, y/z, 1) 齐次矩阵
齐次矩阵能够对向量做仿射变换,也就是能够将平移加⼊到矩阵中,这是3*3矩阵做不到的。
⽽4*3矩阵虽然也能做仿射变换,但是不能求逆矩阵,因为不是⽅阵。
-齐次矩阵的透视投影
空间坐标与其投影到投影平⾯上的坐标的关系:
我们构造齐次矩阵来实现这样的计算
平截头体
这样构造矩阵,得到齐次向量,然后⽤x,y,z分量除以w分量就得到真实的(x,y,z).
真正的投影也是在这⼀步发⽣的。
这个在shader⾥⾯做。
计算缩放系数
fov为90°的时候,就相当于透视投影的⽐例为1:1.当fov变动的时候,投影的⽐例也会跟着变动。
焦距越⼤,fov就越⼩,像在投影平⾯的⽐例就越⼤,这就是长焦镜头。
缩放系数和视场⾓有关系,最终会提现在x⽅向和y⽅向的缩放分量上。
计算缩放系数
透视投影矩阵
先看看构造好的投影矩阵
x,y⽅向的缩放:主要是将相机坐标系下的坐标
zoomx 在x⽅向的缩放值
zoomy 在y⽅向的缩放值
z⽅向缩放:主要是为了将z值归⼀化到-1到1之间
(f+n)/(f-n) 在z⽅向的缩放量
z⽅向平移:主要是为了将z值归⼀化到-1到1之间
-2nf/(f-n) 在z⽅向的平移量
设备空间。
透视投影矩阵深入原理剖析(转载)透视投影是3D固定流水线的重要组成部分,是将相机空间中的点从视锥体(frustum)变换到规则观察体(Canonical View Volume)中,待裁剪完毕后进行透视除法的行为。
在算法中它是通过透视矩阵乘法和透视除法两步完成的。
透视投影变换是令很多刚刚进入3D图形领域的开发人员感到迷惑乃至神秘的一个图形技术。
其中的理解困难在于步骤繁琐,对一些基础知识过分依赖,一旦对它们中的任何地方感到陌生,立刻导致理解停止不前。
没错,主流的3D APIs如OpenGL、D3D的确把具体的透视投影细节封装起来,比如gluPerspective(…)就可以根据输入生成一个透视投影矩阵。
而且在大多数情况下不需要了解具体的内幕算法也可以完成任务。
但是你不觉得,如果想要成为一个职业的图形程序员或游戏开发者,就应该真正降伏透视投影这个家伙么?我们先从必需的基础知识着手,一步一步深入下去(这些知识在很多地方可以单独找到,但我从来没有在同一个地方全部找到,但是你现在找到了J)。
我们首先介绍两个必须掌握的知识。
有了它们,我们才不至于在理解透视投影变换的过程中迷失方向(这里会使用到向量几何、矩阵的部分知识,如果你对此不是很熟悉,可以参考《向量几何在游戏编程中的使用》系列文章)。
齐次坐标表示透视投影变换是在齐次坐标下进行的,而齐次坐标本身就是一个令人迷惑的概念,这里我们先把它理解清楚。
根据《向量几何在游戏编程中的使用6》中关于基的概念。
对于一个向量v以及基oabc,可以找到一组坐标(v1,v2,v3),使得v = v1 a + v2 b + v3 c (1)而对于一个点p,则可以找到一组坐标(p1,p2,p3),使得p – o = p1 a + p2 b + p3 c (2)从上面对向量和点的表达,我们可以看出为了在坐标系中表示一个点(如p),我们把点的位置看作是对这个基的原点o所进行的一个位移,即一个向量——p – o(有的书中把这样的向量叫做位置向量——起始于坐标原点的特殊向量),我们在表达这个向量的同时用等价的方式表达出了点p:p = o + p1 a + p2 b + p3 c (3)(1)(3)是坐标系下表达一个向量和点的不同表达方式。
单应矩阵和投影矩阵单应矩阵和投影矩阵一、单应矩阵单应矩阵是在计算机视觉、模式识别和计算机图形学等领域中广泛应用的一种数学工具。
它用于描述在二维或三维空间中的平面或立体物体之间的映射关系。
单应矩阵可以将一个空间中的点映射到另一个空间中的点,从而实现图像处理和计算机图形学中的许多应用。
列表一:单应矩阵的定义和表示1.1 定义单应矩阵,也称为齐次变换矩阵或投影矩阵,是指将一个空间中的点映射到另一个空间中的点的线性变换。
1.2 表示单应矩阵可以用一个矩阵来表示,形如H = [h1, h2, h3],其中hi表示单应矩阵的每一列。
列表二:单应矩阵的应用2.1 相机校正在计算机视觉中,相机校正是一项重要任务。
通过计算相机的单应矩阵,可以校正相机的畸变,提高图像的质量。
2.2 特征匹配在图像处理中,特征匹配是一项基本任务。
通过计算两幅图像的单应矩阵,可以找到两幅图像中相同特征点的对应关系,从而实现图像拼接、图像配准等算法。
2.3 三维重建在计算机图形学中,三维重建是一项核心技术。
通过计算多幅图像的单应矩阵,可以恢复出物体的三维结构,实现三维重建和虚拟现实等应用。
列表三:单应矩阵的计算方法3.1 最小二乘法最小二乘法是求解单应矩阵的一种常用方法。
它通过最小化残差的平方和,找到使得映射误差最小的单应矩阵。
3.2 直接线性变换法直接线性变换法是求解单应矩阵的另一种方法。
它通过对标定点的坐标进行线性变换,得到标定点在图像中的坐标,从而求解出单应矩阵。
二、投影矩阵投影矩阵是一种线性变换矩阵,用于将物体映射到一个较小的维度的空间中。
它在计算机图形学和机器学习等领域中有广泛的应用。
列表四:投影矩阵的定义和表示4.1 定义投影矩阵是指将一个空间中的点映射到另一个较小维度的空间中的线性变换。
4.2 表示投影矩阵可以用一个矩阵来表示,形如P = [p1, p2, p3],其中pi表示投影矩阵的每一列。
列表五:投影矩阵的应用5.1 降维在机器学习中,降维是一项重要任务。
投影矩阵、最小二乘法和SVD 分解 投影矩阵广泛地应用在数学相关学科的各种证明中,但是由于其概念比较抽象,所以比较难理解。
这篇文章主要从最小二乘法的推导导出投影矩阵,并且应用SVD 分解,写出常用的几种投影矩阵的形式。
问题的提出 已知有一个这样的方程组: Ax b =
其中,,,m n n A R x b R ⨯∈∈
● 当m=n 时,且()ran A n =时,这是一个适定方程组,有唯一解1x A b -=
● 当m <n 时,或者()ran A n <时,这是一个欠定方程组,有无穷多个解。
对于这种情况,我们使用()ran A 中与b 距离最近的向量对应的x 作为最小二乘解。
而相应的()ran A 中的这个向量就是b 在空间()ran A 中的投影。
最小二乘法
几何解法。
投影矩阵的推导(OpenGL D3D)OpenGL矩阵推导——模型视图变化在三维编程中,模型视图变换是从三维世界到二维屏幕中一个很重要的变换,但是这个变换往往很多人都不太理解,要么是事而非。
而这方面的文章不是太少就是讲的太浅没有真正的理解模型视图变换,本人在这个过程中曾经走过很多歪路,不过好在最终在自己的不懈努力下终于降伏了这只猛虎。
本人就以自己的理解,通过矩阵推导过程一步一步来了解模型视图变化,最后通过两个OpenGl的程序来进一步理解模型视图矩阵。
先从一个基本的模型视图—透视投影变换讲起。
透射投影是将相机空间中的点从视锥体(frustum)变换到规则观察体(Canonical View Volume 以下简称CVV)中,待裁剪完毕后进行透视除法的行为。
透视投影变换是令很多刚刚进入3D图形领域的开发人员感到迷惑乃至神秘的一个图形技术。
其中的理解困难在于步骤繁琐,对一些基础知识过分依赖,一旦对它们中的任何地方感到陌生,立刻导致理解停止不前。
主流的3D APIs 都把透射投影的具体细节进行了封装,从而只需一个函数便可生成一个透射投影矩阵比如gluPerspective(),使得我们不需要了解其算法便可实现三维到二维的转化,然而实事是,一些三维图形或游戏开发人员遇到一些视图矩阵的问题往往会不知所措,比如视景体裁剪。
以下部分内容是从别处那转过来的,主要感谢Twinsen和一个叫丁欧南的高中生。
透视投影变换是在齐次坐标下进行的,而齐次坐标本身就是一个令人迷惑的概念,这里我们先把它理解清楚。
齐次坐标对于一个向量v以及基oabc,可以找到一组坐标(v1,v2,v3),使得v = v1 a + v2 b + v3 c (1)而对于一个点p,则可以找到一组坐标(p1,p2,p3),使得p–o = p1 a + p2 b + p3 c (2)从上面对向量和点的表达,我们可以看出为了在坐标系中表示一个点(如p),我们把点的位置看作是对这个基的原点o所进行的一个位移,即一个向量——p –o(有的书中把这样的向量叫做位置向量——起始于坐标原点的特殊向量),我们在表达这个向量的同时用等价的方式表达出了点p:p = o + p1 a + p2 b + p3 c (3)(1)(3)是坐标系下表达一个向量和点的不同表达方式。
投影矩阵的计算过程投影矩阵是一种线性变换矩阵,用于将三维空间中的点投影到二维平面上。
投影矩阵在计算机图形学和计算机视觉中经常被使用,例如生成透视投影效果或者在三维场景中进行物体检测。
在计算过程中,首先需要确定投影平面。
常见的投影平面有平行投影平面和透视投影平面两种。
平行投影平面与三维空间平行,通常用于绘制平行投影效果。
透视投影平面通过一个视点与投影平面的插值方式计算投影效果,模拟真实世界中的透视效果。
下面分别介绍平行投影矩阵和透视投影矩阵的计算过程。
1.平行投影矩阵计算过程:平行投影矩阵使用一个正交投影矩阵生成,平行投影矩阵的计算过程如下:1.1确定投影平面的尺寸:根据需要确定投影平面的长度和宽度。
1.2计算投影矩阵的元素:在平行投影矩阵中,x、y、z三个坐标轴的长度比例通常是相同的。
首先,需要确定x和y方向上的比例系数,通常是投影平面的长度和宽度的倒数。
然后,z方向上的比例系数由投影平面的远近关系决定,如果投影平面的远近关系与三维场景的z方向相同,则比例系数为正,否则为负。
最后,将这三个比例系数填入平行投影矩阵的对角线位置上,其他位置上的元素为0。
1.3平移投影平面:平行投影矩阵只能将点投影到位于原点的平面上,如果需要将投影平面平移至指定的位置,可以通过在平行投影矩阵中添加平移矩阵来实现。
平移矩阵的计算过程可以参考矩阵乘法操作。
2.透视投影矩阵计算过程:透视投影矩阵将三维空间中的点投影到一个透视投影平面上,通常通过一个视点与投影平面的插值方式计算投影效果。
2.1确定投影平面的尺寸:根据需要确定投影平面的长度和宽度。
2.2确定视点的位置:根据需要确定视点在三维空间中的位置,常见的视点位置是位于投影平面后方的一些点。
2.3计算透视投影矩阵的元素:透视投影矩阵的元素计算与平行投影矩阵类似,首先需要确定x和y方向上的比例系数,通常是投影平面的长度和宽度的倒数。
然后,z方向上的比例系数由视点与投影平面的插值方式计算,可以根据视点的位置和投影平面的位置来计算出比例系数。
投影矩阵的计算过程投影矩阵的计算过程3d模型经过世界坐标变换、相机坐标变换后,下⼀步需要投影变换。
投影变换的⽬的就是要把相机空间转换到标准视图空间,在这个空间的坐标都是正规化的,也就是坐标范围都在[-1,1]之间,之所以转换到这个空间是为了后续操作更⽅便。
下⾯的讨论都是以列向量来表⽰,这样在变换操作时,采⽤的是矩阵左乘法,如果采⽤的是⾏向量的话,那就相反,矩阵右乘法即是向量在左边乘以变换矩阵。
采⽤哪种表⽰并不影响结果,只需要把该种表⽰下得出的变换矩阵转置⼀下,就是采⽤另外⼀种表⽰模式需要的结果。
常见的投影有两种,正交投影和透视投影,正交投影相对来说更简单,所以先来看看正交投影。
最简单的正交变换矩阵1 0 0 00 1 0 00 0 0 1这个正交变换是不可逆变换,变换后x和y保留,z变成了0,在实际应⽤中,更常见的情况是限定x、y、z在⼀定的范围内的进⾏投影变换,⽐如x[l,r],y[b,t],z[n,f]。
那么要把这段空间中的点变换到-1和1之间,只要完成两个变换,⾸先把坐标轴移到中⼼,然后进⾏缩放就可以了。
采⽤列向量的话,那就是缩放矩阵乘以平移矩阵。
2/(r-l) 0 0 0 1 0 0 -(r+l)/2 2/(r-l) 0 0 -(r+l)/(r-l)0 2/(t-b) 0 0 x 0 1 0 -(b+t)/2 = 0 2/(t-b) 0 -(t+b)/(t-b)0 0 2/(f-n) 0 0 0 1 -(n+f)/2 0 0 2/(f-n) -(f+n)/(f-n)0 0 0 1 0 0 01 0 0 0 1透视投影类⽐于我们⼈眼系统,看⼀个物体,会有远⼩近⼤的效果。
在转换到相机空间后,相机是这个空间的原点,和正交投影体是⼀个长⽅体或者⽴⽅体不同,透视投影体是⼀个锥体被近平⾯截取掉头部剩下的空间。
假定仍然采⽤上⾯的坐标表⽰。
在透视投影下,空间上⾯的任何⼀点P投影到近平⾯上某点q,通过三⾓⼏何学我们可以得到q x=p x*n/p z ,y点同理。
OpenGL学习脚印:投影矩阵的推导OpenGL学习脚印: 投影矩阵的推导写在前面本节内容翻译和整理自songho的博客《OpenGL Projection Matrix》内容,以供自己和初学者熟悉投影矩阵推导过程。
通过本节,你可以了解到:•投影矩阵计算的阶段•透视投影和正交投影的矩阵推导本节的要点就在于: 阅读时,自己拿笔推导一遍。
1.概览计算机屏幕是2维的,OpenGL渲染的3D场景必须以2D形式的图像投影到屏幕上。
GL_PROJECTION 矩阵就是用来设置投影变换的。
首先,它将所有顶点从眼坐标(照相机坐标)转换到裁剪坐标系下。
然后,这些裁剪坐标通过透视除法,即除以裁剪坐标中w分量,转换到归一化设备坐标系(NDC)。
一个由视锥裁剪的三角形因此,我们要记住,裁剪(视锥剔除frustum culling)和NDC转换都集成到了GL_PROJECTION 矩阵。
接下来的部分描述了怎么样通过left, right, bottom, top, near and far 这6个界限参数来构造投影矩阵。
注意:视锥剔除是在裁剪坐标系中进行的,并且恰好在透视除法之前进行。
裁剪坐标xc, yc 和 zc 通过与wc比较来进行测试。
如果某个坐标值比Wc小或者比Wc大,那么这个顶点将被丢弃。
然后,OpenGL会重新在裁剪进行的地方构造多边形的边缘。
补充内容:实际上,眼坐标系下坐标在乘以投影矩阵后,裁剪测试和透视除法都是由GPU来执行的。
而后面这两个过程处理的裁剪坐标系数据都是由投影矩阵变换的。
1. 裁剪测试也即视锥剔除-Wc < Xc,Yc,Zc < Wc2. NDC透视除法Xn = Xc / Wc Yn = Yc / Wc Zn = Zc / Wc这里需要注意的是,我们在构造16个参数的投影矩阵的同时,不仅要考虑到裁剪,还要考虑到透视除法的过程。
这样,最终的NDC坐标才会满足:-1 < Xn,Yn,Zn < 12.透视投影在透视投影中,在眼坐标下截头椎体(a truncated pyramid frustum)内的3D点被映射到NDC下一个立方体中;x坐标从[l,r]映射到[-1,1],y坐标从[b,t]映射到[-1,1],z坐标从[n,f]映射到[-1,1]。
基于消失点的逆透视投影矩阵计算逆透视投影矩阵可以通过消失点的坐标计算得到。
首先需要确定三个消失点:水平消失点、垂直消失点和斜线消失点。
然后可以使用以下步骤计算逆透视投影矩阵:1. 计算消失线的方程:水平消失线的方程:hx + by + c = 0垂直消失线的方程:vx + dy + f = 0斜线消失线的方程:lx + my + n = 02. 将方程转化为齐次坐标形式:水平消失线的方程:[h, b, c]垂直消失线的方程:[v, d, f]斜线消失线的方程:[l, m, n]3. 计算消失点的齐次坐标:水平消失点:HP = [h, b, c] x [v, d, f] = [bf - cd, ac - vf, ae - bv] 垂直消失点:VP = [h, b, c] x [l, m, n] = [bn - cm, al - hn, am - bl]斜线消失点:LP = [v, d, f] x [l, m, n] = [dm - fn, hl - dm, fl - hk]4. 将消失点的齐次坐标转化为非齐次坐标:水平消失点:HP_tilde = [HP.x / HP.z, HP.y / HP.z, 1]垂直消失点:VP_tilde = [VP.x / VP.z, VP.y / VP.z, 1]斜线消失点:LP_tilde = [LP.x / LP.z, LP.y / LP.z, 1]5. 构建逆透视投影矩阵:[ HP_tilde.x, HP_tilde.y, HP_tilde.z, 0 ][ VP_tilde.x, VP_tilde.y, VP_tilde.z, 0 ][ LP_tilde.x, LP_tilde.y, LP_tilde.z, 0 ][ 0, 0, 0, 1 ]这样得到的逆透视投影矩阵可以用于将透视投影图像恢复为原始平面图像。
正交投影矩阵公式正交投影矩阵公式是一种常用的数学计算公式,它可以将投影空间中的一组点映射到另一组点上,并使其保持其形状和大小不变。
它可以帮助我们在几何和图像处理中实现许多有趣的功能,例如,它可以将一个投影空间中的点映射到另一个投影空间中,以及将一个投影空间中的点映射到另一个投影空间中。
正交投影矩阵公式定义如下:P=A(A^T)^-1A^T其中,A为一个m*n矩阵,m为投影空间的维度,n为点的维度,P为一个m*n矩阵,用于描述将空间中点映射到另一个投影空间中的转换关系。
正交投影矩阵公式可以用来实现多种功能,例如,它可以用来实现投影空间的缩放、平移、旋转和镜像等变换。
此外,它还可以用来实现图像处理中的图像缩放、图像平移、图像旋转和图像镜像等功能。
正交投影矩阵公式的特点是,它具有非常简单的算法,可以快速实现投影空间的变换。
另外,它还具有可扩展性,可以根据空间变换的需求来调整参数,以达到最佳的效果。
正交投影矩阵公式在几何和图像处理领域中非常常用,它可以帮助我们实现几何和图像处理中的多种功能。
因此,正交投影矩阵公式非常重要,我们可以借助它来实现投影空间的变换,以及图像处理中的图像缩放、图像平移、图像旋转和图像镜像等功能。
此外,正交投影矩阵公式还可以用于计算投影空间中的点之间的距离,从而实现有效的空间变换。
例如,我们可以使用正交投影矩阵公式计算空间中的点之间的距离,从而实现投影空间的缩放、平移、旋转和镜像变换。
总之,正交投影矩阵公式是一种重要的数学计算公式,它可以帮助我们实现投影空间的缩放、平移、旋转和镜像变换,以及图像处理中的图像缩放、图像平移、图像旋转和图像镜像等功能。
正交投影矩阵公式的使用方法简单,可扩展性强,具有很多优点,因此,它在几何和图像处理领域中有着重要的应用价值。
视锥就是场景中的一个三维空间,它的位置由视口的摄像机来决定。
这个空间的形状决定了摄像机空间中的模型将被如何投影到屏幕上。
透视投影是最常用的一种投影类型,使用这种投影,会使近处的对象看起来比远处的大一些。
对于透视投影,视锥可以被初始化成金字塔形,将摄像机放在顶端。
这个金字塔再经过前、后两个剪切面的分割,位于这两个面之间的部分就是视锥。
只有位于视锥内的对象才可见。
视锥由凹视野(在上图中,变量投影矩阵是一个典型的缩放和透视矩阵。
投影变换将视锥变换成一个直平行六面体的形状。
因为视锥的近处比远处小,这样就会对靠近摄像机的对象起到放大的作用,也就将透视应用到了场景当中。
在视锥中,摄像机与空间原点间的距离被定义为变量视矩阵将摄像机放置在场景的原点。
又因为投影矩阵需要将摄像机放在将两个矩阵相乘,得到下面的矩阵:下图显示了透视变换如何将一个视锥变换成一个新的坐标空间。
注意:锥形体变成了直平行六面体,原点从场景的右上角移到了中心。
在透视变换中,这个矩阵基于一定的距离(这个距离是从摄像机到邻近的剪切面)对对象进行平移和旋转,但是它没有考虑到视野(在这个矩阵中,在程序中,使用视野角度来定义x和y缩放系数比使用视口的水平和垂直尺寸(在摄像机空间中)并不方便多少。
下面两式使用了视口的尺寸,并且与上面的公式相等:在这些公式中,Zn表示邻近的剪切面的位置,变量Vw和Vh表示视口的高和宽。
这两个参数与D3DVIEWPORT2结构中的dwWidth和dwHeight成员相关。
不管你使用那个公式,将同世界和视变换一样,可以调用下面的D3DMATRIX ProjectionMatrix(const float near_plane,// distance to near clipping planeconst float far_plane,// distance to far clipping planeconst float fov_horiz,// horizontal field of view angle, in radiansconst float fov_vert)// vertical field of view angle, in radians {float h, w, Q;w = (float)cot(fov_horiz*0.5);h = (float)cot(fov_vert*0.5);Q = far_plane/(far_plane - near_plane);D3DMATRIX ret = ZeroMatrix();ret(0, 0) = w;ret(1, 1) = h;ret(2, 2) = Q;ret(3, 2) = -Q*near_plane;ret(2, 3) = 1;return ret;} // end of ProjectionMatrix()一旦创建完了矩阵,你需要调用一个顶点经过世界、观察和投影变换之后,下图展示了一个不适合的投影矩阵,和一个经过缩放的适合的矩阵:在前面的矩阵中,所有的变量都被假定为非零。
透视投影矩阵的推导视锥体如图,近截⾯与远截⾯之间构成的这个四棱台就是视锥体,⽽透视投影矩阵的任务就是把位于视锥体内的物体的顶点X,Y,Z坐标映射到[-1,1]范围。
这就相当于把这个四棱台扭曲变形成⼀个⽴⽅体。
这个⽴⽅体叫做规则观察体 (Canonical View Volume, CVV)。
如下图:变换⽅法或规则:如下图,有⼀点P,位于视锥体内,设坐标为(x,y,z).分别对x,y坐标和z坐标的变换到[-1,1]的⽅式进⾏讨论:1.x,y坐标的变换⽅式:(1)连接视点eye与P点与近裁剪⾯交于P’点(2)设近裁剪⾯的宽度为W,⾼度为H,P’点的x坐标范围是[-W/2,W/2],y坐标范围是[-H/2,H/2],然后分别线性映射⾄[-1,1]内即可。
2.z坐标的变换⽅式z坐标的范围是N⾄F,需要映射到[-1,1],映射⽅法暂时按下,不做想法。
透视投影函数形式void Matrix4X4::initPersProjMatrix(float FOV, const float aspect, float zNear, float zFar) 透视投影矩阵构建函数的参数:Fov:纵向的视⾓⼤⼩aspect:裁剪⾯的宽⾼⽐zNear:近裁剪⾯离摄像机的距离,图中的nzFar:远裁剪⾯离摄像机的距离,图中的f通过这⼏个参数和三⾓函数的数学知识可以求得近裁剪⾯的⾼度,参考上图:求得点P在近裁剪⾯的投影点P’的坐标根据相似三⾓形对应边长度的⽐率相同,由图可得其中x’,y’的范围沿原点对称,只要将他们分别除以W/2,H/2,即可以使范围位于[-1,1]内。
前⾯已求得W,H,因此:假设我们最后需要的坐标点P’’即是推导矩阵然后为了⾃动化的得到这个结果,我们使⽤矩阵这种数学⼯具,将⼀个矩阵乘以⼀个向量,得到⼀个新的向量,使得我们所有的运算步骤和运算数据蕴藏在矩阵和乘法中。
下⾯的⼯作就是寻找到⼀个矩阵使得:我们发现求解很难找出合适的m00、m02,因为左边x和z是以加法的形式相邻,右边z确成为了x的分母。
线性代数笔记18投影矩阵和最小二乘线性代数笔记18——投影矩阵和最小二乘 - 我是8位的 - 博客园一维空间的投影矩阵先来看一维空间内向量的投影:向量p是b在a上的投影,也称为b在a上的分量,可以用b乘以a方向的单位向量来计算,现在,我们打算尝试用更“贴近”线性代数的方式表达。
因为p趴在a上,所以p实际上是a的一个子空间,可以将它看作a放缩x倍,因此向量p可以用p = xa来表示,只要找出x就可以了。
因为a⊥e,所以二者的点积为0:我们希望化简这个式子从而得出x:x是一个实数,进一步得到x:a T b和a T a都是点积运算,最后将得到一个标量数字。
这里需要抑制住消去a T的冲动,向量是不能简单消去的,a和b 都是2×1矩阵,矩阵的运算不满足乘法交换律,a T无法先和1/a T计算。
现在可以写出向量p的表达式,这里的x是个标量:这就是b在a上的投影了,它表明,当b放缩时,p也放缩相同的倍数;a放缩时,p保持不变。
由于向量点积a T a是一个数字,p可以进一步写成:在一维空间中,分子是一个2×2矩阵,这说明向量b的在a上的投影p是一个矩阵作用在b上得到的,这个矩阵就叫做投影矩阵(Projection Matrix),用大写的P表达:推广到n维空间,a是n维向量,投影矩阵就是n×n的方阵。
观察投影矩阵会法发现,它是由一个列向量乘以一个行向量得到的:可以看出aa T的列向量是线性相关的,所以它的列空间和行空间的维度都是1,这说明它的秩是1,aa T是一个秩一矩阵,并且是一个对称矩阵。
由于a T a是一个标量,所以aa T决定了投影矩阵的性质:投影矩阵还有另外一个性质:它的几何意义是,对一个向量投影两次和投影一次相同,b在a上的投影是p,再投影一次仍然是p。
向量投影到子空间有什么意义呢?这要从方程Ax = b说起。
对于Ax = b来说,并不是任何时候都有解,实际上大多数这种类型的方程都无解。
投影矩阵的计算过程3d模型经过世界坐标变换、相机坐标变换后,下一步需要投影变换。
投影变换的目的就是要把相机空间转换到标准视图空间,在这个空间的坐标都是正规化的,也就是坐标范围都在[-1,1]之间,之所以转换到这个空间是为了后续操作更方便。
下面的讨论都是以列向量来表示,这样在变换操作时,采用的是矩阵左乘法,如果采用的是行向量的话,那就相反,矩阵右乘法即是向量在左边乘以变换矩阵。
采用哪种表示并不影响结果,只需要把该种表示下得出的变换矩阵转置一下,就是采用另外一种表示模式需要的结果。
常见的投影有两种,正交投影和透视投影,正交投影相对来说更简单,所以先来看看正交投影。
最简单的正交变换矩阵 1 0 0 0 0 1 0 0 0 0 0 1 这个正交变换是不可逆变换,变换后x和y保留,z变成了0,在实际应用中,更常见的情况是限定x、y、z在一定的范围内的进行投影变换,比如x[l,r],y[b,t],z[n,f]。
那么要把这段空间中的点变换到-1和1之间,只要完成两个变换,首先把坐标轴移到中心,然后进行缩放就可以了。
采用列向量的话,那就是缩放矩阵乘以平移矩阵。
2/(r-l) 0 0 0 1 0 0 -(r+l)/2 2/(r-l) 0 0 -(r+l)/(r-l) 0 2/(t-b) 0 0 x 0 1 0 -(b+t)/2 = 0 2/(t-b) 0 -(t+b)/(t-b) 0 0 2/(f-n) 0 0 0 1 -(n+f)/2 0 0 2/(f-n) -(f+n)/(f-n) 0 0 0 1 0 0 0 1 0 0 0 1 透视投影类比于我们人眼系统,看一个物体,会有远小近大的效果。
在转换到相机空间后,相机是这个空间的原点,和正交投影体是一个长方体或者立方体不同,透视投影体是一个锥体被近平面截取掉头部剩下的空间。
假定仍然采用上面的坐标表示。
在透视投影下,空间上面的任何一点P投影到近平面上某点q,通过三角几何学我们可以得到qx=px*n/pz ,y点同理。
假定直接投影到近平面,则该矩阵很简单,用Ma表示下面的矩阵1 0 0 0 0 1 0 0 0 0 1 0 0 0 1/n 0 则齐次空间某点(x,y,z ,1)被该矩阵转换后变成了(x ,y z, z/n) ,除以z/n,则变成了(nx/z,ny/z,n ,1) 正好吻合上面的公式。
undefined
但是我们知道投影变换需要把坐标变换到-1和1之间,假定先不考虑z轴的变换,在x轴和y轴上面经过上述变换后,已经投影在近平面了,假设近平面xy在[l,r] 和[b,t]之间了,因此只需要和上面的正交投影一样,进行平移和缩放操作就可以了,平移矩阵Mb为 1 0 0 -(l+r)/2 0 1 0 -(t+p)/2 0 0 1 -(f+n)/2 0 0 0 1 以及缩放矩阵Mc 2/(r-l) 0 0 0 0 2/(t-b) 0 0 0 0 2/(f-n) 0 0 0 0 1 McXMbXMa 得到的矩阵为2/(r-l) 0 -(r+l)/(n*(r-l))0 0 2/(t-b) -(t+b)/(n*(t-b)) 0 0 0 j k 0 0 1/n 0 j k 为未知数,这个矩阵也可以同时乘以n,则变为2n/(r-l) 0 -(r+l)/(r-l) 0 0 2n/(t-b) -(t+b)/(t-b) 0 0 0 j k 0 0 1 0 为了求解J k,我们需要把z变换到-1 和1 因此当z=n时为-1,z=f时为1 (j*n+k)/n= j+k/n=-1; 同理j+k/f=1; 得到k=2f*n/(n-f) j=-(n+f)/(n-f) 代入上面的矩阵,就得出通用的正交变换矩阵。
而且在一般情况下r=-l ,b=-t
因此上述矩阵可以简化为n/r 0 0 0 0 n/t 0 0 0 0 -(n+f)/(n-f) 2f*n/(n-f) 0 0 1 0 n/r 和n/t可以进一步简化成水平半视角和垂直半视角的三角函数来表示,而水平视角和垂直视角和透视窗口的宽高比有是成正比的,最终上面两行可以用宽高
比和某个半视角的余切来表示。
这是在列向量情况下得出的投影矩阵,如果采用行向量,只需要把上面的矩阵转置一下即可。