真正讲清楚了透视矩阵

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

透视投影矩阵推导

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

1. 基本原理

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

clip_image002clip_image004

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

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

clip_image006

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

clip_image008

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

clip_image010

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

clip_image036

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

clip_image038

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

clip_image044

然后使clip_image042[1]化为clip_image046即可,这一过程称为齐次化。

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

2. 完整的投影矩阵推导

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

clip_image050

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

clip_image052

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

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

clip_image062

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

clip_image064

故只需要令

clip_image066

即可得

clip_image068

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

clip_image070

 

 

 

 

 

 

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

clip_image072

验证一下:

clip_image074

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

3. 其他

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

clip_image078

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

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值