OpenGL ES —— Perspective Projection的推导

引言

透视投影(Perspective Projection)是3D固定流水线的重要组成部分,是将相机空间中的点从视锥体(frustum)变换到规则观察体(Canonical View Volume)中,待裁剪完毕后进行透视除法的行为。

这里写图片描述
简单的来讲就是把图中的cube投影到屏幕上(二维图形)的过程,我们丢弃了Z坐标,然后将它投影到屏幕上。(显然这种简单的投影会是的画面不是很真实,因为在现实世界里,越远的物体会变得越小,想象你站在铁路上,如果视线足够远的话,你脚底下的铁轨是会在远处相交的)

理解Perspective Projection还是很困难的,还好OpenGL为我们做好了这些底层工作,我们可以在不理解Perspective Projection的情况下也能够控制程序按照我们的意愿运行。不过我觉得程序员不应该只满足于调用API,而应该去尝试了解How does it work。

本文就是从数学角度一步步推导OpenGL里Perspective Projection的原理。不过我们首先要学习齐次坐标的相关知识,因为2D世界中通过它才能表示3D世界中的点。

let’s examine things at a visual level

在欧几里得空间(Euclidean space)里,两个平行的直线是永远不会相交的,但这在projective space里并不总是对的,考虑一下的例子:
这里写图片描述
这是一条铁轨,其中他的两条轨道是平行的,然而随着距离的拉长,我们可以看到最极远处,他们已经相交于一个点。显然在Euclidean Space里,2d/3d的几何图形被很好的描述,但是却不能够准确描述射影空间(projective space)里的图形:比如极远的点。两条平行线相交于无穷远处的一点,我们不妨设它为(∞,∞),然而这个点却在Euclidean Space无意义。

解决方案:齐次坐标(Homogeneous Coordinates)

Homogeneous Coordinates是使用N+1个坐标来表示N维坐标的一种表示方式,考虑2D点的例子,我们会使用一个额外的变量来表示一个点,比如(x, y)在Homogeneous Coordinates中就是(x, y, w),其中w就是那个额外的变量,之后这三个变量可以表示一个笛卡尔坐标(Cartesian coordinates)中新的点(X, Y):
X = x / w;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值