from:https://www.cnblogs.com/AirGuanZ/p/6365702.html

透视投影矩阵推导

  计算机图形学中,建模自小孔成像原理的透视摄像机是常用的摄像机模型。然而,由于光栅化渲染中的几何变换多基于四阶方阵与齐次坐标表示的向量的乘法,而四阶方阵只能表示仿射变换,无法实现透视摄像机“近大远小”的特性(仿射变换维持平行线相互平行,而“近大远小”不具有该性质),因此透视摄像机模型的实现要多费一番功夫。

1. 基本原理

  小孔成像是大多数人所熟知的最简单的成像原理之一,而常用的透视摄像机就是把小孔和屏幕(成像平面)的顺序交换,维持相似关系不变,因而这一模型达到了拟真的效果而被广泛应用。

小孔成像与简单的透视摄像机模型

  透视摄像机模型用在光栅化渲染管线的结果,就是透视投影过程。考虑简图——

  图中从e点(原点)发出的一条射线上所有在view plane之后的点都被投影到view plane与该射线的交点。由相似关系显然有

这就得到了所需的映射关系:

  显然并非仿射变换,也就不能直接借助四阶方阵乘法来实现。这时齐次坐标表示的另一个作用就表现出来了,设齐次坐标表示点,定义全体的齐次坐标上的等价关系:当且仅当,则有,该式的右边正是常用的齐次坐标中点的表示方法()。这样一来,这一等价关系为我们提供了“除法”的能力,也扩充了仿射变换的能力。注意到,仿射变换可以将中的任意一个分量设置为,而该方法允许这样的变换形式——

注意到透视投影需要的变换是(假设viewing transform后摄像机面向+z方向)

而要将映射为是很容易的,只需要矩阵乘法——

然后使化为即可,这一过程称为齐次化。

  这就是齐次坐标投影的基本原理。

2. 完整的投影矩阵推导

  现实中使用的投影矩阵因为考虑了摄像机视截体,形式更加复杂。考虑下图中的透视投影变换——

  显然该变换把近平面(near plane)区域投影到xOy平面上的单位正方形。在这里可以把该变换过程拆分成三个子过程:完成“透视”投影、把near plane上的视窗变换为单位正方形、把near plane的z坐标变换为0。第一个过程可以利用矩阵乘法:

其中n与f分别是视截体近平面与远平面与原点的距离。的第三行有些特殊。它的作用是保持被投影到near plane上同一点的各点间的深度关系不变(这样才能在稍后做depth test)。此外,由于(齐次化过程),位于near plane上的点的坐标都不会变化。

   然后把near plane上的有效区域变换为单位正方形。假设near plane上有效区域的宽度为,高度为,则一个简单的scaling即可解决问题——

  再把near plane挪到xOy平面上,一个平移就能解决问题;另外深度的变化范围应该被固定在0~1之间。注意到

故只需要令

即可得

  最后是一直没有进行的齐次化过程,即

这就求得了所需的透视投影变换矩阵——

验证一下:

满足透视投影的要求。使用时,只需要将乘上待投影的坐标,再齐次化即可。

3. 其他

  在一些别的条件/要求下,透视投影矩阵可能具有与此稍微不同的形式。譬如,OpenGL采用右手系,通常其viewing transform把坐标变换到camera space,其中camera是指向-z的(本例使用的是+z);此外,OpenGL中的z值被映射到-1~+1(本例使用的是0~1),但是,总体的推导思路是相同的。可以证明

是一个满足这些要求的投影矩阵(这里,l、r、t、b是视截体近平面的左、右、上、下坐标,本例中没有考虑这种不对称的情况)。

真正讲清楚了透视矩阵相关推荐

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

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

  2. OpenGL3.3透视矩阵原理计算

    正射投影 (创建一个正交矩阵)ortho(vec3 eye,vec3 center,vec3 up) 从eye观察点出发朝向center点 up使头顶的方向 我们只需要把物体移到坐标系中心 然后再将整 ...

  3. 逆透视矩阵原理以及应用(平视图转鸟瞰图、俯视图)

    参考博客:逆透视变化详解 参考论文:Lane Detector 真实世界的景象转换为数字图片的步骤流程如下图: 1.刚体变换 从下图中可以看到,世界坐标为(X,Y,Z)相机坐标为(Xc,Yc,Zc), ...

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

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

  5. c语言游戏call调用,C语言-植物大战僵尸-刷僵尸call;fps游戏CS-方框透视(矩阵+传统)...

    C语言-植物大战僵尸-刷僵尸call:fps游戏CS-方框透视(矩阵+传统)前言:大家好,我是向上先生,嘿嘿~最近在学习逆向.反汇编等等,首先我在非常感谢52pojie这个平台,差不多很多学习资源都是 ...

  6. Silverlight 参考:三维效果(透视转换) -- MSN

    您可以使用"透视转换"来将三维效果应用于任何 Silverlight UIElement.例如,您可以制造这样一个假象,即对象朝向您或远离您进行旋转,如下图中所示. 使用透视转换的 ...

  7. 自动透视校正为四边形对象

    参考opencv开源上的,跑通了  注释了一下,以便后续学习 #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/hig ...

  8. 投影矩阵(投影变换)解惑

    背景 投影矩阵的推导曾经让我困惑了很久,反思可能是自己数学知识的浅薄,所以很多大神写的关于投影矩阵的推导很明晰还是看不懂,好在经过两周的努力学习和思考,终于弄明白了这个问题,特此做一个总结和大家分享一 ...

  9. OpenCV的各种矩阵基本运算、基本操作及示例代码(加、减、乘、点乘、点除、乘方、开方、累加、转置、比较等)

    OpenCV的各种矩阵基本运算.基本操作及示例代码(加.减.乘.点乘.点除.乘方.开方.累加.转置.比较等) OpenCV的各种矩阵基本运算.基本操作及示例代码 目录 01-两个矩阵相加.矩阵和标量相 ...

最新文章

  1. Java学习笔记——反射
  2. .net的label的背景如何设置成为透明_css如何设置背景图片?background属性添加背景图片...
  3. 提高篇 第二部分 字符串算法 第4章 AC自动机
  4. Docker容器学习
  5. VC++进行ActiveX控件的开发
  6. Linux rm -rf 之rm: cannot remove `linux': Device or resource busy
  7. 监控系统选型,一文轻松解决
  8. Android 线程4件套 MessageQueue Message Looper Handler之Looper
  9. 嵌入式开发笔记-STM32CudeIDE平台入门
  10. 第一章:costmap_2d代价地图生成原理
  11. Hi3516CV500/Hi3516AV300/Hi3516DV300 SDK编译
  12. 【深度学习】NLP自然语言处理
  13. 无法启动Outlook,无法打开Outlook窗口的解决方法
  14. 微信公众号-上传永久素材-中文文件名乱码 问题记录
  15. TP5 短信宝 发送短信验证码
  16. 教程篇(7.0) 04. FortiClient 部署 ❀ FortiClient EMS ❀ Fortinet 网络安全专家 NSE 5
  17. euraka 分区概念
  18. ModHeader 谷歌浏览器安装插件设置jwt
  19. 基于JAVA社区团购系统计算机毕业设计源码+系统+lw文档+部署
  20. 自己动手轻松制作一台linux瘦客户机(云终端)

热门文章

  1. 关于下一代防火墙的几个思考
  2. 平面的截距式方程推导
  3. IIS如何设置默认访问https
  4. 服务器性能计数器驱动没装上,安装和删除 AD DS 的已知问题
  5. 升级php7+安装laravel过程中遇到的问题汇总
  6. 关于企业微信服务商入门考试v2.0题库
  7. Gentoo 教程:目录
  8. 深入理解JVM——分区是如何溢出的?
  9. 如何把阿里云盘变成本地硬盘
  10. Web技术老矣,尚能Run否?| U4内核在Web开发平台的探索之路