-潘宏

-2009.4.20

-本人水平有限,疏忽错误在所难免,还请各位数学高手、编程高手不吝赐教

-email: popyy@netease.com

之前我们在《深入探索透视投影变换》以及《深入探索透视投影变换(续)》中研究了OpenGL、D3D以及M3G的透视投影变换的原理以及生成方法。这些方法在当前的主流图形API中得到了普遍使用。但关于投影应用,还有一类经常使用的投影方式需要我们深入理解——正交投影,我们在本篇文章里面研究它(这里假设读者已经看过前两篇文章,并理解了绝大多数的理论,因为正交投影比透视投影的推导关系简单得多,因此我们的推导会非常得快,如果读者有任何的不解,请参考前两篇文章或者通过email联系我)。

在具体研究之前我觉得有必要把平面投影的分类简单介绍一下,目的是为了让大家有一个总体的认识,从而更好的理解这个知识体系。请看下图:

平面投影分为平行投影和透视投影两种类型,后者我们在前两篇文章中介绍了。平行投影则是具有矩形观察体的投影方式(透视投影则是视锥观察体),它不会根据物体离视点的远近缩放物体(透视投影则会)。平行投影可以分成侧投影和正交投影两种类型。这两种类型如何区分呢?我们继续看图吧:

上图中,v是投影平面,n是它的法线。p和q是平面外两点,p’和q’分别是它们在平面上的投影点。q的投影方向向量为Q = 单位化(q’-q),而p的投影方向向量为P = 单位化(p’-p),其中Q不平行于n而P平行于n,则q的投影叫做侧投影,而p的投影叫做正交投影。正交投影是我们今天的研究对象。

实际上上面对平面投影的分类还可以继续向下细分,比如透视投影可以分为一灭点、二灭点以及三灭点透视投影。侧投影则可以继续分为散点侧投、斜二轴侧投等等。而正交投影则可以分成轴侧投影以及多视点正交投影等等。如果读者对此感兴趣,可以参考相关的图形学教程。

接下来我们研究正交投影。分别介绍OpenGL、D3D以及M3G的。我们的环境约定(左右手坐标系、行列向量乘法、CVV范围)仍然尊重相应API自己的设置。

OpenGL正交投影变换
    下图是OpenGL的右手坐标系中观察空间的情形,我们看到的是正交投影的矩形观察体,原点是相机位置,n是近裁剪平面到相机平面的距离,f是远裁剪平面到相机平面的距离。p是观察体中的一个点,p’是它投影之后的点。

投影之后我们有关系:

因为是正交投影,没有统一的投影射线目标点,因此投影之后的x和y不会变,而z则永远地变成了-n,跑到了投影平面上(我们让投影平面和近裁剪平面重合),它已经没用了,则我们用这个没用的信息保存z(为了之后片元操作的时候用),写为:

从而在z方向上构建 CVV,使得当z在近裁剪平面的时候,az+b=-1,而z在远裁剪平面的时候az+b=1(OpenGL的CVV的z范围是[-1,1],我已经说了三遍了,如果读者感到迷惑不解,强烈建议把前两篇文章理解)。我们算出a和b

然后我们就通过当前的结果反推正交投影矩阵版本一

接着把x和y建立成CVV情形(简单的线性插值)

反推正交投影矩阵版本二(最终版本)

则右边的那个矩阵就是OpenGL的正交投影矩阵,它可以通过glOrtho创建出来。如果你读过并理解了之前两篇文章,你会觉得我的推导越来越简洁利落了:)OpenGL的解决了,下面是D3D的。

D3D正交投影变换
    下图是D3D左手坐标系中观察空间的情形。因为是左手坐标系,因此近裁剪平面在z = n平面,而远裁剪平面在z = f平面。

投影之后,有

用第三个没用的信息保存z,写为

使得(D3D的CVV的z范围是[0, 1])

反推正交投影矩阵版本一

对x和y进行CVV线性插值

分两种情况讨论(如果读者对此不清楚,请参考第二篇文章《深入探索透视投影变换(续)》):

(1)       投影平面居中,销掉两边的1/2,然后反推正交投影矩阵

后面那个矩阵就是相应正交投影矩阵,这个也是D3DXMatrixOrthoLH方法所使用的情况。

(2)       一般情况,投影平面不一定居中,直接通过投影结果反推正交投影矩阵

后面那个矩阵就是相应的正交投影矩阵,这个也是D3DXMatrixOrthoOffCenterLH方法所使用的情况。好了,D3D的也介绍完毕,接下来是M3G的。

M3G正交投影变换
M3G是对OpenGL的封装,因此环境和OpenGL的相同,我们从对x和y的插值来看

M3G只使用居中的投影平面,因此可以销掉两边的1/2,得到

接着反推出正交投影矩阵

最后那个矩阵就是M3G的正交投影矩阵,也就是Camera.setParallel所使用的形式。

结束语
以上介绍了三个API所使用的正交投影矩阵的生成方法,三者的正交投影矩阵依然可以通过视野(FOV)以及投影平面的宽高比(Aspect Ratio)来设置,这里请读者自行推导,可以参考第二篇文章《深入探索透视投影变换(续)》。

正交投影矩阵和透视投影矩阵一样可以有无穷多个,但原理相同,不同的只是环境。目前正交投影在3D引擎中有着和透视投影同样的地位,它至少是3D用户界面系统的基础。因此,有必要清晰地理解正交投影矩阵和透视投影矩阵的原理,如此才能够真正创建、修改、使用好图形引擎。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/popy007/archive/2009/04/26/4126809.aspx

深入探索正交投影变换相关推荐

  1. 深入探索透视投影变换(续)

    -潘宏 -2009.4.14 -本人水平有限,疏忽错误在所难免,还请各位数学高手.编程高手不吝赐教 -email: popyy@netease.com -B站专栏: https://b23.tv/oW ...

  2. 正交投影变换与透视投影

    相机投影模型 三维计算机图形学的基本问题之一就是三维观察问题:即如何把三维场景投影到要显示的二维图像.大多数经典的解决投影变换方法有两种:正交投影变换和透视投影变化. 正交投影变换用一个长方体来取景, ...

  3. 深入探索透视投影变换

    转自:https://blog.csdn.net/popy007/article/details/1797121 透视投影是3D固定流水线的重要组成部分,是将相机空间中的点从视锥体(frustum)变 ...

  4. Opengl投影变换理解

    坐标到达观察空间之后,我们需要将其投影到裁剪坐标.裁剪坐标会被处理至-1.0到1.0的范围内,并判断哪些顶点将会出现在屏幕上. 而[-1.0,1.0]构成的正方体又叫规则观察体(Canonical V ...

  5. 相机标定(三)—— 正交投影和透视投影变换

    正交投影和透视投影变换 1. 概述 2. 视锥体 3. 透视投影的目的 4. 透视投影的理解和推导 4.1 透视基本原理 4.2 一点透视 4.3 多点透视 4.4 生成透视投影图的方法 5. 图像处 ...

  6. 相机标定(二)—— 投影变换相关基础概述

    本节主要介绍MVP(Model-View-Projection-模型视图投影)相关概念,来说明三维空间中的物体是如何映射到二维屏幕上的.其中包括: View/Camera Transformation ...

  7. 三维图形几何变换与投影变换

    一.实验目的 1)掌握4*4矩阵乘法运算的编程实现 2)掌握平移,比例,旋转三种基本三维几何变换矩阵生成 3)掌握正交投影图的生成和绘制方法 二.实验要求 1)三维坐标系的原点位于屏幕中心,X轴水平向 ...

  8. 深入探索透视纹理映射(下)

    深入探索透视纹理映射(下) 我的建议:建议学习一下图形学的知识 计算机图形学 赵明.李振波 中国农业大学  公开课   第二讲 光栅图形学算法 http://www.icourse163.org/le ...

  9. 计算机图形学笔记(观测变换、模型变换、视图变换、投影变换、视口变换)

    计算机图形学笔记(观测变换.模型变换.视图变换.投影变换.视口变换) 目录 计算机图形学笔记(观测变换.模型变换.视图变换.投影变换.视口变换) 一.简介 1.模型变换(Model transform ...

最新文章

  1. 适用于AMD ROC GPU的Numba概述
  2. 好用的数据增强工具Augmentor(原图和mask扩充)
  3. genrsa out php,PHP进行RSA加密解密
  4. iphone自定义铃声
  5. PHP替换回车换行的三种方法
  6. P4310-绝世好题【位运算,dp】
  7. java字节字符流实验报告_Java第09次实验(IO流)--实验报告
  8. 限制EditText只能输入小数点后两位
  9. lora发射和接收原理_LoRa 的扩频技术
  10. JVM Specification 9th Edition (4) Chapter 3. Compiling for the Java Virtual Machine
  11. 三年级下册我想发明的机器人_我想发明的机器人作文300字
  12. 『ORACLE』 Linux和oracle用户下的常用命令(11g)
  13. 【大学物理学】机械振动
  14. 如何把pdf转成jpg格式?
  15. dreamweaver序列号免费_dreamweaver8【dreamweaver8序列号】dreamweaver8注册码序列号简体中文版...
  16. 中国各省市恩格尔系数表(​1978-2019年)
  17. linux 强制结束任务管理器,结束拒绝访问的进程 cmd下结束进程 强行结束进程
  18. JavaScript弹窗事件
  19. 苹果未能与恢复服务器取得联系解决
  20. 4点策略教你如何做好社群营销

热门文章

  1. python开源库——h5py快速指南
  2. wms、wmts、wfs等地图服务区别
  3. Vlan总结(Chinaitlab教程)
  4. android设置图片 透明度渐变效果,android 自定义属性实现 ImageView 透明度渐变效果...
  5. 用Python教训盗号骗子
  6. Git切换项目当前登录账号
  7. AAA云免费云主机推荐码
  8. 查询MySQL数据库中所有表的结构
  9. final 修饰的成员变量必须手动初始化
  10. 计算机数字媒体专业毕业论文,数字媒体艺术专业毕业论文