《透视投影矩阵推导270.pdf》由会员分享,可在线阅读,更多相关《透视投影矩阵推导270.pdf(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、在上一篇文章中我们讨论了透视投影变换的原理,分析了 Ope nGL所使用的透视 投影矩阵的生成方法。正如我们所说,不同的图形API因为左右手坐标系、行向 量列向量矩阵以及变换范围等等的不同导致了矩阵的差异,可以有几十个不同的 透视投影矩阵,但它们的原理大同小异。这次我们准备讨论一下 Direct3D(以 下简称D3D以及J2ME平台上的JSR184(M3G(以下简称M3G的透视投影矩 阵,主要出于以下几个目的:(1)我们在写图形引擎的时候需要采用不同的图形 API实现,当前主要 是OpenGL和D3D虽然二者的推导极为相似,但 D3D的自身特点导致了一些地 方仍然需要澄清。(2)DirectX
2、 SDK的手册中有关于透视投影矩阵的一些说明,但并不详 细,甚至有一些错误,从而使初学者理解起来变得困难,而这正是本文写作的目 的。(3)M3G 是J2ME平台上的3D开发包,采用了 OpenG!作为底层标准进 行封装。它的透视投影矩阵使用 Ope nG啲环境但又进行了简化,值得一提。本文努力让读者清楚地了解D3D与 M3G透视投影矩阵的原理,从而能够知道它与 OpenG啲一些差别,为构建跨 API的图形引擎打好基础。需要指出的一点是为 了完全理解本文的内容,请读者先理解上一篇文章 深入探索透视投影变换的 内容,因为OpenGL和它们的透视投影矩阵的原理非常相似,因此这里不会像上 一篇文章从基
3、础知识讲起,而是对比它们的差异来推导变换矩阵。我们开始!OpenGl与D3D的基本差异 前面提到,不同API的基本差异导致了最终变换矩阵的不同,而导致 OpenGL和 D3D的透视投影矩阵不同的原因有以下几个:(1)Ope nGL 默认使用右手坐标系,而 D3D默认使用左手坐标系 OpenGL riiUjandeci coordinate system D3D lefthanded coordinate system(2)T b c y X f g h z f J k i n QpenGL-Column-Vector Miitiplkation Ope nGL 使用列向量矩阵乘法而 D3D使用
4、行向量矩阵乘法 (3)OpenGL 的 CVV勺 Z 范围是-1,1,D3D的 CVV勺 Z范围是0,1 以上这些差异导致了最终OpenGL和D3D的透视投影矩阵的不同。D3D的透视投影矩阵推导 我们先来看最最基本的透视关系图(上一篇文章开始的时候使用的图):这里我们考察的是xz平面上的关系,yz平面上的关系同理。这里o是相机位置。np是近裁剪平面,也是投影平面,N是它到相机的距离。fp是远裁剪平面,F 是它到相机的位置。p是需要投影的点,p是投影之后的点。根据相似三角形 定理,我们有 gpo=&qlpQ 则有 匚=乙二楚=N兰同理”二 DHD Row-V ector Multiplicati
5、on N X z z z z 注意到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中在近裁剪平面上的点投影之后的点会处于 CV
6、V 的z=0平面上,而在远裁剪平面上的点投影之后的点会在 CVV勺z=1平面上。这 样我们的计算方程就是 从而我们得到了透视投影矩阵的第一个版本 fN 0 0 0 N 0 0 0 0 a 1 0 b Persp Pr oj=b=-F_N F Q=N NF J fN 0 0 y X 0 N 0 0 Z 0 0 a 1 az+b b 1 0 b z丿 right-left bottom%-(-1)1-(-1)这个时候第三个分量变换到 CVV情形了,CVV勺z范围是0,1。接下来根据上 一篇文章所讲到的,我们要把前两个分量变成 CVV青形,CVV勺x和y范围是-1,1,如下图所示:使用线性插值,我们
7、有:top-bottom 1 (1)这里left和right是投影平面的左右范围,top和bottom是投影平面的上下范 围。xcvv和ycvv是我们需要算出的在 CVV青形中的x和y,也就是我们要计算 出的结果。但在算出它们之前,我们先把上面的式子写成:Nx/z 硕林1 r-=-+right left right left 2 2 Ny/t/z _ botlom _ ycvv 1 lop-bottom lop-bottom 2 2 这里有一个需要注意的地方,如果投影平面在 x方向上居中,则 _ 硕 二 1_ right-left 2 那么第一个式子就可以销掉等号两边的 1/2,写成 rigi
8、d-left 2 同理,如果投影平面在y方向上居中,则第二个式子可以写成 缚/_/z _儿仰 top 一 bottom 2 则我们现在分两种情况讨论:(1)投影平面的中心和x-y平面的中心重合(在x和y方向上都居中)(2)一般情况 我们分别讨论:(1)特殊情况方程 top-bottom 2 这组是特殊情况,方程比较简单,但也是使用频率最高的方式(这是 D3DXMatrixPerspectiveLH、D3DXMatrixPerspectiveRH、D3DXMatrixPerspectiveFovLH、D3DXMatrixPerspectiveFovRH 四个方法所使用 的情况)。我们导出它:2Nx(right 一 left)z 2Ny top-bottom)z 则我们反推出透视投影矩阵:(2M 3 r(2NxT f y T F+M 1 N 1“2NF b -(2N“a J 0 0 0 r-l?o 0 0 y t b z 0 0 a b 1 0 0-10,最右边那个矩阵就是M3G的透视投影矩阵 影矩阵,这里请读者自行推导,方法与上面