摄像机矩阵和投影矩阵推导.ppt
《摄像机矩阵和投影矩阵推导.ppt》由会员分享,可在线阅读,更多相关《摄像机矩阵和投影矩阵推导.ppt(117页珍藏版)》请在三一办公上搜索。
1、3D Study Notes,向量和矩阵变换,Linguohua2012/7/11,说明,主要是为了备忘,本文记录了我学习向量和矩阵过程中遇到的一些基础知识以及数学证明。数学证明大多是我自己的想法,所以一些过程并不是最简的,原因之一是我在空间和微分几何方面的知识积累甚少。如果你有更简单的方法,请让我知道。,说明,先记录向量和向量的运算,以及点乘和叉乘的证明。然后简要记录若干个重要的坐标空间。接着详细推导View矩阵和Projection矩阵。最后是记录DirectX的一个旋转立方体的Tutorial。,说明,写记录最艰难莫过于公式编辑了,每一个数学式子,都是从Word里面用公式编辑器编辑好,再
2、复制过来,更悲剧的事情是PPT貌似不支持公式,它把复制过来的公式直接变成图片了。可见我是多用心。,点和(方向)向量,数值上,都是用x,y,z表示。前者表示位置,后者表示方向。因表征意义不同,图形库一般以Point类和Vector类表达两者,但它们在数值层面是一致的。因方向向量的核心是方向,故两个方向向量的x,y,z数值可能不同,但方向却是一样的,我们认为这两个方向向量等价。,点和(方向)向量,方向向量C和B等价,因它们表达的方向是相同的。数值上点A和向量B相等,但物理意义不同,(位移)向量,虽然多数时候向量纯粹表达方向,但事实上它还带有长度的信息,向量x,y,x在3D空间的长度是。故,可以把向
3、量理解为在一个方向上长度为 的位移。例如两点之间的距离向量,就是一个典型的位移向量。我们通常结合上下文,来判断向量是纯粹方向的还是位移的向量。,向量的基本运算:加法,向量的加法法则定义为:加法结果还是一个向量,从数值上看,结果向量的每一个分量均“变大”了(严格来说这取决于b的符号)。,加法,向量A加向量B,先把A或者B平移(在A和B所确定的平面上平移),使得A和B成首尾相接,加法,平移向量A得到向量A,这样向量B和向量A首尾相接,连接向量B的起点和向量A的终点,即可得到结果:向量C。平移向量B也会得到同样 的结果。,向量的基本运算:减法,向量的减法法则定义为:减法结果还是一个向量,从数值上看,
4、结果向量的每一个分量均“变小”了(严格来说这取决于b的符号)。,减法,向量A减向量B,先把A或者B平移(在A和B所确定的平面上平移),使得A和B成首首相接,减法,平移向量A到向量A,由于是A-B,所以连接B的尾部到A的尾部,使得结果向量指向被减数,所得的向量即是A-B平移向量B也能得到同样的结果,向量的基本运算:点乘,Dot Product,又叫点乘或点积,定义为:如上式所示,点乘的结果是一个标量。后面我们将要证明该标量和 相关,其中 是这两个向量的夹角,也即是说,从两个向量点乘的结果能得出它们之间的夹角。这就是点乘的价值所在。,点乘的证明,点乘的证明,如上图所示,向量A是,向量B是。它们的夹
5、角为,向量C的是多少呢?由图示以及向量减法法则,可得向量C为:向量A,B,C构成一个三角形,而三角形的余弦定理,注意余弦定理等式中的A,B,C是指三角形的边长,均是标量。,点乘的证明,余弦恒等式用到的边长即是向量A,B,C的模,据此,分别求三个向量的模并代入余弦定理得:等式的|A|和|B|表示向量的模。化简等式即可得到直观的结果,见下页,点乘的证明,化简前面等式得到:上式左边即是点乘的定义。至此,我们看出点乘和 成正比,可用下式表示:其中 是向量A和向量B的点乘,而 是两个向量的模的乘积。,点乘的证明,因此,如果两个向量的点乘结果是零,可知它们相互垂直。由上面的夹角 的等式,可以求得两个向量的
6、夹角。,向量的基本运算:叉乘,Cross Product,又叫叉乘或叉积,定义为:嗯,不易看出规律,看下页,叉乘,注意下图的颜色和箭头左边同颜色箭头所连接的元素,构成右边同颜色的元素。这些箭头是交叉的。这可能就是叉乘名字的由来吧。,叉乘,可以用xyzzy方法记忆叉乘公式:其中xyz表示3个轴的坐标值,简单起见设左边第一个向量为A,第二个为B,右边的结果向量为C,依照xyzzy:接着求,需要按照x-y-z-x的规则变换xyzzy成yzxxz,得:同样可以求得,叉乘,和点乘比较,点乘得到的结果是一个标量,但叉乘得到的是3个标量所构成的一个向量,这个差异很大。既然叉乘得到一个向量,那么这个向量具有什
7、么性质呢?嗯,直接观察不易,我觉得从线性代数和矩阵论的范畴,应该能够简单地得到结论。不过,我们可以利用点乘来得出叉乘的一些性质。,叉乘性质证明,让叉乘的两个向量分别和叉乘的结果向量进行点乘运算,得:,叉乘性质证明,由上面两式和点乘的性质,得知叉乘的结果向量和原来的两个向量都垂直。我们知道原来的两个向量确定了一个平面,也即是说叉乘的结果向量垂直于这个平面。这就是叉乘的重要几何意义。下面我们分析叉乘结果向量的模。,叉乘结果向量的模,由点乘公式:等式两边平方,然后用三角等式 代换后并整理得到:,叉乘结果向量的模,注意到上式左边是叉乘结果向量的模的平方,所以对等式两边开平方,即得:上式便是关于叉乘的模
8、的等式。至此,我们知道叉乘会得到一个垂直于原来两个向量(以及它们所在平面)的向量,且这个向量的长度满足上述等式。但仍有一个问题:这个垂直向量朝向那个方向呢?,叉乘,向量A,向量C,向量B,叉乘向量的方向,如上图所示,向量C方向朝上还是朝下(注意:不管朝向如何,它终归都会垂直于原来的两个向量)?一个简单的判断方法,见下页的图示。注意如果是左手坐标系,就用左手,如果是右手坐标系,那么需要用右手。,叉乘向量的方向,点乘和叉乘用途,至此,我们知道点乘得到一个标量,这个标量跟原来两个向量的夹角相关。所以,在3D图形学中常通过两个向量的点乘得到它们之间的夹角。我们知道叉乘得到一个垂直于原来两个向量的新向量
9、,3D图形学中常用这种方式求垂直于平面/三角面/多边形等的向量。例如法线(凹凸)贴图时,需要求出垂直于顶点的法线。,Wiki,叉乘和点乘都是由Josiah Willard Gibbs在1881年提出的。Dot product:Scalar product,Cross product:Vector product,左手和右手坐标系,在3D空间中存在这样的两种坐标系,不管怎么翻转,都不能从一种坐标系变换到另一种坐标系。这两种坐标系我们用左手坐标系和右手坐标系来称呼和区分它们。DirectX常用左手坐标系,OpenGL则惯用右手坐标系。不要担心,事实上他们的x,y坐标轴完全一样,只是z轴一个向里,一
10、个向外。如下图所示:,左手和右手坐标系,坐标系和坐标系转换,3D模型从建模到渲染最后阶段输出到屏幕需要经历多个坐标系,从一个坐标系到另一个坐标系则需要一个转换过程。这个过程是由一个转换矩阵来实施的。本节简要记录一些关键坐标系(坐标空间),和相应的转换说明,然后以DirectX为例,记录和推导几个重要的转换矩阵。,Model坐标系,模型坐标系,也叫Local坐标系。例如我们在3DMax,MAYA等建模工具中建立我们的人物模型时,模型中的顶点坐标值就是Model坐标系的值。设想我们有多个人物模型,那么每一个模型都有属于自己的Model坐标系。,World坐标系,World坐标系也是很直观的,我们把
11、若干个模型放在一起组成一张场景,场景的坐标系就是World坐标系,这就像我们现实世界一样。一个模型放置到World坐标系之后,它的顶点坐标值就需要从Model坐标系转换为World坐标系中的值。如下页图示:,World坐标系,Model坐标系和World坐标系顶点P在Model坐标系中的值和在World坐标系中的值是不同的,顶点P,Camera坐标系,Camera坐标系是人眼观察World坐标系时,以人眼为原点,视线方向为Z轴建立的新坐标系,这个坐标系以观察者(眼睛)为中心,为视野裁剪和投影等做好铺垫。随着观察者眼睛位置的变化,或者视线方向的变化,Camera坐标系也同时变换。,Project
12、ion坐标系,Projection即投影坐标系基于Camera坐标系变换而来的新坐标系,这个新坐标系把视野外的东西剔除掉,把视野内的东西投影到屏幕(近裁面)上,并且离眼睛越远的东西看起来越小。,tangent坐标系,还有很多具有专门用途的坐标空间,例如Tangent即切线坐标系,它适合于根据高度图(Height map)计算法向图(Normal map)。此处就不一一列举其他坐标空间了,事实上我知道的太少了,列举不出来呀。,坐标系的转换,抄录自MSDN,Transform pipeline,Wiki,Transform pipeline,http:/,坐标系的转换和矩阵,任意两个坐标系的转换都
13、经由一个转换矩阵完成。例如从Model坐标系到World坐标系,需要经过World转换矩阵进行变换。World矩阵主要用于伸缩,平移,和旋转。伸缩/平移较为直观,而旋转会有几种方式,例如构造矩阵旋转,或欧拉角旋转,或四元数旋转。限于篇幅就不详细记录了。将来如有需要,再单独记录。,坐标系的转换和矩阵,后续的内容主要记录World坐标系转换之后的Camera坐标系,Projection坐标系的转换。接下来记录的转换矩阵推导,是用DirectX来举例。事实上,这些推导过程在OpenGL上也是一样的,如果有差别,也是一些数值上的细微差别,例如DirectX的远近裁剪面定为01,而OpenGL的定为-1
14、1。,DirectX View Matrix推导,从World坐标系转换到Camera坐标系需要一个转换矩阵帮忙,这个矩阵叫View矩阵。,DirectX View Matrix推导,View矩阵是一个4X4的矩阵,作用是将顶点从World坐标系转换到Camera坐标系。Camera坐标系是一个这样的坐标系:以眼睛的位置为原点,视线方向为Z轴的一个坐标系。新坐标系的X轴朝向观察者的右手方向,Y轴朝向观察者头顶方向。在World坐标系的顶点 经过View矩阵转换后,得到一个位于Camera坐标系的新坐标。,DirectX View Matrix推导,运算过程:注意运算时采用的是齐次坐标,各个分量
15、取值是基于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向
16、量呢?非常正规的含义我也不清楚。但从运算角度来说,如果没有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
17、,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
18、,在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也就确定了。,
19、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轴的投影:,Direc
20、tX 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左右手坐标系的意思。也就是说前
21、者构造左手坐标系的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 operat
22、ion.,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:constD3DXVECTOR
23、3*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 Ma
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 摄像机 矩阵 投影 推导
链接地址:https://www.31ppt.com/p-6164507.html