ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:228.75KB ,
资源ID:5826697      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5826697.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(透视投影矩阵推导.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

透视投影矩阵推导.docx

1、透视投影矩阵推导在上一篇文章中我们讨论了透视投影变换的原理,分析了 OPe nGL所使用的透视 投影矩阵的生成方法。正如我们所说,不同的图形APl因为左右手坐标系、行向 量列向量矩阵以及变换范围等等的不同导致了矩阵的差异,可以有几十个不同的 透视投影矩阵,但它们的原理大同小异。这次我们准备讨论一下 DireCt3D (以 下简称D3D以及J2ME平台上的JSR184(M3G (以下简称M3G的透视投影矩 阵,主要出于以下几个目的:(1) 我们在写图形引擎的时候需要采用不同的图形 API实现,当前主要是OPenGL和D3D虽然二者的推导极为相似,但 D3D的自身特点导致了一些地 方仍然需要澄清。

2、(2) DireCtX SDK的手册中有关于透视投影矩阵的一些说明,但并不详细,甚至有一些错误,从而使初学者理解起来变得困难, 而这正是本文写作的目 的。(3) M3G 是J2ME平台上的3D开发包,采用了 OPenG!作为底层标准进行封装。它的透视投影矩阵使用 OPe nG啲环境但又进行了简化,值得一提。本文努力让读者清楚地了解D3D与 M3G透视投影矩阵的原理,从而能够知道它与 OPenG啲一些差别,为构建跨 API的图形引擎打好基础。需要指出的一点是为 了完全理解本文的内容,请读者先理解上一篇文章 深入探索透视投影变换的 内容,因为OPenGL和它们的透视投影矩阵的原理非常相似,因此这里

3、不会像上 一篇文章从基础知识讲起,而是对比它们的差异来推导变换矩阵。我们开始!OPenGL D3D的基本差异前面提到,不同API的基本差异导致了最终变换矩阵的不同,而导致 OPenGL和D3D的透视投影矩阵不同的原因有以下几个:(1) OPe nGL 默认使用右手坐标系,而 D3D默认使用左手坐标系OPerLGL riiUxandeci CoOrdinate system DmD handed coordinate SyStem(2)OPe nGL 使用列向量矩阵乘法而 D3D使用行向量矩阵乘法(3) OPenGL 的 CVV勺 Z 范围是-1, 1 , D3D的 CVV勺 Z范围是0, 1以

4、上这些差异导致了最终OPenGL和D3D的透视投影矩阵的不同。D3D的透视投影矩阵推导我们先来看最最基本的透视关系图(上一篇文章开始的时候使用的图):这里我们考察的是XZ平面上的关系,yz平面上的关系同理。这里0是相机位置。 np是近裁剪平面,也是投影平面,N是它到相机的距离。fp是远裁剪平面,F 是它到相机的位置。P是需要投影的点,p是投影之后的点。根据相似三角形 定理,我们有gpQ = qlp,0则有匚=J N兰同理F= Ny_XZZ Z Z注意到OPenGL使用右手坐标系,因此应该使用-N(请参考上一篇文章的这一步) 而D3D使用左手坐标系,因此使用N,这是二者的不同点之一。这样,我们得

5、到 投影之后的点第三个信息点是变换之后的Z在投影平面上的位置,也就是 N,它已经没用了, 我们把p写成从而用第三个没用信息点它来存储 Z (如果读者对这一点不太了解,请参考上一 篇文章)。接下来我们求出a和b,从而在Z方向上构建CVV请注意这里是OPenGL 和D3D的另一个不同点,OPenGL勺CVV的 Z范围是-1,1,而D3D的 CVV的 Z 范围是0, 1。也就是说,D3D中在近裁剪平面上的点投影之后的点会处于 CVV 的Z=O平面上,而在远裁剪平面上的点投影之后的点会在 CVV的 z=1平面上。这 样我们的计算方程就是+ ZazL Z从而我们得到了透视投影矩阵的第一个版本这个时候第三

6、个分量变换到 CVV情形了,CVV勺Z范围是0,1。接下来根据上 一篇文章所讲到的,我们要把前两个分量变成 CVV青形,CVV勺X和y范围是-1, 1,如下图所示:使用线性插值,我们有:top - bottom 1 (1)这里left和right是投影平面的左右范围,top和bottom是投影平面的上下范 围。XCVV和ycvv是我们需要算出的在 CVUf形中的X和y ,也就是我们要计算 出的结果。但在算出它们之前,我们先把上面的式子写成:N% Ieft _ v 1 = + right Ieft right Ieft 2 2Ny/ tz _ botSn _ ycvv 1lop- bottom

7、lop- bottom 2 2这里有一个需要注意的地方,如果投影平面在 X方向上居中,则_ 硕 =right - Ieft 2那么第一个式子就可以销掉等号两边的 1/2 ,写成rigid - Ieft 2同理,如果投影平面在y方向上居中,则第二个式子可以写成缚/ z _儿仰top 一 bottom 2则我们现在分两种情况讨论:(1) 投影平面的中心和x-y平面的中心重合(在X和y方向上都居中)(2) 一般情况我们分别讨论:(1)特殊情况方程top-bottom 2这组是特殊情况,方程比较简单,但也是使用频率最高的方式(这是D3DXMatrixPerspectiveLH、D3DXMatrixPe

8、rspectiveRH、D3DXMatrixPerspectiveFovLH、D3DXMatrixPerspectiveFovRH 四个方法所使用的情况)。我们导出它:INx(right 一 Ieft )z 2Nytop - bottom )z则我们反推出透视投影矩阵:( 27* 3T( 2J 、TyT(top - bottom)Z其Vt-bW Waz + baz + b00 1Z1L Z JI 00b OJ其中a = F-N NFF-N而r-l和t-b可以分别看作是投影平面的宽 W和高h。最后那个矩阵就是D3D的 透视投影矩阵之一。另外呢,如果我们不知道 right、left、top以及bo

9、ttom这几个参量,也可以根据视野(FoV- FieId Of VieW )参量来求得。下面是两 个平面的视野关系图:2 鮎 W 2TM二尸-Z2N JOVV7 = UOt 才r-l 22Ncot 同理= cot其中虫7h 22N Jfo升-b 2苦 2NCot-_-2其中,两个fov分别是在X-Z以及y-z平面上的视野。如果只给了一个视野, 可以通过投影平面的宽高比计算出来:aspect _ ratio 二h=W =血 X asp&ct _ 1rafio或者 aspect _ ratio用一个视野算出W或者h,然后用宽高比算出h或者WO(2) 般情况的方程这组方程比较繁琐,但更具一般性(和

10、OPe nGL一般矩阵的推导一致,这也是D3DXMatrixPerspective0ffCenterLH 和 D3DXMatrixPerspectiveOffCenterRH 两 个方法所使用的情况)。我们导出它:我们继续反推出透视投影矩阵:2Nr-l2Nt_b b + tb-tO其中F-NJ NFb 最后那个矩阵就是D3D的一般透视投影矩阵 好了,目前为止,我们已经导出了 D3D的两个透视投影矩阵。下面我把上一篇导 出的OPenGL的透视投影矩阵写出来,大家可以拿它和刚刚导出的 D3D的一般性 透视投影矩阵做一个对比。(2Nr-l022r + Zr-l t +&0pr*oj _ matrix

11、 (OPe GL)=0t-bt -b000abt 00-1o丿其中a F=N* 2NFb 如果仔细观察,可以发现二者在元素的布局上是一个转置的关系, 这个就是由它 们使用的左右手坐标系以及使用的行列矩阵的差异造成的。 而另外在一些元素的细节上也存在着差异,这是由于D3D的CVV勺Z范围不同造成的。可见在原理相 同的情况下,细微的环境差异可以造成非常大的变化, 而这就是透视投影矩阵存 在诸多不同版本的原因。一般情况的透视投影矩阵也可以使用视野方式来定义, 方法和特殊情况相同。M3G勺透视投影矩阵M3G是对OPenG进行的一个封装,它的透视投影变换矩阵被放到了类 Camera里 面。因为它封装了

12、OPenGL因此环境和OPenGl相同:右手坐标系、列向量乘法、 CVV范围-1,1。它唯一和OPenGL有些差异的地方就在于它只使用投影平面 的中心和x-y平面的中心重合(在X和y方向上都居中)的情况(就是我们上面 D3D的第一种特殊情况)。我们用 OPe nG透视投影矩阵最终版本来说明(再次 提醒,如果读者对此感到迷惑,请参考第一篇文章):(2Nr-l02Nr + ?r-l t +b0PrqJ _ matrix (OPen GL)0t-bt-b000abt 00-1其中F + Ma = F7 J 2NF 上面是OPenGL透视投影矩阵的最终版本,也是一般性版本,我们要把它变成特 殊性,版本

13、,非常简单,和上面D3D的特殊情况一样,我们从对X和y进行插值 的那一步来看:r-l r-l 2 2% b _y I.t-b t-b 2 +2t _ 1 (_1)f b 1 (-1)和D3D的第一种情况一样,销掉两边的1/2 ,得到:则我们反推出透视投影矩阵:(f ”7八玲7)-2Nyr-l2Nyzt - 0)az-b 予i- IZ + ZI ) 其中I y F + M111 2NFb I(2N C O O Or-l?OOoy ZO O a bI O Q -1 Qyj仍然可以通过视野参数来设置透视投D3D的完全相同。最右边那个矩阵就是M3G的透视投影矩阵 影矩阵,这里请读者自行推导,方法与上面

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1