Perspective Matrix的另一种推导

OpenGL投影矩阵的常见推导在OpenGL Projection Matrix中已经详细地给出了,但是作者似乎没有给出第三行的系数的由来。这里我再给出一种使用线性代数方法的推导,从中读者可以明白为第三行系数是那样选取的。

这里的推导参考了《Computer Graphics - Principle and Practice》3rd的第13章(在扩展材料中给出了详细的推导,不过需要注意的是,扩展材料中的推导是从standard view volume到canonical view volume,与OpenGL或DX中的投影矩阵稍有不同。),以及《Multi View Geometry》中p34的一个例子。

投影矩阵是一种射影矩阵(Projective Matrix),射影矩阵根据《Multi View Geometry》[1]中的定义,是一个可逆矩阵,并且在变换过程中保留共线性质,而OpenGL的投影矩阵也是一种射影矩阵,我们可以通过线性代数的方法来求得对应的投影变换。

对于P3中的射影变换对应的矩阵,总共有16个元素,由于P3中的点是齐次坐标,所以总共有15个自由度(即15个变量),所以我们只需要15个方程就能够求得对应的矩阵。这里是15个自由度而不是16的原因是,对于点p和q,我们称它们是等价的,当q=kp(k != 0)。于是对于任意射影变换M,有

等价变换

也就是说M的任意倍数与M也是等价的。

我们只需要选取5个对应的点,就可以得到15个方程,因为每个R3中的点有3个分量。这里选取对应点时需要注意,需要使得他们在general position,也就是任意4个点不能是共面的,或者说,点P不能表示为其他3个点仿射组合,否则我们在求解矩阵M时不能得到唯一的解(这里的唯一解是关于某个倍数的,因为有16个未知数,而我们只有15个方程,显然对应的线性方程组系数矩阵不是满秩的,于是不能有一般意义上的唯一解,但是因为只有一个自由变量,其他基本变量都是这个自由变量的倍数,所以我们依然可以得到一个唯一的射影矩阵)。

在frustum中选取如下5个点以及变化后在cvv上的对应点(这里是R3中的点,对应的P3中的点可以通过添加分量w=1得到):

Corresponding points

这里n、f分别是near和far平面的距离,b为aspect ratio,a为tan(fov/2)。

假设射影矩阵为

projective matrix

对于P3中任意点p=(x,y,z,1),经过M变换后的点为q’(x1,y1,z1,w1),我们可以得到q’对应的R3中的点q = q’/w1,所以有

transformation

equation

根据前面找到的5个对应点,我们可以得到15个形似上面的方程,最终可以求得矩阵M为(这里我使用Maple进行求解,相关的计算代码,见maple):

result

这里的矩阵是 a 32 a_{32} a32的倍数,我们需要选取 a 32 = − 1 a_{32}=-1 a32=1得到与OpenGL中一致的结果。如果选取 a 32 = 1 a_{32}=1 a32=1,会造成错误的裁剪(比如一个三角面,三个顶点的 w w w都小于0,此时就不会显示),因为OpenGL裁剪时要求

− w ≤ x ≤ w − w ≤ y ≤ w − w ≤ z ≤ w -w \le x \le w \\ -w \le y \le w \\ -w \le z \le w \\ wxwwywwzw

选取 a 32 = 1 a_{32}=1 a32=1会使得 w &lt; 0 w&lt;0 w<0,导致无法满足上述不等式,虽然我们知道相差一个符号的两个齐次坐标代表的是同一个点。一个点在变换后 w w w会小于0的例子是进行平面投影(用于Projection Shadow)且投影矩阵射影矩阵的形式。

这种方法的好处在于,我们可以方便地推导出斜透视矩阵等其他非标准的透视矩阵。

[1] 本书中对于齐次坐标,射影空间等概念的描述比较简单,推荐阅读。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值