摄像机矩阵和投影矩阵推导--课件

上传人:仙*** 文档编号:241410011 上传时间:2024-06-24 格式:PPT 页数:117 大小:1.32MB
返回 下载 相关 举报
摄像机矩阵和投影矩阵推导--课件_第1页
第1页 / 共117页
摄像机矩阵和投影矩阵推导--课件_第2页
第2页 / 共117页
摄像机矩阵和投影矩阵推导--课件_第3页
第3页 / 共117页
点击查看更多>>
资源描述
3D Study Notes向量和矩阵变换Linguohua2012/7/111PPT课件说明主要是为了备忘,本文记录了我学习向量和矩阵过程中遇到的一些基础知识以及数学证明。数学证明大多是我自己的想法,所以一些过程并不是最简的,原因之一是我在空间和微分几何方面的知识积累甚少。如果你有更简单的方法,请让我知道。2PPT课件说明先记录向量和向量的运算,以及点乘和叉乘的证明。然后简要记录若干个重要的坐标空间。接着详细推导View矩阵和Projection矩阵。最后是记录DirectX的一个旋转立方体的Tutorial。3PPT课件说明写记录最艰难莫过于公式编辑了,每一个数学式子,都是从Word里面用公式编辑器编辑好,再复制过来,更悲剧的事情是PPT貌似不支持公式,它把复制过来的公式直接变成图片了。可见我是多用心。4PPT课件点和(方向)向量数值上,都是用x,y,z表示。前者表示位置,后者表示方向。因表征意义不同,图形库一般以Point类和Vector类表达两者,但它们在数值层面是一致的。因方向向量的核心是方向,故两个方向向量的x,y,z数值可能不同,但方向却是一样的,我们认为这两个方向向量等价。5PPT课件点和(方向)向量方向向量C和B等价,因它们表达的方向是相同的。数值上点A和向量B相等,但物理意义不同xy点A5,2,6向量B5,2,6z向量C6PPT课件(位移)向量虽然多数时候向量纯粹表达方向,但事实上它还带有长度的信息,向量x,y,x在3D空间的长度是 。故,可以把向量理解为在一个方向上长度为 的位移。例如两点之间的距离向量,就是一个典型的位移向量。我们通常结合上下文,来判断向量是纯粹方向的还是位移的向量。7PPT课件向量的基本运算:加法向量的加法法则定义为:加法结果还是一个向量,从数值上看,结果向量的每一个分量均“变大”了(严格来说这取决于b的符号)。8PPT课件加法向量A加向量B,先把A或者B平移(在A和B所确定的平面上平移),使得A和B成首尾相接xyz向量向量A向量向量B9PPT课件加法平移向量A得到向量A,这样向量B和向量A首尾相接,连接向量B的起点和向量A的终点,即可得到结果:向量C。平移向量B也会得到同样 的结果。xyz向量向量A向量向量B向量向量C向量向量A10PPT课件向量的基本运算:减法向量的减法法则定义为:减法结果还是一个向量,从数值上看,结果向量的每一个分量均“变小”了(严格来说这取决于b的符号)。11PPT课件减法向量A减向量B,先把A或者B平移(在A和B所确定的平面上平移),使得A和B成首首相接xyz向量向量A向量向量B12PPT课件减法xyz向量向量A向量向量B向量向量A向量向量C平移向量A到向量A,由于是A-B,所以连接B的尾部到A的尾部,使得结果向量指向被减数,所得的向量即是A-B平移向量B也能得到同样的结果13PPT课件向量的基本运算:点乘DotProduct,又叫点乘或点积,定义为:如上式所示,点乘的结果是一个标量。后面我们将要证明该标量和相关,其中 是这两个向量的夹角,也即是说,从两个向量点乘的结果能得出它们之间的夹角。这就是点乘的价值所在。14PPT课件点乘的证明xyz向量向量A向量向量C向量向量B15PPT课件点乘的证明如上图所示,向量A是 ,向量B是 。它们的夹角为 ,向量C的是多少呢?由图示以及向量减法法则,可得向量C为:向量A,B,C构成一个三角形,而三角形的余弦定理 ,注意余弦定理等式中的A,B,C是指三角形的边长,均是标量。16PPT课件点乘的证明余弦恒等式用到的边长即是向量A,B,C的模,据此,分别求三个向量的模并代入余弦定理得:等式的|A|和|B|表示向量的模。化简等式即可得到直观的结果,见下页17PPT课件点乘的证明化简前面等式得到:上式左边即是点乘的定义。至此,我们看出点乘和 成正比,可用下式表示:其中 是向量A和向量B的点乘,而 是两个向量的模的乘积。18PPT课件点乘的证明因此,如果两个向量的点乘结果是零,可知它们相互垂直。由上面的夹角 的等式,可以求得两个向量的夹角。19PPT课件向量的基本运算:叉乘CrossProduct,又叫叉乘或叉积,定义为:嗯,不易看出规律,看下页20PPT课件叉乘注意下图的颜色和箭头左边同颜色箭头所连接的元素,构成右边同颜色的元素。这些箭头是交叉的。这可能就是叉乘名字的由来吧。21PPT课件叉乘可以用xyzzy方法记忆叉乘公式:其中xyz表示3个轴的坐标值,简单起见设左边第一个向量为A,第二个为B,右边的结果向量为C,依照xyzzy:接着求 ,需要按照x-y-z-x的规则变换xyzzy成yzxxz,得:同样可以求得22PPT课件叉乘和点乘比较,点乘得到的结果是一个标量,但叉乘得到的是3个标量所构成的一个向量,这个差异很大。既然叉乘得到一个向量,那么这个向量具有什么性质呢?嗯,直接观察不易,我觉得从线性代数和矩阵论的范畴,应该能够简单地得到结论。不过,我们可以利用点乘来得出叉乘的一些性质。23PPT课件叉乘性质证明让叉乘的两个向量分别和叉乘的结果向量进行点乘运算,得:24PPT课件叉乘性质证明由上面两式和点乘的性质,得知叉乘的结果向量和原来的两个向量都垂直。我们知道原来的两个向量确定了一个平面,也即是说叉乘的结果向量垂直于这个平面。这就是叉乘的重要几何意义。下面我们分析叉乘结果向量的模。25PPT课件叉乘结果向量的模由点乘公式:等式两边平方,然后用三角等式 代换后并整理得到:26PPT课件叉乘结果向量的模注意到上式左边是叉乘结果向量的模的平方,所以对等式两边开平方,即得:上式便是关于叉乘的模的等式。至此,我们知道叉乘会得到一个垂直于原来两个向量(以及它们所在平面)的向量,且这个向量的长度满足上述等式。但仍有一个问题:这个垂直向量朝向那个方向呢?27PPT课件叉乘xyz向量向量A向量向量C向量向量B28PPT课件叉乘向量的方向如上图所示,向量C方向朝上还是朝下(注意:不管朝向如何,它终归都会垂直于原来的两个向量)?一个简单的判断方法,见下页的图示。注意如果是左手坐标系,就用左手,如果是右手坐标系,那么需要用右手。29PPT课件叉乘向量的方向30PPT课件点乘和叉乘用途至此,我们知道点乘得到一个标量,这个标量跟原来两个向量的夹角相关。所以,在3D图形学中常通过两个向量的点乘得到它们之间的夹角。我们知道叉乘得到一个垂直于原来两个向量的新向量,3D图形学中常用这种方式求垂直于平面/三角面/多边形等的向量。例如法线(凹凸)贴图时,需要求出垂直于顶点的法线。31PPT课件Wiki叉乘和点乘都是由JosiahWillardGibbs在1881年提出的。Dotproduct:Scalarproduct,http:/en.wikipedia.org/wiki/Dot_productCrossproduct:Vectorproduct,http:/en.wikipedia.org/wiki/Cross_product32PPT课件左手和右手坐标系在3D空间中存在这样的两种坐标系,不管怎么翻转,都不能从一种坐标系变换到另一种坐标系。这两种坐标系我们用左手坐标系和右手坐标系来称呼和区分它们。DirectX常用左手坐标系,OpenGL则惯用右手坐标系。不要担心,事实上他们的x,y坐标轴完全一样,只是z轴一个向里,一个向外。如下图所示:33PPT课件左手和右手坐标系34PPT课件坐标系和坐标系转换3D模型从建模到渲染最后阶段输出到屏幕需要经历多个坐标系,从一个坐标系到另一个坐标系则需要一个转换过程。这个过程是由一个转换矩阵来实施的。本节简要记录一些关键坐标系(坐标空间),和相应的转换说明,然后以DirectX为例,记录和推导几个重要的转换矩阵。35PPT课件Model坐标系模型坐标系,也叫Local坐标系。例如我们在3DMax,MAYA等建模工具中建立我们的人物模型时,模型中的顶点坐标值就是Model坐标系的值。设想我们有多个人物模型,那么每一个模型都有属于自己的Model坐标系。36PPT课件World坐标系World坐标系也是很直观的,我们把若干个模型放在一起组成一张场景,场景的坐标系就是World坐标系,这就像我们现实世界一样。一个模型放置到World坐标系之后,它的顶点坐标值就需要从Model坐标系转换为World坐标系中的值。如下页图示:37PPT课件World坐标系Model坐标系和World坐标系顶点P在Model坐标系中的值和在World坐标系中的值是不同的顶点P38PPT课件Camera坐标系Camera坐标系是人眼观察World坐标系时,以人眼为原点,视线方向为Z轴建立的新坐标系,这个坐标系以观察者(眼睛)为中心,为视野裁剪和投影等做好铺垫。随着观察者眼睛位置的变化,或者视线方向的变化,Camera坐标系也同时变换。39PPT课件Projection坐标系Projection即投影坐标系基于Camera坐标系变换而来的新坐标系,这个新坐标系把视野外的东西剔除掉,把视野内的东西投影到屏幕(近裁面)上,并且离眼睛越远的东西看起来越小。40PPT课件tangent坐标系还有很多具有专门用途的坐标空间,例如Tangent即切线坐标系,它适合于根据高度图(Heightmap)计算法向图(Normalmap)。此处就不一一列举其他坐标空间了,事实上我知道的太少了,列举不出来呀。41PPT课件坐标系的转换抄录自MSDN,Transformpipeline42PPT课件WikiTransformpipeline,http:/ View Matrix推导从World坐标系转换到Camera坐标系需要一个转换矩阵帮忙,这个矩阵叫View矩阵。46PPT课件DirectX View Matrix推导View矩阵是一个4X4的矩阵,作用是将顶点从World坐标系转换到Camera坐标系。Camera坐标系是一个这样的坐标系:以眼睛的位置为原点,视线方向为Z轴的一个坐标系。新坐标系的X轴朝向观察者的右手方向,Y轴朝向观察者头顶方向。在World坐标系的顶点 经过View矩阵转换后,得到一个位于Camera坐标系的新坐标。47PPT课件DirectX View Matrix推导运算过程:注意运算时采用的是齐次坐标,各个分量取值是基于Camera坐标系的,它们相对的原点是Camera坐标系的原点,也即是观察者眼睛的位置。下面我们推导View矩阵。48PPT课件DirectX View Matrix推导推导View矩阵分两步,首先确立Camera坐标系,也即确立Camera坐标系的X,Y,Z轴。然后构造一个矩阵,该矩阵能够把World坐标系的顶点映射到Camera坐标系。简明起见,我们需要定义若干变量:设眼睛所在的点为ptEye,眼睛注视的点为ptAt,注意到ptEye和ptAt都是World坐标系中的点。然后我们还需要World坐标系的Y轴方向向量,设为Up。49PPT课件DirectX View Matrix推导为什么需要Up向量呢?非常正规的含义我也不清楚。但从运算角度来说,如果没有Up向量,我们就没有办法确定Camera的X,Y轴(Z轴是视线方向,是已经确定的)。可能用Up向量更加符合我们的感官世界吧。单纯从运算角度来看,提供World坐标系的X,Z轴向量都等价于提供Up向量。50PPT课件DirectX View Matrix推导那么,Camera坐标系,Z轴等于:Normal表示标准化ptAt-ptEye向量,使得它的模为1。因为约定Up和Z共面(Z=0的平面),所以X轴由Up和Z的叉乘得到:最后,Y则由Z和X叉乘得到:注意Y不再需要标准化,因为X和Z都是单位向量51PPT课件DirectX View Matrix推导XYZWorldspaceCameraspaceXZYptAtptEye52PPT课件DirectX View Matrix推导得到Camera坐标系的3个坐标轴的单位向量后,我们就可以开始构造View矩阵了。53PPT课件DirectX View Matrix推导XYZXZYP向量eye向量P向量PN54PPT课件DirectX View Matrix推导观察上图,各个重要的向量已经标出:黄色向量eye表示World坐标系中眼睛位置向量;红色向量P表示World坐标系中点P的向量;绿色向量PN表示Camera坐标系中点P的向量,我们目标就是求PN。如上图所示,我们考察World坐标系中的点P,在World坐标系中它的向量是红色的P,而在Camera坐标系中它的向量是PN,单独考察它在Camera坐标系的X分量,也即是向量PN在X轴上的投影,55PPT课件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也就确定了。56PPT课件DirectX View Matrix推导回想点乘公式:如果上式的A是单位向量,则|A|=1,所以得到:,这相当于得到B在A方向的投影长度。如下图所示:向量B向量A57PPT课件DirectX View Matrix推导因此,我们就用点乘公式来求向量PN在X的投影,因PN=P-eye,所以:上式X是Camera坐标系的X轴的单位向量。上式等价于下面的齐次向量点乘:58PPT课件DirectX View Matrix推导上式的成立是容易看出的。其中,,和 是Camera坐标系的X轴X单位向量在World坐标系中的x,y,z三个分量。至此,我们已经成功求出PN在X轴的投影,同样的,我们可以求出PN在Y,Z轴的投影:59PPT课件DirectX View Matrix推导点P在Camera坐标系的3个轴上的投影都已求出,我们把这3个等式组合成齐次4X4矩阵:至此我们已经看到View矩阵了。60PPT课件DirectX View Matrix推导View矩阵:嗯,这就是我们的View矩阵。所有World坐标系中的点P经过View矩阵转换后,变成Camera坐标系中的点。61PPT课件DirectX View Matrix推导DirectX为了免除我们构造View矩阵的繁琐,提供了API:D3DXMatrixLookAtLH和D3DXMatrixLookAtRH,LH和RH后缀表示lefthand和righthand左右手坐标系的意思。也就是说前者构造左手坐标系的View矩阵,后者构造右手坐标系的View矩阵。下面我从MSDN拷贝一下它对这两个函数的描述。62PPT课件DirectX View Matrix推导D3DXMATRIX*D3DXMatrixLookAtLH(_inoutD3DXMATRIX*pOut,_inconstD3DXVECTOR3*pEye,_inconstD3DXVECTOR3*pAt,_inconstD3DXVECTOR3*pUp);pOutin,outType:D3DXMATRIX*PointertotheD3DXMATRIXstructurethatistheresultoftheoperation.63PPT课件DirectX View Matrix推导pEyeinType:constD3DXVECTOR3*PointertotheD3DXVECTOR3structurethatdefinestheeyepoint.Thisvalueisusedintranslation.pAtinType:constD3DXVECTOR3*PointertotheD3DXVECTOR3structurethatdefinesthecameralook-attarget.64PPT课件DirectX View Matrix推导pUpinType:constD3DXVECTOR3*PointertotheD3DXVECTOR3structurethatdefinesthecurrentworldsup,usually0,1,0.65PPT课件DirectX View Matrix推导MSDN描述的DirectXView矩阵构造算法:66PPT课件DirectX View Matrix推导嗯,事实上我推导View矩阵之前首先是看了MSDN的View矩阵的,它没有提供推导过程,只提供一个结果,但理解了这个结果之后,推导过程就很清晰了。67PPT课件WikiD3DXMatrixLookAtLH,http:/ Projection Matrix推导首先说一下我对投影矩阵的感觉:由于我是初学者,目前我认为投影矩阵主要有两个意义,第一是令离我们眼睛越远的物体看起来越小,这个意义很大,因为它真实地模拟了现实中的视觉(想起我们看天上的飞机吗?它和小鸟一样小,因为它离我们很远)。第二个意义是经过投影变换后,更加方便裁剪那些不在视锥截体内的顶点。69PPT课件DirectX Projection Matrix推导下面说一下视锥截体这个东西。事实上我们辛辛苦苦变换到Camera坐标系,就是为了它。眼睛望远处时,视野形成一个视锥体,然后设想:离眼睛很近处存在一个平面,只要物体落在平面之前,就看不到,这个平面我们叫做近截面;同样在远处存在一个远截面,只要物件在远截面之后,我们也看不到。70PPT课件DirectX Projection Matrix推导这两个截面将视锥体截断成了一个菱台体,叫做视锥截体。关于视锥截体,首先现实中我们的视锥体是一个圆锥,但计算机中它是一个4面锥体;现实中的确存在远裁面,不过很远,人眼在好天气时可以看到20多公里,也存在近裁面,不过很近,贴近眼皮了。所以对远近裁面,我也是不甚理解。可能是考虑到减少渲染物体的数量吧。71PPT课件DirectX Projection Matrix推导好,定义了视锥截体后,所有在视锥截体之外的顶点都被裁剪掉,不参与渲染了。见下页的图示。72PPT课件DirectX Projection Matrix推导73PPT课件DirectX Projection Matrix推导把上图平面化,也即只观察YZ平面,如下:ZY74PPT课件DirectX Projection Matrix推导考察上图的几个顶点,根据视锥截体的定义,我们很容易把红色的顶点裁剪掉,因为只需要比较他们的y分量或者z分量即发现它们不可能落在视锥截体之内。但是对于蓝色的那个顶点,就不容易了,因为需要判断点落在视锥截体斜边上方还是下方,这可能需要计算斜边的方程(我觉得需要)。但如果借助投影矩阵,蓝色点的裁剪会变得跟红色点一般容易。75PPT课件DirectX Projection Matrix推导投影矩阵的目的是将视锥截体内的点,都投影到近裁面(投影长方体)中。因为这个目的,它成功地使得:物体越远看起来越小;以及方便裁剪顶点。我们由一个幅图开始证明这两点。简明起见,我们把视锥截体平面化,仍然仅考虑YZ平面视图,理解了YZ平面视图后也就自然理解了XZ平面视图了。如下图所示:76PPT课件DirectX Projection Matrix推导ZYP1P2eyeN-PlaneF-Planey1y277PPT课件DirectX Projection Matrix推导如上图所示,考察落在视锥截体内的P1和P2两点,它们的高度(也即Y值)是一样的,但Z值不同,P2的Z值更大,也即是离眼睛更远。但是,它们在近裁面N-Plane的投影点的Y值却不同,P1的为y1,P2的为y2,显然y1y2,也即是在Y方向上,P1看起来要比P2高!这就是投影矩阵的第一目标:越远越小。78PPT课件DirectX Projection Matrix推导y1为什么大于y2呢?嗯,首先从图上可以直观获得结论。也可从数学上,我们通过相似三角形得到等式:上面前两等式左右相除,注意到 ,即得第三个等式:又79PPT课件DirectX Projection Matrix推导至于投影矩阵让顶点裁剪更方便,这点是非常明了的:因为经过投影矩阵变换后,所有位于视锥截体内的点,它们的X,Y坐标都被映射到近裁面N-Plane中(也即是映射后的坐标值X,Y小于或等于N-Plane的宽高),而N-Plane是一个长方形(事实上在投影坐标系里面它是一个边长为2的正方形),所以只需要比较X和Y分量是否在N-Plane的宽高范围内即可!这个映射可以用下图形象的表示出来:80PPT课件DirectX Projection Matrix推导XYZ投影坐标系Camera坐标系投影长方体视锥截体81PPT课件DirectX Projection Matrix推导上图视锥截体从一个菱台经过投影矩阵变换后,成为一个长方体,就像是投影矩阵把远裁面F-Plane压缩到跟N-Plane相同大小一般。这是因为投影矩阵使得菱台内所有点的X,Y经过投影后,都=-1且=1的约定。为什么DirectX会这样约定呢?这个我也不甚清楚,可能是为方便后续裁剪等运算吧83PPT课件DirectX Projection Matrix推导至此,我们知道投影矩阵的目的以及其原理了。下面我们构造投影矩阵:目标是让视锥截体内的点映射到投影长方体内,注意这个映射函数必须是严格单调的,也即不允许视锥截体内多个点映射到投影长方体内同一个点。和推导View矩阵一样,我们对X,Y,Z轴逐个推导,然后再复合成一个矩阵。84PPT课件DirectX Projection Matrix推导ZYPeyeN-PlaneF-PlaneyNPzHF85PPT课件DirectX Projection Matrix推导如上图所示,考察YZ平面视图,对视锥截体内的点P,Y坐标为 ,我们来推导它在N-Plane平面投影的y值。图中N表示近裁面N-Plane的距离,角表示视野在YZ平面的夹角 ,这个英文叫fov(fieldofview)。我们依据相似三角形构造恒等式:,所以y为:前面提到y需要满足DirectX的取值-11约定,所以我们对y除以N-Plane的一半高度86PPT课件DirectX Projection Matrix推导也即:,因为 ,故y的最终表示为:上面等式中,Py是P点在Camera坐标系中的Y值,可以是任意数字,例如1万。而y是投影坐标系中P点的Y值,它的取值范围已经变为-11,跟1万没有关系了。这是因为我们对Py除以了H。H是N-Plane一半的高度。87PPT课件DirectX Projection Matrix推导求得P点在投影坐标系的Y值后,可以用同样的方法求得它在投影坐标系的X值,这个就不画图了,我们可以轻易想象出来,只要把上图的Y轴换成X轴,H换成W(W表示N-Plane一半的宽度),且 换成 ,注意 是指视野在YZ平面的夹角,而 是视野在XZ平面的夹角,它们在现实中可以认为是相等的(因为现实中视锥是一个圆锥),但在计算机中他们往往是不等的,因为它们依赖于计算机屏幕的宽高比例。88PPT课件DirectX Projection Matrix推导好,这样我们又得到x的表达式:上式也可以用 来表达x,这是因为这两个角度依赖于屏幕的宽高比例:现在只剩下z的表达式了。投影矩阵实际上并不关心z,但是由于我们的z必须满足89PPT课件DirectX Projection Matrix推导DirectX对它的要求:取值范围01,所以,对z除以F-Plane与N-Plane之间的距离即可,也即:其中F-N表示两个裁面之间的距离,此处Pz需要减去N一是因为在投影坐标系中原点变为N-Plane的中心点,而不是眼睛点,二是除以F-N才会=1。事实上,上式根本不满足矩阵要求,这里记录下来作为一个思考的过程。90PPT课件DirectX Projection Matrix推导至此,我们的投影矩阵差不多出来了,它现在看起来像这样:但这个矩阵内含变量Pz,我们知道转换矩阵是不能含有未知量的。怎么办呢?91PPT课件DirectX Projection Matrix推导因为未知量是 ,我们自然想到把它提到矩阵外,类似这样:但是这个矩阵仍然有两个问题,第一z分量并没有消除Pz,第二是点变换已不能由一个矩阵相乘解决,还需多一个标量相乘。92PPT课件DirectX Projection Matrix推导先来解决第二个问题,由于4D齐次向量变换回3D向量时,会用w(也即最后一个分量)除以所有分量,以确保w分量一定是1,这个是在转换管线的最后阶段由硬件完成(参看前面MSDN的转换管线)。那么我们可以利用这个特性来解决第二个问题。93PPT课件DirectX Projection Matrix推导也即:让我们的顶点经过投影矩阵转换后,X,Y,Z分量都多带了一个Pz因子的,但这不要紧,因为W分量也是Pz,而我们知道最后顶点会被除以W也即除以Pz,这样我们的顶点的X,Y,Z就恢复到正确的数值了。94PPT课件DirectX Projection Matrix推导根据这个思想,修改我们那个半成品矩阵,把x,y,z的 去掉,同时让w分量成Pz(令第4列3行的元素为1):嗯,现在看起来帅一些了,只剩下第一问题了,见矩阵红色部分:仍然有未知量Pz95PPT课件DirectX Projection Matrix推导下面我们来改造z的表达式,使得它满足矩阵的要求。事实上,先理解表达式 的问题所在:因为w的分量是Pz,也即z最终会被除以Pz,那么矩阵相乘后z应该为:只有这样,才能在最后除以W时得到96PPT课件DirectX Projection Matrix推导问题是这个表达式无论如何都不可通过矩阵乘法获得,因为它含有Pz的二次方。除非矩阵元素 含有Pz,但这又使得矩阵含有未知量了。我们可以在纸上算一下,即可确认这个事实:当转换矩阵不含有Pz时,我们的顶点向量和矩阵相乘绝对不可能得到Pz的二次方,只能得到Pz的一次方,或者0。也就是说,这个映射函数不能满足我们要求。我们需要构建新的映射函数。97PPT课件DirectX Projection Matrix推导我们需要构造一个新函数,和 一样,值域是01,且严格单调递增,当Pz等于N时取得最小值0,当Pz等于F时取得最大值1。依据矩阵乘法规律,我们的点向量和矩阵相乘后,z分量可表述为:经过4D到3D的除法(除w)后,成这样:98PPT课件DirectX Projection Matrix推导我们如果能求出 式子中的 和 ,把它们填入矩阵即可完成z的转换。我们怎样求解这两个变量呢?根据前面的约定,也该是严格单调递增的,而且当Pz=N时取得最小值0,当Pz=F时取得最大值1,由此我们可以用此信息构建方程组,把 和 解出来。99PPT课件DirectX Projection Matrix推导当Pz等于N时,当Pz等于F时,联合两个等式成二元方程组:解得到:100PPT课件DirectX Projection Matrix推导那么:显然z是严格单调递增的。且Pz等于N时z=0,Pz等于F时z=1。101PPT课件DirectX Projection Matrix推导嗯,z的表达式终于确定了。那么最终的投影矩阵是这样子:102PPT课件DirectX Projection Matrix推导和View矩阵一样,DirectX为了免除我们构造投影矩阵的繁琐,它也提供了3组API来构造左右手坐标系的投影矩阵,事实上这3组函数原理相同,其矩阵的构造算法和我们的推导过程一致。这里我们抄录D3DXMatrixPerspectiveFovLH作为示例。103PPT课件DirectX Projection Matrix推导D3DXMATRIX*D3DXMatrixPerspectiveFovLH(_inoutD3DXMATRIX*pOut,_inFLOATfovy,_inFLOATAspect,_inFLOATzn,_inFLOATzf);pOutin,outType:D3DXMATRIX*PointertotheD3DXMATRIXstructurethatistheresultoftheoperation.104PPT课件DirectX Projection Matrix推导fovyinType:FLOATFieldofviewintheydirection,inradiansAspectinType:FLOATAspectratio,definedasviewspacewidthdividedbyheight.105PPT课件DirectX Projection Matrix推导zninType:FLOATZ-valueofthenearview-plane.zfinType:FLOATZ-valueofthefarview-plane.106PPT课件DirectX Projection Matrix推导MSDN给出的DirectX的投影矩阵构造107PPT课件WikiViewportsandClipping,http:/ Viewport转换矩阵非视锥截体内的顶点会被投影转换过程裁剪掉,而视锥截体内的顶点经过投影矩阵变换到投影坐标系后,它的X,Y坐标取值范围是-11,Z坐标取值范围是01。接下来要将这些点绘制到屏幕上。屏幕的宽度W高度H需要我们给定,通过设置DirectX的Viewport属性,来告知DirectX如何将点绘制到屏幕上。109PPT课件DirectX Viewport转换矩阵DirectX的对应API为:SetViewport。HRESULTSetViewport(inconstD3DVIEWPORT9*pViewport);pViewportinType:constD3DVIEWPORT9*PointertoaD3DVIEWPORT9structure,specifyingtheviewportparameterstoset.110PPT课件DirectX Viewport转换矩阵关键是填充D3DVIEWPORT9结构体。111PPT课件DirectX Viewport转换矩阵XType:DWORDPixelcoordinateoftheupper-leftcorneroftheviewportontherender-targetsurface.Unlessyouwanttorendertoasubsetofthesurface,thismembercanbesetto0.YType:DWORDPixelcoordinateoftheupper-leftcorneroftheviewportontherender-targetsurface.Unlessyouwanttorendertoasubsetofthesurface,thismembercanbesetto0.112PPT课件DirectX Viewport转换矩阵WidthType:DWORDWidthdimensionoftheclipvolume,inpixels.Unlessyouarerenderingonlytoasubsetofthesurface,thismembershouldbesettothewidthdimensionoftherender-targetsurface.HeightType:DWORDHeightdimensionoftheclipvolume,inpixels.Unlessyouarerenderingonlytoasubsetofthesurface,thismembershouldbesettotheheightdimensionoftherender-targetsurface.113PPT课件DirectX Viewport转换矩阵MinZType:floatTogetherwithMaxZ,valuedescribingtherangeofdepthvaluesintowhichasceneistoberendered,theminimumandmaximumvaluesoftheclipvolume.Mostapplicationssetthisvalueto0.0.Clippingisperformedafterapplyingtheprojectionmatrix.114PPT课件DirectX Viewport转换矩阵MaxZType:floatTogetherwithMinZ,valuedescribingtherangeofdepthvaluesintowhichasceneistoberendered,theminimumandmaximumvaluesoftheclipvolume.Mostapplicationssetthisvalueto1.0.Clippingisperformedafterapplyingtheprojectionmatrix.115PPT课件DirectX Viewport转换矩阵在我们设置好D3DVIEWPORT9结构体后,DirectX会用结构体中的成员构造一个这样的Viewport转换矩阵:116PPT课件DirectX Viewport转换矩阵这个映射矩阵相对直观许多,目的是为了把点均匀散列到屏幕中。所以就不详细记录Viewport转换矩阵了,我们只需知道这是Transformpipeline的最后一个转换矩阵即可。注意到矩阵对高度转换时前面加了一个负号,这是由于在投影矩阵中Y值是由下至上递增,从-1变化到1,但是Viewport坐标系Y值是从上至下递增,由0变化到屏幕的最大高度。117PPT课件
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!