由参数l,r,b,t,n,f定义的透视投影矩阵的推导困惑了我差不多一个多礼拜,这几天几乎是天天都在思考这个问题,昨天晚上3点多钟我突然醒了,然后我又开始想这个问题,结果终于让我给想通了,于是我赶紧起床把这个思路记在了草稿纸上,还专门照了张照片作证。

为了解决这个问题,前几天我专门发了两篇帖子求答案,结果知网上的竟然沉掉了。而在csdn上也没有得到答案(质疑有关透视投影矩阵的推导)。幸亏我自己还是解决了这个问题。
下面推导的是OpenGL中的透视投影矩阵。
已经知道由参数fovy,aspect,n,f定义的透视投影矩阵为:(有关这块的推导可见《3d graphics for game programming》 2.4.3 derivation of projection matrix,讲得非常详细)
POpenGL= P_{OpenGL} = ⎛⎝⎜⎜⎜⎜⎜⎜⎜cot(fovy2)aspect0000cot(fovy2)0000−f+nf−n−100−2nff−n0⎞⎠⎟⎟⎟⎟⎟⎟⎟ \begin{pmatrix} \frac{cot(\frac{fovy}{2})}{aspect} & 0 & 0 & 0 \\ 0 & cot(\frac{fovy}{2}) & 0 & 0 \\ 0 & 0 & -\frac{f+n}{f-n} & -\frac{2nf}{f-n} \\ 0 & 0 & -1 & 0 \\ \end{pmatrix}
那么再看另一种投影参数l,r,b,t,n,f,上面矩阵中:
cot(fovy2)aspect=cot(fovx2)=2nr−l, \frac{cot(\frac{fovy}{2})}{aspect} = cot(\frac{fovx}{2}) = \frac{2n}{r-l},
cot(fovy2)=2nt−b. cot(\frac{fovy}{2}) = \frac{2n}{t-b}.
因为参数l,r是对应视见空间中x轴的坐标,b,t对应视见空间中y轴的坐标,如果l=-r并且b=-t,那么由这种参数定义的透视投影矩阵就是:
P′OpenGL= P’_{OpenGL} = ⎛⎝⎜⎜⎜⎜⎜2nr−l00002nt−b0000−f+nf−n−100−2nff−n0⎞⎠⎟⎟⎟⎟⎟ \begin{pmatrix} \frac{2n}{r-l} & 0 & 0 & 0 \\ 0 & \frac{2n}{t-b} & 0 & 0 \\ 0 & 0 & -\frac{f+n}{f-n} & -\frac{2nf}{f-n} \\ 0 & 0 & -1 & 0 \\ \end{pmatrix}
而官方的透视投影矩阵是:
POpenGL= P_{OpenGL} = ⎛⎝⎜⎜⎜⎜⎜⎜2nr−l00002nt−b00r+lr−lt+bt−b−f+nf−n−100−2nff−n0⎞⎠⎟⎟⎟⎟⎟⎟ \begin{pmatrix} \frac{2n}{r-l} & 0 & \frac{r+l}{r-l} & 0 \\ 0 & \frac{2n}{t-b} & \frac{t+b}{t-b} & 0 \\ 0 & 0 & -\frac{f+n}{f-n} & -\frac{2nf}{f-n} \\ 0 & 0 & -1 & 0 \\ \end{pmatrix}
实际上这个矩阵是由两步转换完成的,第一步是进行矩阵P′OpenGLP'_{OpenGL}变换,然后进行了平移操作,如下:

POpenGL=T×P′OpenGL=⎛⎝⎜⎜⎜⎜⎜⎜⎜100001000010−r+lr−l−t+bt−b01⎞⎠⎟⎟⎟⎟⎟⎟⎟×⎛⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜2nr−l00002nt−b0000−f+nf−n−100−2nff−n0⎞⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟=⎛⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜2nr−l00002nt−b00r+lr−lt+bt−b−f+nf−n−100−2nff−n0⎞⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟

\begin{align} P_{OpenGL} & = T×P'_{OpenGL} \\ & = \begin{pmatrix} 1 & 0 & 0 & -\frac{r+l}{r-l} \\ 0 & 1 & 0 & -\frac{t+b}{t-b} \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} × \begin{pmatrix} \frac{2n}{r-l} & 0 & 0 & 0 \\ 0 & \frac{2n}{t-b} & 0 & 0 \\ 0 & 0 & -\frac{f+n}{f-n} & -\frac{2nf}{f-n} \\ 0 & 0 & -1 & 0 \\ \end{pmatrix} \\ & = \begin{pmatrix} \frac{2n}{r-l} & 0 & \frac{r+l}{r-l} & 0 \\ 0 & \frac{2n}{t-b} & \frac{t+b}{t-b} & 0 \\ 0 & 0 & -\frac{f+n}{f-n} & -\frac{2nf}{f-n} \\ 0 & 0 & -1 & 0 \\ \end{pmatrix} \end{align}
那些说这个透视投影没有做平移这一步操作,我可以100%跟你说你是错的!
下面我来解释为什么进行了平移操作。
来张示意图:

这个是视见空间中的示意图,因为存在l≠-r或b≠-t的情况,所以这里我故意没把近裁剪平面中心画在z轴上。 示意图上由红线绘制的立方体才是由l,r,b,t,n,f参数定义的视锥体,其中远裁剪平面上的四个点分别对应原点eye经过近裁剪平面上四个点的延长线与z=-f平面的交点,注意这个视锥体是不规则的!然后图中的标注l’, r’是近裁剪平面点(l,b,-n)和点(r,b,-n)x轴上的分量在 z=−cot(fovx2)z=-cot(\frac{fovx}{2})上的投影, l′=2lr−ll'=\frac{2l}{r-l}, r′=2rr−lr'=\frac{2r}{r-l},l’和r’的中心值是 r+lr−l\frac{r+l}{r-l},同理近裁剪平面上点(r,b,-n)和点(r,t,-n)y轴上的分量在 z=−cot(fovy2)z=-cot(\frac{fovy}{2})上的投影, b′=2bt−bb'=\frac{2b}{t-b}, t′=2tt−bt'=\frac{2t}{t-b},b’和t’的中心值是 t+bt−b\frac{t+b}{t-b}。 图中的视锥体通过P′OpenGLP'_{OpenGL}透视变换之后得到的是规则的正方体(左下角顶点(2lr−l,2bt−b,1)(\frac{2l}{r-l},\frac{2b}{t-b},1),右上角顶点(2rr−l,2tt−b,−1))(\frac{2r}{r-l},\frac{2t}{t-b},-1)),最终要把它转换成cvv(canonical view volume,正规可视化空间),则需要进行T平移转换,也就是平移(−r+lr−l,−t+bt−b,0)(-\frac{r+l}{r-l}, -\frac{t+b}{t-b}, 0)。得证。

透视矩阵的推导(最直观、最深入、最还原,看完请点赞。)相关推荐

  1. 【转】投影矩阵的推导

    [转]投影矩阵的推导 原文:https://www.cnblogs.com/wonderKK/p/5695116.html 博主: 这篇文章写得非常好,对投影矩阵的推导清晰明了,但有个错误:推导的全程 ...

  2. 投影矩阵的推导(Deriving Projection Matrices)

    本文乃<投影矩阵的推导>译文,原文地址为: http://www.codeguru.com/cpp/misc/misc/math/article.php/c10123__1/Derivin ...

  3. 投影矩阵的推导(Deriving Projection Matrices)(转)

    本文乃<投影矩阵的推导>译文,原文地址为: http://www.codeguru.com/cpp/misc/misc/math/article.php/c10123__1/Derivin ...

  4. (转)投影矩阵的推导(Deriving Projection Matrices)

    转自:http://blog.csdn.net/gggg_ggg/article/details/45969499 本文乃<投影矩阵的推导>译文,原文地址为: http://www.cod ...

  5. opoengl 投影矩阵的推导

    原文:http://blog.csdn.net/wangdingqiaoit/article/details/39010077 OpenGL学习脚印: 投影矩阵的推导 写在前面 本节内容翻译和整理自h ...

  6. 3D数学-裁剪空间与透视投影矩阵的推导

    3D数学-裁剪空间与透视投影矩阵的推导 透视投影矩阵的变换本质,是将视锥体变换到裁剪空间中 视锥体的具有六个面,近裁剪面,远裁剪面,左裁剪面,右裁剪面,上裁剪面,下裁剪面 所有超出视锥体的都会被舍弃, ...

  7. 一分钟详解「本质矩阵」推导过程

    文章目录 前言 一 本质矩阵如何推导 二 本质矩阵的意义 三 本质矩阵的求解 四 扩展--基本矩阵 前言 两幅视图存在两个关系:第一种,通过对极几何,一幅图像上的点可以确定另外一幅图像上的一条直线:另 ...

  8. 图像拼接之转透视矩阵

    前言 在图像拼接领域中,透视矩阵起着至关重要的作用,网络上关于这一知识的介绍已经很多,本人在此稍加总结和归纳一下,也方便自己今后查找一些结论性的要点(别人的再怎么好,还是自己的看起来舒服:)),接下来 ...

  9. 向任意平面的投影矩阵的推导

    概述 方法来自于<3D数学基础,图形与游戏开发>这本书. 基本原理 这个方法其实有点思维跳跃,原理是首先推导出一个任意方向n缩放比例为k的缩放矩阵,然后将k变成0,这就变成了向垂直于n的投 ...

最新文章

  1. umi3 如何管理model_django admin 管理工具
  2. 纵深防御仍对付得了当今的网络威胁吗?
  3. Spring Boot 2.0选择HikariCP作为默认数据库连接池的五大理由
  4. 计算机相关专业学习经验总结
  5. jquery --- pip方法
  6. Java常用命令及参数
  7. Java Iterable类
  8. Magrittr包:简化你的R代码
  9. lfw人脸识别数据集
  10. 有限差分法MATLAB程序
  11. 524MB的微信输入法:没广告 你会用吗
  12. VMare虚拟机无法识别USBkey问题
  13. 第十一届蓝桥杯省赛第一场原题
  14. 电脑键盘功能基础知识,快速入门,抓住这份详细教程
  15. node.js使用手册_权威的Node.js手册
  16. 方便好用的软件这里就有四款
  17. Python调用xbox手柄马达震动
  18. c刊计算机领域见刊快的期刊,见刊快的核心期刊_见刊快的核心期刊_好投的医学核心期刊...
  19. TDA4VH j784s4 使用
  20. python爬取百度贴吧的实例

热门文章

  1. chrome/edge解决不能打开问题
  2. matlab机械臂运动仿真
  3. 【mysql】图文展示Mysql锁
  4. 使用adb命令操作多台设备
  5. CDS TABLE FUNCTOIN传参,指定客户端
  6. H5页面播放M4a音频文件
  7. LSTM中对time step的理解
  8. 亿图图示----MindMaster思维导图示例
  9. 重新认识差评与客户满意度
  10. php系统5000块钱的短信,两天被刷完了,短信接口被恶意盗刷怎么办?(短信接口被盗刷系列4)