opengl的GL_PROJECTION变换矩阵

opengl将一个点从摄像头坐标系(投影坐标系)转换到NDC(标准坐标系)的转换矩阵如下:

OpenGL Perspective Projection Matrix

摄像头坐标系的形状如下图第一个, 是一个平截头体

x轴方向上定义  r: right  , l: left,  y轴方向上定义 t: top,    b: bottom,  z轴方向上定义  n: near,    f: far。
每个摄像头根据焦距的不同,对应的上面的值也会有差别。根据实际情况调整数值。


下图的第二个坐标系就是标准坐标系:NDC(normalized device coordinates),是opengl初始的坐标系。

OpenGL Perspective Frustum and NDC


计算该变换矩阵的原理如下:

Top View of FrustumSide View of Frustum

假设摄像头坐标系内有一个点(e),则该点在  -n 这个平面上的 X,Y 坐标投影可以通过比例计算出来。

(摄像头坐标系,摄像头所在坐标为原点。这是opengl强制要求)

           

然后将 -n平面中X,Y 投影点  映射到 NDC 中,比如X 坐标为: [l, r] ⇒ [-1, 1] ,通过线性关系,计算出在NDC的位置


Y轴坐标变换为:[b, t] ⇒ [-1, 1], 其 计算方式与X轴一样,不再重复说明。



最终合并后,将   e 从 摄像头坐标系转到 NDC的 表达式为:

         


根据上面的公式,我们看到都需要 除以  -ze

我们可以将Wc 的值设为-ze。  (W 数值的作用: 如果W不为0, 那么使用四维向量表示的3维坐标是:Normalized Device Coordinates

因此,我们就可以得到变换矩阵的部分数值。


剩余 Z 轴坐标的变换,Z轴坐标用于 裁剪 和 深度测试。 Z轴坐标不依赖于 X,Y轴。因此假设Zn 与Ze 和 We相关,参数设为A,B




在 摄像头坐标系中 ,We 数值为1(X,Y, Z就是真正的坐标位置)。

为了计算A和B 的值, 使用(ze, zn) 映射关系 (-n, -1) and (-f, 1)。


通过计算方程式,最终得到上面的变换矩阵。



(注: 此篇内容参考网页: http://www.songho.ca/opengl/gl_projectionmatrix.html)


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值