透视投影矩阵推导
- 格式:pdf
- 大小:331.79 KB
- 文档页数:11
深⼊解析投影矩阵的数学⽅法
齐次空间
要理解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⽅向的平移量
设备空间。
透视投影矩阵
第一章什么是透视投影矩阵
透视投影矩阵是一种用于计算三维图形在二维屏幕上的投影的数学工具。
它的目的是模拟
人眼的视觉效果,即把远处的物体变得小一些,近处的物体变得大一些。
这样,我们就可
以在二维屏幕上看到一个有深度的三维图形。
第二章透视投影矩阵的基本概念
透视投影矩阵是一个 4x4 的矩阵,它的前三行用来表示投影的方向,第四行用来表示投
影的位置。
其中,最重要的参数是视点(也称为相机位置)和观察点(也称为目标位置)。
视点表示相机所在的位置,观察点表示相机正在观察的物体的位置。
还有一个重要的参数是上方向,它用来表示相机的方向。
第三章透视投影矩阵的计算
透视投影矩阵的计算涉及到三维向量的运算。
首先,需要计算出视线向量,它是从视点指
向观察点的向量。
然后,需要计算出上方向向量。
最后,需要计算出右方向向量。
这三个
向量是透视投影矩阵的基本元素,我们可以根据这三个向量来构造透视投影矩阵。
第四章透视投影矩阵的应用
透视投影矩阵在计算机图形学中有广泛的应用。
它可以用来实现 3D 游戏中的视角转换、图形变换和光照效果。
此外,透视投影矩阵还可以用来模拟不同的相机焦距效果,例如广角镜头和望远镜。
总的来说,透视投影矩阵是计算机图形学中不可或缺的重要工具。
三维投影到二维的变换公式
在计算机图形学中,三维物体经常需要投影到二维平面上显示。
这个过程涉及到从三维空间到二维空间的变换。
下面是三维投影到二维的变换公式:
1. 正交投影
对于正交投影,变换公式如下:
x' = x
y' = y
z' = 0
其中x、y、z是三维物体的坐标,x'、y'、z'是投影后二维平面上的坐标。
2. 透视投影
对于透视投影,变换公式如下:
x' = x/z
y' = y/z
z' = z/d
其中d是观察者到投影平面的距离。
这个公式可以通过矩阵乘法表示:
[x' y' z' 1] = [x y z 1] * [1 0 0 0;
0 1 0 0;
0 0 1/d 0;
0 0 0 1]
这个矩阵被称为透视投影矩阵。
以上就是三维投影到二维的变换公式。
在实际应用中,可以根据需要选择正交投影或透视投影。
深入探索透视投影变换最近更新:2013年11月22日-Twinsen编写-本人水平有限,疏忽错误在所难免,还请各位数学高手、编程高手不吝赐教-email: popyy@透视投影是3D固定流水线的重要组成部分,是将相机空间中的点从视锥体(frustum)变换到规则观察体(Canonical View Volume)中,待裁剪完毕后进行透视除法的行为。
在算法中它是通过透视矩阵乘法和透视除法两步完成的。
透视投影变换是令很多刚刚进入3D图形领域的开发人员感到迷惑乃至神秘的一个图形技术。
其中的理解困难在于步骤繁琐,对一些基础知识过分依赖,一旦对它们中的任何地方感到陌生,立刻导致理解停止不前。
没错,主流的3D APIs如OpenGL、D3D的确把具体的透视投影细节封装起来,比如gluPerspective(…)就可以根据输入生成一个透视投影矩阵。
而且在大多数情况下不需要了解具体的内幕算法也可以完成任务。
但是你不觉得,如果想要成为一个职业的图形程序员或游戏开发者,就应该真正降伏透视投影这个家伙么?我们先从必需的基础知识着手,一步一步深入下去(这些知识在很多地方可以单独找到,但我从来没有在同一个地方全部找到,但是你现在找到了 )。
我们首先介绍两个必须掌握的知识。
有了它们,我们才不至于在理解透视投影变换的过程中迷失方向(这里会使用到向量几何、矩阵的部分知识,如果你对此不是很熟悉,可以参考《向量几何在游戏编程中的使用》系列文章)。
齐次坐标表示透视投影变换是在齐次坐标下进行的,而齐次坐标本身就是一个令人迷惑的概念,这里我们先把它理解清楚。
根据《向量几何在游戏编程中的使用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)是坐标系下表达一个向量和点的不同表达方式。
投影矩阵的计算过程投影矩阵的计算过程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点同理。
基于消失点的逆透视投影矩阵计算逆透视投影矩阵可以通过消失点的坐标计算得到。
首先需要确定三个消失点:水平消失点、垂直消失点和斜线消失点。
然后可以使用以下步骤计算逆透视投影矩阵: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 ]这样得到的逆透视投影矩阵可以用于将透视投影图像恢复为原始平面图像。
投影矩阵的充要条件投影矩阵是线性代数中一个重要的概念,它在计算机图形学、机器学习等领域有着广泛的应用。
在理解投影矩阵的性质和特点时,我们需要了解它的充要条件。
一、什么是投影矩阵投影矩阵是一个方阵,它可以将一个向量投影到一个低维的子空间上。
具体来说,对于一个n维向量空间V中的向量x,如果存在一个n×n的矩阵P,使得Px=x,那么矩阵P就是一个投影矩阵。
二、投影矩阵的性质1. 幂等性:投影矩阵的平方等于它本身,即P²=P。
这是因为对于任意向量x,Px再次投影到子空间上仍然等于x。
2. 对称性:投影矩阵是对称矩阵,即P^T=P。
这是因为对于任意向量x和y,有x^TPy=y^TPx,即x和y的投影结果相同。
3. 特征值:投影矩阵的特征值只能是0或1。
证明如下:设P是一个投影矩阵,λ是它的特征值,v是对应于λ的特征向量。
则有Pv=λv。
由于P是幂等矩阵,有P²=P,所以Pv=P²v=P(Pv)=P(λv)=λPv=λ²v。
由于v不为零,所以λ²=λ,即λ=0或1。
三、投影矩阵的充要条件可以通过其性质来推导得出。
设P是一个n×n的矩阵,满足P²=P,P^T=P,且所有特征值都是0或1。
我们需要证明P是一个投影矩阵。
首先,由于P是对称矩阵,可以对它进行对角化,即存在一个正交矩阵Q和一个对角矩阵D,使得P=QDQ^T。
由于P是幂等矩阵,有P²=P,即(QDQ^T)²=QDQ^T。
展开得到QD²Q^T=QDQ^T,即D²=D。
由于D是对角矩阵,所以D的对角元素只能是0或1。
因此,P的特征值只能是0或1。
其次,我们需要证明P满足Px=x。
对于任意向量x,有Px=QDQ^Tx=QD(Q^Tx)。
由于D是对角矩阵,所以Q^Tx是一个向量,记作y。
则有Px=QDy=Q(Dy)=Q(Dy)=Qy=x。
因此,P满足Px=x。
透视转换矩阵与坐标运算透视转换矩阵是一种将二维图像投影到三维视平面的变换矩阵。
通过透视转换,可以将三维空间中的物体或场景映射到二维平面上,同时保留物体的远近和透视效果。
在透视转换中,需要将三维空间中的坐标转换为二维平面上的坐标。
这个过程需要使用透视转换矩阵,该矩阵由一系列参数确定,这些参数包括投影中心点、视平面法向量、透视宽度和高度等。
具体来说,透视转换矩阵可以将三维空间中的点P(x, y, z)映射到二维平面上的点P'(x', y')。
这个映射过程可以通过以下公式实现:x' = (x * near) / (z * far - near)y' = (y * near) / (z * far - near)其中,near和far分别是视平面到投影中心的距离和无穷远处的距离,它们是透视转换矩阵的重要参数。
在进行透视转换时,还需要注意坐标的齐次化处理。
齐次化处理是一种将坐标从笛卡尔坐标系转换为齐次坐标系的方法,其中每个坐标都增加了一个额外的维度w。
通过将坐标转换为齐次坐标,可以方便地进行透视转换和插值操作。
在齐次坐标系中,任意一个点P的坐标可以表示为P(x, y, z, w),其中(x, y, z)是点P 在三维空间中的位置坐标,w是一个标量值。
在进行透视转换时,需要将齐次坐标中的w值除以z值,以获得正确的二维平面上的坐标。
总之,透视转换矩阵和坐标运算是实现三维图形渲染和变换的关键技术。
通过透视转换矩阵,可以将三维空间中的物体映射到二维平面上,同时保留物体的远近和透视效果。
在进行透视转换时,需要注意坐标的齐次化处理和插值操作,以确保图形渲染的准确性和流畅性。
成像的过程实质上是几个坐标系的转换。
首先空间中的一点由世界坐标系转换到摄像机坐标系,然后再将其投影到成像平面(图像物理坐标系),最后再将成像平面上的数据转换到图像平面(图像像素坐标系)。
1透视投影公式
1.1世界坐标系转摄像机坐标系
公式如下:
其中,R为旋转矩阵,T为平移矩阵,右侧矩阵是世界坐标系坐标点,左侧是摄像机坐标系坐标点。
R旋转矩阵表示的是摄像机在世界坐标系中绕X,Y,Z旋转的程度,平移矩阵表示的是摄像机在世界坐标系中里世界坐标原点的程度。
R矩阵为3*3的正交矩阵,T为3*1的矩阵。
绕x,y, z轴旋转的矩阵分别如下:
1.2 摄像机坐标系转图像物理坐标系公式如下:
f是焦距
1.3图像物理坐标系转图像像素坐标系
公式如下:
每个像素沿x轴的实际物理尺寸大小是dx,沿y轴的实际物理尺寸大小是dy,单位值毫米。
图像物理坐标系原点在图像像素坐标系中记为(u0,v0)
2.代码
3.逆映射相关
逆映射是将图像像素坐标系坐标点,提供已知的内外参数逆映射到真实世界坐标点。
3.1 像素坐标系到物理坐标系
internalMatrix是相机内参数,取其逆矩阵与像素坐标点相乘,得物理坐标点。
3.2 物理坐标到摄像机坐标
先求得焦距的矩阵,取其逆矩阵与物理坐标点相乘,再乘以缩放因子即可得摄像机坐标点(缩放因子目前不知,暂时全部设为250)3.3 摄像机坐标到真实坐标点
先求得旋转矩阵和平移矩阵,合并两个矩阵之后,取其逆矩阵,让该
逆矩阵与摄像机坐标点相乘,即可得真实世界坐标点。
透视投影详解透视投影透视投影是⽤中⼼投影法将形体投射到投影⾯上,从⽽获得的⼀种较为接近视觉效果的单⾯投影图。
它具消失感、距离感、相同⼤⼩的形体呈现出有规律的变化等⼀系列的透视特性,能逼真地反映形体的空间形象。
透视投影也称为透视图,简称透视。
在建筑设计过程中,透视图常⽤来表达设计对象的外貌,帮助设计构思,研究和⽐较建筑物的空间造型和⽴⾯处理,是建筑设计中重要的辅助图样。
透视投影符合⼈们⼼理习惯,即离视点近的物体⼤,离视点远的物体⼩,远到极点即为消失,成为灭点。
它的视景体类似于⼀个顶部和底部都被切除掉的棱椎,也就是棱台。
这个投影通常⽤于动画、视觉仿真以及其它许多具有真实性反映的⽅⾯。
在平⾏投影中,图形沿平⾏线变换到投影⾯上;对透视投影,图形沿收敛于某⼀点的直线变换到投影⾯上,此点称为投影中⼼,相当于观察点,也称为视点。
平⾏投影和透视投影区别在于透视投影的投影中⼼到投影⾯之间的距离是有限的,⽽平⾏投影的投影中⼼到投影⾯之间的距离是⽆限的。
当投影中⼼在⽆限远时,投影线互相平⾏,所以定义平⾏投影时,给出投影线的⽅向就可以了,⽽定义透视投影时,需要指定投影中⼼的具体位置平⾏投影保持物体的有关⽐例不变,这是三维绘图中产⽣⽐例图画的⽅法。
物体的各个⾯的精确视图可以由平⾏投影得到。
另⼀⽅⾯,透视投影不保持相关⽐例,但能够⽣成真实感视图。
对同样⼤⼩的物体,离投影⾯较远的物体⽐离投影⾯较近物体的投影图象要⼩,产⽣近⼤远⼩的效果.透视投影的原理和实现by Goncely摘要:透视投影是3D渲染的基本概念,也是3D程序设计的基础。
掌握透视投影的原理对于深⼊理解其他3D渲染管线具有重要作⽤。
本⽂详细介绍了透视投影的原理和算法实现,包括透视投影的标准模型、⼀般模型和屏幕坐标变换等,并通过VC实现了⼀个演⽰程序。
1 概述在计算机三维图像中,投影可以看作是⼀种将三维坐标变换为⼆维坐标的⽅法,常⽤到的有正交投影和透视投影。
正交投影多⽤于三维健模,透视投影则由于和⼈的视觉系统相似,多⽤于在⼆维平⾯中对三维世界的呈现。
平面向量的投影变换和投影矩阵平面向量是在平面上运动的矢量,具有大小和方向。
在平面向量的运动中,我们经常会遇到投影变换和投影矩阵的概念。
本文将介绍平面向量的投影变换以及相关的投影矩阵。
1. 投影变换投影变换是指将一个对象在某一方向上的投影映射到另外一个平面的变换。
对于平面向量的投影变换,我们主要关注的是它在某一方向上的投影。
给定一个平面向量A,我们希望将它在方向A上的投影映射到另一个平面。
我们可以通过计算向量A在方向A上的分量来实现投影变换。
具体地,设向量A的单位向量为A,向量A在方向A上的投影为A,那么投影变换可以表示为:A = (A·A)A其中,A·A表示向量内积。
这个公式可以通过向量的投影定义推导得到。
2. 投影矩阵投影矩阵是一种特殊的矩阵,可以用来实现平面向量的投影变换。
具体来说,对于一个平面向量的投影变换,我们可以使用一个矩阵来进行表示,这个矩阵就是投影矩阵。
设向量A在方向A上的投影为A,向量A的单位向量为A,那么投影矩阵A可以表示为:A = AA^A其中,A^A表示向量A的转置。
投影矩阵具有一些特殊的性质。
首先,投影矩阵是对称矩阵,即A^A = A。
其次,投影矩阵的平方等于它本身,即A^2 = A。
这些性质保证了投影矩阵的有效性。
3. 投影变换的应用投影变换在许多领域中都有广泛的应用。
在计算机图形学中,投影变换常用于三维图形的透视投影,将三维物体映射到二维平面上。
在机器学习和数据分析中,投影变换可以用来降维,将高维数据映射到低维空间中进行分析。
此外,投影变换也在几何学和物理学中有重要应用。
在几何学中,投影变换可以用来研究图形的相似性和对称性。
在物理学中,投影变换可以用来描述物体在某一方向上运动的特性。
4. 总结平面向量的投影变换和投影矩阵是研究平面向量运动和变换的重要概念。
通过投影变换,我们可以将向量在某一方向上的投影映射到另一个平面,实现有关向量运动的分析和计算。
在上一篇文章中我们讨论了透视投影变换的原理,分析了OpenGL所使用的透视
投影矩阵的生成方法。正如我们所说,不同的图形API因为左右手坐标系、行向
量列向量矩阵以及变换范围等等的不同导致了矩阵的差异,可以有几十个不同的
透视投影矩阵,但它们的原理大同小异。这次我们准备讨论一下Direct3D(以
下简称D3D)以及J2ME平台上的JSR184(M3G)(以下简称M3G)的透视投影矩
阵,主要出于以下几个目的:
(1) 我们在写图形引擎的时候需要采用不同的图形API实现,当
前主要是OpenGL和D3D。虽然二者的推导极为相似,但D3D的自身特点导致了
一些地方仍然需要澄清。
(2) DirectX SDK的手册中有关于透视投影矩阵的一些说明,但
并不详细,甚至有一些错误,从而使初学者理解起来变得困难,而这正是本文写
作的目的。
(3) M3G是J2ME平台上的3D开发包,采用了OpenGL作为底层
标准进行封装。它的透视投影矩阵使用OpenGL的环境但又进行了简化,值得一
提。
本文努力让读者清楚地了解D3D与M3G透视投影矩阵的原理,从而能够知道它与
OpenGL的一些差别,为构建跨API的图形引擎打好基础。需要指出的一点是为
了完全理解本文的内容,请读者先理解上一篇文章《深入探索透视投影变换》的
内容,因为OpenGL和它们的透视投影矩阵的原理非常相似,因此这里不会像上
一篇文章从基础知识讲起,而是对比它们的差异来推导变换矩阵。我们开始!
OpenGL与D3D的基本差异
前面提到,不同API的基本差异导致了最终变换矩阵的不同,而导致OpenGL和
D3D的透视投影矩阵不同的原因有以下几个:
(1) OpenGL默认使用右手坐标系,而D3D 默认使用左手坐标系。
(2) OpenGL使用列向量矩阵乘法而D3D使用行向量矩阵乘法。
(3) OpenGL的CVV的Z范围是[-1, 1],D3D的CVV的Z范围是
[0, 1]。
以上这些差异导致了最终OpenGL和D3D的透视投影矩阵的不同。
D3D的透视投影矩阵推导
我们先来看最最基本的透视关系图(上一篇文章开始的时候使用的图):
这里我们考察的是xz平面上的关系,yz平面上的关系同理。这里o是相机位置。
np是近裁剪平面,也是投影平面,N是它到相机的距离。fp是远裁剪平面,F
是它到相机的位置。p是需要投影的点,p’是投影之后的点。根据相似三角形
定理,我们有
则有
注意到OpenGL使用右手坐标系,因此应该使用-N(请参考上一篇文章的这一步),
而D3D使用左手坐标系,因此使用N,这是二者的不同点之一。这样,我们得到
投影之后的点
第三个信息点是变换之后的z在投影平面上的位置,也就是N,它已经没用了,
我们把p’写成
从而用第三个没用信息点它来存储z(如果读者对这一点不太了解,请参考上一
篇文章)。接下来我们求出a和b,从而在z方向上构建CVV。请注意这里是OpenGL
和D3D的另一个不同点,OpenGL的CVV的z范围是[-1, 1],而D3D的CVV的z
范围是[0, 1]。也就是说,D3D 中在近裁剪平面上的点投影之后的点会处于CVV
的z=0平面上,而在远裁剪平面上的点投影之后的点会在CVV的z=1平面上。这
样我们的计算方程就是
从而我们得到了透视投影矩阵的第一个版本
即
这个时候第三个分量变换到CVV情形了,CVV的z范围是[0,1]。接下来根据上
一篇文章所讲到的,我们要把前两个分量变成CVV情形,CVV的x和y范围是[-1,
1],如下图所示:
使用线性插值,我们有:
这里left和right是投影平面的左右范围,top和bottom是投影平面的上下范
围。xcvv和ycvv是我们需要算出的在CVV情形中的x和y,也就是我们要计算
出的结果。但在算出它们之前,我们先把上面的式子写成:
这里有一个需要注意的地方,如果投影平面在x方向上居中,则
那么第一个式子就可以销掉等号两边的1/2,写成
同理,如果投影平面在y方向上居中,则第二个式子可以写成
则我们现在分两种情况讨论:
(1) 投影平面的中心和x-y平面的中心重合(在x和y方向上都
居中)
(2) 一般情况
我们分别讨论:
(1)特殊情况方程
这组是特殊情况,方程比较简单,但也是使用频率最高的方式(这是
D3DXMatrixPerspectiveLH、D3DXMatrixPerspectiveRH、
D3DXMatrixPerspectiveFovLH、D3DXMatrixPerspectiveFovRH四个方法所使用
的情况)。我们导出它:
则我们反推出透视投影矩阵:
其中
而r-l和t-b可以分别看作是投影平面的宽w和高h。最后那个矩阵就是D3D的
透视投影矩阵之一。另外呢,如果我们不知道right、left、top以及bottom
这几个参量,也可以根据视野(FOV – Field Of View)参量来求得。下面是两
个平面的视野关系图:
其中,两个fov分别是在x-z以及y-z平面上的视野。如果只给了一个视野,也
可以通过投影平面的宽高比计算出来:
用一个视野算出w或者h,然后用宽高比算出h或者w。
(2)一般情况的方程
这组方程比较繁琐,但更具一般性(和OpenGL一般矩阵的推导一致,这也是
D3DXMatrixPerspectiveOffCenterLH和D3DXMatrixPerspectiveOffCenterRH两
个方法所使用的情况)。我们导出它:
我们继续反推出透视投影矩阵:
其中
最后那个矩阵就是D3D的一般透视投影矩阵。
好了,目前为止,我们已经导出了D3D的两个透视投影矩阵。下面我把上一篇导
出的OpenGL的透视投影矩阵写出来,大家可以拿它和刚刚导出的D3D的一般性
透视投影矩阵做一个对比。
如果仔细观察,可以发现二者在元素的布局上是一个转置的关系,这个就是由它
们使用的左右手坐标系以及使用的行列矩阵的差异造成的。而另外在一些元素的
细节上也存在着差异,这是由于D3D的CVV的z范围不同造成的。可见在原理相
同的情况下,细微的环境差异可以造成非常大的变化,而这就是透视投影矩阵存
在诸多不同版本的原因。一般情况的透视投影矩阵也可以使用视野方式来定义,
方法和特殊情况相同。
M3G的透视投影矩阵
M3G是对OpenGL进行的一个封装,它的透视投影变换矩阵被放到了类Camera里
面。因为它封装了OpenGL,因此环境和OpenGL相同:右手坐标系、列向量乘法、
CVV范围[-1, 1]。它唯一和OpenGL有些差异的地方就在于它只使用投影平面
的中心和x-y平面的中心重合(在x和y方向上都居中)的情况(就是我们上面
D3D的第一种特殊情况)。我们用OpenGL透视投影矩阵最终版本来说明(再次
提醒,如果读者对此感到迷惑,请参考第一篇文章):
上面是OpenGL透视投影矩阵的最终版本,也是一般性版本,我们要把它变成特
殊性,版本,非常简单,和上面D3D的特殊情况一样,我们从对x和y进行插值
的那一步来看:
和D3D的第一种情况一样,销掉两边的1/2,得到:
则我们反推出透视投影矩阵:
最右边那个矩阵就是M3G的透视投影矩阵。仍然可以通过视野参数来设置透视投
影矩阵,这里请读者自行推导,方法与上面D3D的完全相同。