欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    摄像机矩阵和投影矩阵推导.ppt

    • 资源ID:6164507       资源大小:707.50KB        全文页数:117页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    摄像机矩阵和投影矩阵推导.ppt

    3D Study Notes,向量和矩阵变换,Linguohua2012/7/11,说明,主要是为了备忘,本文记录了我学习向量和矩阵过程中遇到的一些基础知识以及数学证明。数学证明大多是我自己的想法,所以一些过程并不是最简的,原因之一是我在空间和微分几何方面的知识积累甚少。如果你有更简单的方法,请让我知道。,说明,先记录向量和向量的运算,以及点乘和叉乘的证明。然后简要记录若干个重要的坐标空间。接着详细推导View矩阵和Projection矩阵。最后是记录DirectX的一个旋转立方体的Tutorial。,说明,写记录最艰难莫过于公式编辑了,每一个数学式子,都是从Word里面用公式编辑器编辑好,再复制过来,更悲剧的事情是PPT貌似不支持公式,它把复制过来的公式直接变成图片了。可见我是多用心。,点和(方向)向量,数值上,都是用x,y,z表示。前者表示位置,后者表示方向。因表征意义不同,图形库一般以Point类和Vector类表达两者,但它们在数值层面是一致的。因方向向量的核心是方向,故两个方向向量的x,y,z数值可能不同,但方向却是一样的,我们认为这两个方向向量等价。,点和(方向)向量,方向向量C和B等价,因它们表达的方向是相同的。数值上点A和向量B相等,但物理意义不同,(位移)向量,虽然多数时候向量纯粹表达方向,但事实上它还带有长度的信息,向量x,y,x在3D空间的长度是。故,可以把向量理解为在一个方向上长度为 的位移。例如两点之间的距离向量,就是一个典型的位移向量。我们通常结合上下文,来判断向量是纯粹方向的还是位移的向量。,向量的基本运算:加法,向量的加法法则定义为:加法结果还是一个向量,从数值上看,结果向量的每一个分量均“变大”了(严格来说这取决于b的符号)。,加法,向量A加向量B,先把A或者B平移(在A和B所确定的平面上平移),使得A和B成首尾相接,加法,平移向量A得到向量A,这样向量B和向量A首尾相接,连接向量B的起点和向量A的终点,即可得到结果:向量C。平移向量B也会得到同样 的结果。,向量的基本运算:减法,向量的减法法则定义为:减法结果还是一个向量,从数值上看,结果向量的每一个分量均“变小”了(严格来说这取决于b的符号)。,减法,向量A减向量B,先把A或者B平移(在A和B所确定的平面上平移),使得A和B成首首相接,减法,平移向量A到向量A,由于是A-B,所以连接B的尾部到A的尾部,使得结果向量指向被减数,所得的向量即是A-B平移向量B也能得到同样的结果,向量的基本运算:点乘,Dot Product,又叫点乘或点积,定义为:如上式所示,点乘的结果是一个标量。后面我们将要证明该标量和 相关,其中 是这两个向量的夹角,也即是说,从两个向量点乘的结果能得出它们之间的夹角。这就是点乘的价值所在。,点乘的证明,点乘的证明,如上图所示,向量A是,向量B是。它们的夹角为,向量C的是多少呢?由图示以及向量减法法则,可得向量C为:向量A,B,C构成一个三角形,而三角形的余弦定理,注意余弦定理等式中的A,B,C是指三角形的边长,均是标量。,点乘的证明,余弦恒等式用到的边长即是向量A,B,C的模,据此,分别求三个向量的模并代入余弦定理得:等式的|A|和|B|表示向量的模。化简等式即可得到直观的结果,见下页,点乘的证明,化简前面等式得到:上式左边即是点乘的定义。至此,我们看出点乘和 成正比,可用下式表示:其中 是向量A和向量B的点乘,而 是两个向量的模的乘积。,点乘的证明,因此,如果两个向量的点乘结果是零,可知它们相互垂直。由上面的夹角 的等式,可以求得两个向量的夹角。,向量的基本运算:叉乘,Cross Product,又叫叉乘或叉积,定义为:嗯,不易看出规律,看下页,叉乘,注意下图的颜色和箭头左边同颜色箭头所连接的元素,构成右边同颜色的元素。这些箭头是交叉的。这可能就是叉乘名字的由来吧。,叉乘,可以用xyzzy方法记忆叉乘公式:其中xyz表示3个轴的坐标值,简单起见设左边第一个向量为A,第二个为B,右边的结果向量为C,依照xyzzy:接着求,需要按照x-y-z-x的规则变换xyzzy成yzxxz,得:同样可以求得,叉乘,和点乘比较,点乘得到的结果是一个标量,但叉乘得到的是3个标量所构成的一个向量,这个差异很大。既然叉乘得到一个向量,那么这个向量具有什么性质呢?嗯,直接观察不易,我觉得从线性代数和矩阵论的范畴,应该能够简单地得到结论。不过,我们可以利用点乘来得出叉乘的一些性质。,叉乘性质证明,让叉乘的两个向量分别和叉乘的结果向量进行点乘运算,得:,叉乘性质证明,由上面两式和点乘的性质,得知叉乘的结果向量和原来的两个向量都垂直。我们知道原来的两个向量确定了一个平面,也即是说叉乘的结果向量垂直于这个平面。这就是叉乘的重要几何意义。下面我们分析叉乘结果向量的模。,叉乘结果向量的模,由点乘公式:等式两边平方,然后用三角等式 代换后并整理得到:,叉乘结果向量的模,注意到上式左边是叉乘结果向量的模的平方,所以对等式两边开平方,即得:上式便是关于叉乘的模的等式。至此,我们知道叉乘会得到一个垂直于原来两个向量(以及它们所在平面)的向量,且这个向量的长度满足上述等式。但仍有一个问题:这个垂直向量朝向那个方向呢?,叉乘,向量A,向量C,向量B,叉乘向量的方向,如上图所示,向量C方向朝上还是朝下(注意:不管朝向如何,它终归都会垂直于原来的两个向量)?一个简单的判断方法,见下页的图示。注意如果是左手坐标系,就用左手,如果是右手坐标系,那么需要用右手。,叉乘向量的方向,点乘和叉乘用途,至此,我们知道点乘得到一个标量,这个标量跟原来两个向量的夹角相关。所以,在3D图形学中常通过两个向量的点乘得到它们之间的夹角。我们知道叉乘得到一个垂直于原来两个向量的新向量,3D图形学中常用这种方式求垂直于平面/三角面/多边形等的向量。例如法线(凹凸)贴图时,需要求出垂直于顶点的法线。,Wiki,叉乘和点乘都是由Josiah Willard Gibbs在1881年提出的。Dot product:Scalar product,Cross product:Vector product,左手和右手坐标系,在3D空间中存在这样的两种坐标系,不管怎么翻转,都不能从一种坐标系变换到另一种坐标系。这两种坐标系我们用左手坐标系和右手坐标系来称呼和区分它们。DirectX常用左手坐标系,OpenGL则惯用右手坐标系。不要担心,事实上他们的x,y坐标轴完全一样,只是z轴一个向里,一个向外。如下图所示:,左手和右手坐标系,坐标系和坐标系转换,3D模型从建模到渲染最后阶段输出到屏幕需要经历多个坐标系,从一个坐标系到另一个坐标系则需要一个转换过程。这个过程是由一个转换矩阵来实施的。本节简要记录一些关键坐标系(坐标空间),和相应的转换说明,然后以DirectX为例,记录和推导几个重要的转换矩阵。,Model坐标系,模型坐标系,也叫Local坐标系。例如我们在3DMax,MAYA等建模工具中建立我们的人物模型时,模型中的顶点坐标值就是Model坐标系的值。设想我们有多个人物模型,那么每一个模型都有属于自己的Model坐标系。,World坐标系,World坐标系也是很直观的,我们把若干个模型放在一起组成一张场景,场景的坐标系就是World坐标系,这就像我们现实世界一样。一个模型放置到World坐标系之后,它的顶点坐标值就需要从Model坐标系转换为World坐标系中的值。如下页图示:,World坐标系,Model坐标系和World坐标系顶点P在Model坐标系中的值和在World坐标系中的值是不同的,顶点P,Camera坐标系,Camera坐标系是人眼观察World坐标系时,以人眼为原点,视线方向为Z轴建立的新坐标系,这个坐标系以观察者(眼睛)为中心,为视野裁剪和投影等做好铺垫。随着观察者眼睛位置的变化,或者视线方向的变化,Camera坐标系也同时变换。,Projection坐标系,Projection即投影坐标系基于Camera坐标系变换而来的新坐标系,这个新坐标系把视野外的东西剔除掉,把视野内的东西投影到屏幕(近裁面)上,并且离眼睛越远的东西看起来越小。,tangent坐标系,还有很多具有专门用途的坐标空间,例如Tangent即切线坐标系,它适合于根据高度图(Height map)计算法向图(Normal map)。此处就不一一列举其他坐标空间了,事实上我知道的太少了,列举不出来呀。,坐标系的转换,抄录自MSDN,Transform pipeline,Wiki,Transform pipeline,http:/,坐标系的转换和矩阵,任意两个坐标系的转换都经由一个转换矩阵完成。例如从Model坐标系到World坐标系,需要经过World转换矩阵进行变换。World矩阵主要用于伸缩,平移,和旋转。伸缩/平移较为直观,而旋转会有几种方式,例如构造矩阵旋转,或欧拉角旋转,或四元数旋转。限于篇幅就不详细记录了。将来如有需要,再单独记录。,坐标系的转换和矩阵,后续的内容主要记录World坐标系转换之后的Camera坐标系,Projection坐标系的转换。接下来记录的转换矩阵推导,是用DirectX来举例。事实上,这些推导过程在OpenGL上也是一样的,如果有差别,也是一些数值上的细微差别,例如DirectX的远近裁剪面定为01,而OpenGL的定为-11。,DirectX View Matrix推导,从World坐标系转换到Camera坐标系需要一个转换矩阵帮忙,这个矩阵叫View矩阵。,DirectX View Matrix推导,View矩阵是一个4X4的矩阵,作用是将顶点从World坐标系转换到Camera坐标系。Camera坐标系是一个这样的坐标系:以眼睛的位置为原点,视线方向为Z轴的一个坐标系。新坐标系的X轴朝向观察者的右手方向,Y轴朝向观察者头顶方向。在World坐标系的顶点 经过View矩阵转换后,得到一个位于Camera坐标系的新坐标。,DirectX View Matrix推导,运算过程:注意运算时采用的是齐次坐标,各个分量取值是基于Camera坐标系的,它们相对的原点是Camera坐标系的原点,也即是观察者眼睛的位置。下面我们推导View 矩阵。,DirectX View Matrix推导,推导View矩阵分两步,首先确立Camera坐标系,也即确立Camera坐标系的X,Y,Z轴。然后构造一个矩阵,该矩阵能够把World坐标系的顶点映射到Camera坐标系。简明起见,我们需要定义若干变量:设眼睛所在的点为ptEye,眼睛注视的点为ptAt,注意到ptEye和ptAt都是World坐标系中的点。然后我们还需要World坐标系的Y轴方向向量,设为Up。,DirectX View Matrix推导,为什么需要Up向量呢?非常正规的含义我也不清楚。但从运算角度来说,如果没有Up向量,我们就没有办法确定Camera的X,Y轴(Z轴是视线方向,是已经确定的)。可能用Up向量更加符合我们的感官世界吧。单纯从运算角度来看,提供World坐标系的X,Z轴向量都等价于提供Up向量。,DirectX View Matrix推导,那么,Camera坐标系,Z轴等于:Normal表示标准化ptAt-ptEye向量,使得它的模为1。因为约定Up和Z共面(Z=0的平面),所以X轴由Up和Z的叉乘得到:最后,Y则由Z和X叉乘得到:注意Y不再需要标准化,因为X和Z都是单位向量,DirectX View Matrix推导,X,Y,Z,World space,Camera space,X,Z,Y,ptAt,ptEye,DirectX View Matrix推导,得到Camera坐标系的3个坐标轴的单位向量后,我们就可以开始构造View矩阵了。,DirectX View Matrix推导,X,Y,Z,X,Z,Y,P,向量eye,向量P,向量PN,DirectX View Matrix推导,观察上图,各个重要的向量已经标出:黄色向量eye表示World坐标系中眼睛位置向量;红色向量P表示World坐标系中点P的向量;绿色向量PN表示Camera坐标系中点P的向量,我们目标就是求PN。如上图所示,我们考察World坐标系中的点P,在World坐标系中它的向量是红色的P,而在Camera坐标系中它的向量是PN,单独考察它在Camera坐标系的X分量,也即是向量PN在X轴上的投影,,DirectX View Matrix推导,只要我们能够求出点P在Camera坐标系中X,Y,Z分量,再把这几个分量组成x,y,z形式就是点P在Camera坐标系中的新坐标值。不难看出,PN=P-eye(向量减法),即向量PN在X轴的投影等于eye在X轴的投影加上向量P在X轴的投影。这个发现非常重要,据此我们就可以求出点P在X轴的投影(即向量PN在X轴的投影),然后用同样的方法便可以求出PN在Y,Z的投影。三个投影值确定后,PN也就确定了。,DirectX View Matrix推导,回想点乘公式:如果上式的A是单位向量,则|A|=1,所以得到:,这相当于得到B在A方向的投影长度。如下图所示:,DirectX View Matrix推导,因此,我们就用点乘公式来求向量PN在X的投影,因PN=P-eye,所以:上式X是Camera坐标系的X轴的单位向量。上式等价于下面的齐次向量点乘:,DirectX View Matrix推导,上式的成立是容易看出的。其中,,和 是Camera坐标系的X轴X单位向量在World坐标系中的x,y,z三个分量。至此,我们已经成功求出PN在X轴的投影,同样的,我们可以求出PN在Y,Z轴的投影:,DirectX View Matrix推导,点P在Camera坐标系的3个轴上的投影都已求出,我们把这3个等式组合成齐次4X4矩阵:至此我们已经看到View矩阵了。,DirectX View Matrix推导,View矩阵:嗯,这就是我们的View矩阵。所有World坐标系中的点P经过View矩阵转换后,变成Camera坐标系中的点。,DirectX View Matrix推导,DirectX为了免除我们构造View矩阵的繁琐,提供了API:D3DXMatrixLookAtLH和D3DXMatrixLookAtRH,LH和RH后缀表示left hand和right hand左右手坐标系的意思。也就是说前者构造左手坐标系的View矩阵,后者构造右手坐标系的View矩阵。下面我从MSDN拷贝一下它对这两个函数的描述。,DirectX View Matrix推导,D3DXMATRIX*D3DXMatrixLookAtLH(_inoutD3DXMATRIX*pOut,_inconst D3DXVECTOR3*pEye,_inconst D3DXVECTOR3*pAt,_inconst D3DXVECTOR3*pUp);pOutin,outType:D3DXMATRIX*Pointer to theD3DXMATRIXstructure that is the result of the operation.,DirectX View Matrix推导,pEyeinType:constD3DXVECTOR3*Pointer to theD3DXVECTOR3structure that defines the eye point.This value is used in translation.pAtinType:constD3DXVECTOR3*Pointer to theD3DXVECTOR3structure that defines the camera look-at target.,DirectX View Matrix推导,pUpinType:constD3DXVECTOR3*Pointer to theD3DXVECTOR3structure that defines the current worlds up,usually 0,1,0.,DirectX View Matrix推导,MSDN描述的DirectX View矩阵构造算法:,DirectX View Matrix推导,嗯,事实上我推导View矩阵之前首先是看了MSDN的View矩阵的,它没有提供推导过程,只提供一个结果,但理解了这个结果之后,推导过程就很清晰了。,Wiki,D3DXMatrixLookAtLH,http:/Transform,http:/,DirectX Projection Matrix推导,首先说一下我对投影矩阵的感觉:由于我是初学者,目前我认为投影矩阵主要有两个意义,第一是令离我们眼睛越远的物体看起来越小,这个意义很大,因为它真实地模拟了现实中的视觉(想起我们看天上的飞机吗?它和小鸟一样小,因为它离我们很远)。第二个意义是经过投影变换后,更加方便裁剪那些不在视锥截体内的顶点。,DirectX Projection Matrix推导,下面说一下视锥截体这个东西。事实上我们辛辛苦苦变换到Camera坐标系,就是为了它。眼睛望远处时,视野形成一个视锥体,然后设想:离眼睛很近处存在一个平面,只要物体落在平面之前,就看不到,这个平面我们叫做近截面;同样在远处存在一个远截面,只要物件在远截面之后,我们也看不到。,DirectX Projection Matrix推导,这两个截面将视锥体截断成了一个菱台体,叫做视锥截体。关于视锥截体,首先现实中我们的视锥体是一个圆锥,但计算机中它是一个4面锥体;现实中的确存在远裁面,不过很远,人眼在好天气时可以看到20多公里,也存在近裁面,不过很近,贴近眼皮了。所以对远近裁面,我也是不甚理解。可能是考虑到减少渲染物体的数量吧。,DirectX Projection Matrix推导,好,定义了视锥截体后,所有在视锥截体之外的顶点都被裁剪掉,不参与渲染了。见下页的图示。,DirectX Projection Matrix推导,DirectX Projection Matrix推导,把上图平面化,也即只观察YZ平面,如下:,Z,Y,DirectX Projection Matrix推导,考察上图的几个顶点,根据视锥截体的定义,我们很容易把红色的顶点裁剪掉,因为只需要比较他们的y分量或者z分量即发现它们不可能落在视锥截体之内。但是对于蓝色的那个顶点,就不容易了,因为需要判断点落在视锥截体斜边上方还是下方,这可能需要计算斜边的方程(我觉得需要)。但如果借助投影矩阵,蓝色点的裁剪会变得跟红色点一般容易。,DirectX Projection Matrix推导,投影矩阵的目的是将视锥截体内的点,都投影到近裁面(投影长方体)中。因为这个目的,它成功地使得:物体越远看起来越小;以及方便裁剪顶点。我们由一个幅图开始证明这两点。简明起见,我们把视锥截体平面化,仍然仅考虑YZ平面视图,理解了YZ平面视图后也就自然理解了XZ平面视图了。如下图所示:,DirectX Projection Matrix推导,DirectX Projection Matrix推导,如上图所示,考察落在视锥截体内的P1和P2两点,它们的高度(也即Y值)是一样的,但Z值不同,P2的Z值更大,也即是离眼睛更远。但是,它们在近裁面N-Plane的投影点的Y值却不同,P1的为y1,P2的为y2,显然y1 y2,也即是在Y方向上,P1看起来要比P2高!这就是投影矩阵的第一目标:越远越小。,DirectX Projection Matrix推导,y1为什么大于y2呢?嗯,首先从图上可以直观获得结论。也可从数学上,我们通过相似三角形得到等式:上面前两等式左右相除,注意到,即得第三个等式:又,DirectX Projection Matrix推导,至于投影矩阵让顶点裁剪更方便,这点是非常明了的:因为经过投影矩阵变换后,所有位于视锥截体内的点,它们的X,Y坐标都被映射到近裁面N-Plane中(也即是映射后的坐标值X,Y小于或等于N-Plane的宽高),而N-Plane是一个长方形(事实上在投影坐标系里面它是一个边长为2的正方形),所以只需要比较X和Y分量是否在N-Plane的宽高范围内即可!这个映射可以用下图形象的表示出来:,DirectX Projection Matrix推导,X,Y,Z,投影坐标系,Camera坐标系,投影长方体,视锥截体,DirectX Projection Matrix推导,上图视锥截体从一个菱台经过投影矩阵变换后,成为一个长方体,就像是投影矩阵把远裁面F-Plane压缩到跟N-Plane相同大小一般。这是因为投影矩阵使得菱台内所有点的X,Y经过投影后,都=N-Plane的宽高。另外,N-Plane的Z坐标转换为0,也即是在投影坐标系中,原点不再是Camera坐标系的眼睛位置,而是N-Plane平面中心点。,DirectX Projection Matrix推导,事实上,投影长方体的边长是既定的:DirectX约定,投影长方体的X,Y取值从-1到1,也即长度为2,而Z取值从0到1,也即长度为1。为了满足DirectX这个约定,我们需要把点的X,Y坐标除以N-Plane的宽和高,Z则除以F-Plane和N-Plane的距离,这样新得到的X,Y,Z都满足了=-1且=1的约定。为什么DirectX会这样约定呢?这个我也不甚清楚,可能是为方便后续裁剪等运算吧,DirectX Projection Matrix推导,至此,我们知道投影矩阵的目的以及其原理了。下面我们构造投影矩阵:目标是让视锥截体内的点映射到投影长方体内,注意这个映射函数必须是严格单调的,也即不允许视锥截体内多个点映射到投影长方体内同一个点。和推导View矩阵一样,我们对X,Y,Z轴逐个推导,然后再复合成一个矩阵。,DirectX Projection Matrix推导,N,Pz,H,F,DirectX Projection Matrix推导,如上图所示,考察YZ平面视图,对视锥截体内的点P,Y坐标为,我们来推导它在N-Plane平面投影的y值。图中N表示近裁面N-Plane的距离,角表示视野在YZ平面的夹角,这个英文叫fov(field of view)。我们依据相似三角形构造恒等式:,所以y为:前面提到y需要满足DirectX的取值-11约定,所以我们对y除以N-Plane的一半高度,DirectX Projection Matrix推导,也即:,因为,故y的最终表示为:上面等式中,Py是P点在Camera坐标系中的Y值,可以是任意数字,例如1万。而y是投影坐标系中P点的Y值,它的取值范围已经变为-11,跟1万没有关系了。这是因为我们对Py除以了H。H是N-Plane一半的高度。,DirectX Projection Matrix推导,求得P点在投影坐标系的Y值后,可以用同样的方法求得它在投影坐标系的X值,这个就不画图了,我们可以轻易想象出来,只要把上图的Y轴换成X轴,H换成W(W表示N-Plane一半的宽度),且 换成,注意 是指视野在YZ平面的夹角,而 是视野在XZ平面的夹角,它们在现实中可以认为是相等的(因为现实中视锥是一个圆锥),但在计算机中他们往往是不等的,因为它们依赖于计算机屏幕的宽高比例。,DirectX Projection Matrix推导,好,这样我们又得到x的表达式:上式也可以用 来表达x,这是因为这两个角度依赖于屏幕的宽高比例:现在只剩下z的表达式了。投影矩阵实际上并不关心z,但是由于我们的z必须满足,DirectX Projection Matrix推导,DirectX对它的要求:取值范围01,所以,对z除以F-Plane与N-Plane之间的距离即可,也即:其中F-N表示两个裁面之间的距离,此处Pz需要减去N 一是因为在投影坐标系中原点变为N-Plane的中心点,而不是眼睛点,二是除以F-N才会=1。事实上,上式根本不满足矩阵要求,这里记录下来作为一个思考的过程。,DirectX Projection Matrix推导,至此,我们的投影矩阵差不多出来了,它现在看起来像这样:但这个矩阵内含变量Pz,我们知道转换矩阵是不能含有未知量的。怎么办呢?,DirectX Projection Matrix推导,因为未知量是,我们自然想到把它提到矩阵外,类似这样:但是这个矩阵仍然有两个问题,第一z分量并没有消除Pz,第二是点变换已不能由一个矩阵相乘解决,还需多一个标量相乘。,DirectX Projection Matrix推导,先来解决第二个问题,由于4D齐次向量变换回3D向量时,会用w(也即最后一个分量)除以所有分量,以确保w分量一定是1,这个是在转换管线的最后阶段由硬件完成(参看前面MSDN的转换管线)。那么我们可以利用这个特性来解决第二个问题。,DirectX Projection Matrix推导,也即:让我们的顶点经过投影矩阵转换后,X,Y,Z分量都多带了一个Pz因子的,但这不要紧,因为W分量也是Pz,而我们知道最后顶点会被除以W也即除以Pz,这样我们的顶点的X,Y,Z就恢复到正确的数值了。,DirectX Projection Matrix推导,根据这个思想,修改我们那个半成品矩阵,把x,y,z的 去掉,同时让w分量成Pz(令第4列3行的元素为1):嗯,现在看起来帅一些了,只剩下第一问题了,见矩阵红色部分:仍然有未知量Pz,DirectX Projection Matrix推导,下面我们来改造z的表达式,使得它满足矩阵的要求。事实上,先理解表达式 的问题所在:因为w的分量是Pz,也即z最终会被除以Pz,那么矩阵相乘后z应该为:只有这样,才能在最后除以W时得到,DirectX Projection Matrix推导,问题是这个 表达式无论如何都不可通过矩阵乘法获得,因为它含有Pz的二次方。除非矩阵元素 含有Pz,但这又使得矩阵含有未知量了。我们可以在纸上算一下,即可确认这个事实:当转换矩阵不含有Pz时,我们的顶点向量和矩阵相乘绝对不可能得到Pz的二次方,只能得到Pz的一次方,或者0。也就是说,这个映射函数不能满足我们要求。我们需要构建新的映射函数。,DirectX Projection Matrix推导,我们需要构造一个新函数,和 一样,值域是01,且严格单调递增,当Pz等于N时取得最小值0,当Pz等于F时取得最大值1。依据矩阵乘法规律,我们的点向量和矩阵相乘后,z分量可表述为:经过4D到3D的除法(除w)后,成这样:,DirectX Projection Matrix推导,我们如果能求出 式子中的 和,把它们填入矩阵即可完成z的转换。我们怎样求解这两个变量呢?根据前面的约定,也该是严格单调递增的,而且当Pz=N时取得最小值0,当Pz=F时取得最大值1,由此我们可以用此信息构建方程组,把 和 解出来。,DirectX Projection Matrix推导,当Pz等于N时,当Pz等于F时,联合两个等式成二元方程组:解得到:,DirectX Projection Matrix推导,那么:显然z是严格单调递增的。且Pz等于N时z=0,Pz等于F时z=1。,DirectX Projection Matrix推导,嗯,z的表达式终于确定了。那么最终的投影矩阵是这样子:,DirectX Projection Matrix推导,和View矩阵一样,DirectX为了免除我们构造投影矩阵的繁琐,它也提供了3组API来构造左右手坐标系的投影矩阵,事实上这3组函数原理相同,其矩阵的构造算法和我们的推导过程一致。这里我们抄录D3DXMatrixPerspectiveFovLH作为示例。,DirectX Projection Matrix推导,D3DXMATRIX*D3DXMatrixPerspectiveFovLH(_inoutD3DXMATRIX*pOut,_inFLOAT fovy,_inFLOAT Aspect,_inFLOAT zn,_inFLOAT zf);pOutin,outType:D3DXMATRIX*Pointer to theD3DXMATRIXstructure that is the result of the operation.,DirectX Projection Matrix推导,fovyinType:FLOAT Field of view in the y direction,in radiansAspectinType:FLOAT Aspect ratio,defined as view space width divided by height.,DirectX Projection Matrix推导,zninType:FLOAT Z-value of the near view-plane.zfinType:FLOAT Z-value of the far view-plane.,DirectX Projection Matrix推导,MSDN给出的DirectX的投影矩阵构造,Wiki,Viewports and Clipping,http:/Transform,http:/,DirectX Viewport转换矩阵,非视锥截体内的顶点会被投影转换过程裁剪掉,而视锥截体内的顶点经过投影矩阵变换到投影坐标系后,它的X,Y坐标取值范围是-11,Z坐标取值范围是01。接下来要将这些点绘制到屏幕上。屏幕的宽度W高度H需要我们给定,通过设置DirectX的Viewport属性,来告知DirectX如何将点绘制到屏幕上。,DirectX Viewport转换矩阵,DirectX的对应API为:SetViewport。HRESULT SetViewport(inconst D3DVIEWPORT9*pViewport);pViewportinType:constD3DVIEWPORT9*Pointer to aD3DVIEWPORT9structure,specifying the viewport parameters to set.,DirectX Viewport转换矩阵,关键是填充D3DVIEWPORT9 结构体。,DirectX Viewport转换矩阵,X Type:DWORD Pixel coordinate of the upper-left corner of the viewport on the render-target surface.Unless you want to render to a subset of the surface,this member can be set to 0.Y Type:DWORD Pixel coordinate of the upper-left corner of the viewport on the render-target surface.Unless you want to render to a subset of the surface,this member can be set to 0.,DirectX Viewport转换矩阵,Width Type:DWORD Width dimension of the clip volume,in pixels.Unless you are rendering only to a subset of the surface,this member should be set to the width dimension of the render-target surface.Height Type:DWORD Height dimension of the clip volume,in pixels.Unless you are rendering only to a subset of the surface,this member should be set to the height dimension of the render-target surface.,DirectX Viewport转换矩阵,MinZ Type:float Together with MaxZ,value describing the range of depth values into which a scene is to be rendered,the minimum and maximum values of the clip volume.Most applications set this value to 0.0.Clipping is performed after applying the projection matrix.,DirectX Viewport转换矩阵,MaxZ Type:float Together with MinZ,value describing the range of depth values into which a scene is to be rendered,the minimum and maximum values of the clip volume.Most applications set this value to 1.0.Clipping is performed after applying the projection matrix.,DirectX Viewport转换矩阵,在我们设置好D3DVIEWPORT9 结构体后,DirectX会用结构体中的成员构造一个这样的Viewport转换矩阵:,DirectX Viewport转换矩阵,这个映射矩阵相对直观许多,目的是为了把点均匀散列到屏幕中。所以就不详细记录Viewport转换矩阵了,我们只需知道这是Transform pipeline的最后一个转换矩阵即可。注意到矩阵对高度转换时前面加了一个负号,这是由于在投影矩阵中Y值是由下至上递增,从-1变化到1,但是Viewport坐标系Y值是从上至下递增,由0变化到屏幕的最大高度。,

    注意事项

    本文(摄像机矩阵和投影矩阵推导.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开