深入探索正交投影变换
-潘宏
-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
深入探索正交投影变换相关推荐
- 深入探索透视投影变换(续)
-潘宏 -2009.4.14 -本人水平有限,疏忽错误在所难免,还请各位数学高手.编程高手不吝赐教 -email: popyy@netease.com -B站专栏: https://b23.tv/oW ...
- 正交投影变换与透视投影
相机投影模型 三维计算机图形学的基本问题之一就是三维观察问题:即如何把三维场景投影到要显示的二维图像.大多数经典的解决投影变换方法有两种:正交投影变换和透视投影变化. 正交投影变换用一个长方体来取景, ...
- 深入探索透视投影变换
转自:https://blog.csdn.net/popy007/article/details/1797121 透视投影是3D固定流水线的重要组成部分,是将相机空间中的点从视锥体(frustum)变 ...
- Opengl投影变换理解
坐标到达观察空间之后,我们需要将其投影到裁剪坐标.裁剪坐标会被处理至-1.0到1.0的范围内,并判断哪些顶点将会出现在屏幕上. 而[-1.0,1.0]构成的正方体又叫规则观察体(Canonical V ...
- 相机标定(三)—— 正交投影和透视投影变换
正交投影和透视投影变换 1. 概述 2. 视锥体 3. 透视投影的目的 4. 透视投影的理解和推导 4.1 透视基本原理 4.2 一点透视 4.3 多点透视 4.4 生成透视投影图的方法 5. 图像处 ...
- 相机标定(二)—— 投影变换相关基础概述
本节主要介绍MVP(Model-View-Projection-模型视图投影)相关概念,来说明三维空间中的物体是如何映射到二维屏幕上的.其中包括: View/Camera Transformation ...
- 三维图形几何变换与投影变换
一.实验目的 1)掌握4*4矩阵乘法运算的编程实现 2)掌握平移,比例,旋转三种基本三维几何变换矩阵生成 3)掌握正交投影图的生成和绘制方法 二.实验要求 1)三维坐标系的原点位于屏幕中心,X轴水平向 ...
- 深入探索透视纹理映射(下)
深入探索透视纹理映射(下) 我的建议:建议学习一下图形学的知识 计算机图形学 赵明.李振波 中国农业大学 公开课 第二讲 光栅图形学算法 http://www.icourse163.org/le ...
- 计算机图形学笔记(观测变换、模型变换、视图变换、投影变换、视口变换)
计算机图形学笔记(观测变换.模型变换.视图变换.投影变换.视口变换) 目录 计算机图形学笔记(观测变换.模型变换.视图变换.投影变换.视口变换) 一.简介 1.模型变换(Model transform ...
最新文章
- 适用于AMD ROC GPU的Numba概述
- 好用的数据增强工具Augmentor(原图和mask扩充)
- genrsa out php,PHP进行RSA加密解密
- iphone自定义铃声
- PHP替换回车换行的三种方法
- P4310-绝世好题【位运算,dp】
- java字节字符流实验报告_Java第09次实验(IO流)--实验报告
- 限制EditText只能输入小数点后两位
- lora发射和接收原理_LoRa 的扩频技术
- JVM Specification 9th Edition (4) Chapter 3. Compiling for the Java Virtual Machine
- 三年级下册我想发明的机器人_我想发明的机器人作文300字
- 『ORACLE』 Linux和oracle用户下的常用命令(11g)
- 【大学物理学】机械振动
- 如何把pdf转成jpg格式?
- dreamweaver序列号免费_dreamweaver8【dreamweaver8序列号】dreamweaver8注册码序列号简体中文版...
- 中国各省市恩格尔系数表(​1978-2019年)
- linux 强制结束任务管理器,结束拒绝访问的进程 cmd下结束进程 强行结束进程
- JavaScript弹窗事件
- 苹果未能与恢复服务器取得联系解决
- 4点策略教你如何做好社群营销