斜视锥体投影矩阵推导

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wodownload2/article/details/88977178

参考网址:
https://gameinstitute.qq.com/community/detail/106203 翻译
http://www.terathon.com/lengyel/Lengyel-Oblique.pdf 原文
http://www.lsngo.net/2018/01/07/graphics_mirrorcamera_2/
参考书籍:
Mathematics.for.3D.Game.Programming.and.Computer.Graphics,.Lengyel,.3ed,.Course,.2012

在这里插入图片描述
上图在:Mathematics.for.3D.Game.Programming.and.Computer.Graphics
P119中。
在这里插入图片描述
上图是裁剪空间中左右、远近裁剪平面的法线,上下的屏幕在表格中。

讨论下平面变换方程:
我们知道法线变换矩阵是不能用M矩阵直接变化的,而是通过M的逆矩阵的转置矩阵进行变换。
证明如下:
https://blog.csdn.net/wodownload2/article/details/88823649

也就是说,如果使用M矩阵代表的时候透视矩阵。
而同样我们知道了,NDC的空间中的六个面的方程了,那么则存在如下的关系:
M矩阵的逆矩阵的转置矩阵,变换透视空间的平面,就等于了NDC空间的平面方程了。
等式如下:
M逆再转置*透视空间平面=NDC空间的平面
所以透视空间的平面等于如下:
透视空间平面=(M逆再转置再逆)NDC空间的平面
也就是:
透视空间平面=M转置
NDC空间的平面

所以:
透视空间的近平面=M转置*(0,0,1,1)=M4+M3
透视空间的远平面=M转置*(0,0,-1,1)=M4-M3
其他类似推导。

其他参考网址:
https://blog.csdn.net/yinhun2012/article/details/84236202 //矩阵逆与矩阵转置的证明
https://blog.csdn.net/softwarekid/article/details/45055253 //为什么不是在透视除法后做裁剪
https://gameinstitute.qq.com/community/detail/113246 //冯乐乐裁剪矩阵
http://www.devacg.com/?post=522 //关于裁剪空间写的比较好的文章

unity里面的摄像机透视投影矩阵输出:
在这里插入图片描述

由之前的博客可以知道unity使用的是opengl的投射投影矩阵,将其z映射到-1到1,所以投影矩阵为:
在这里插入图片描述

下面,介绍如何求的l,r,t,b。因为n和f已经知道了,n=1,f=4.
在这里插入图片描述

在这里插入图片描述
我现在想求左边的视锥体的平面方程,为了简单起见,我们把摄像机移动到原点位置。
求平面的时候,至少需要三个点的位置信息。不妨求ABC三个点的坐标。

在这里插入图片描述

添加几条辅助线如下所示:
在这里插入图片描述
可以知道C点坐标为(0,4tan(22.5),4)
AC的长度为4
tan(22.5)
而屏幕的宽高比为4:3
在这里插入图片描述
所以EA/AC=4/3
所以EA=4tan(22.5)4/3=16tan(22.5)/3
所以E点的坐标为(-16
tan(22.5)/3,0,4)
所以D点的坐标为(-16tan(22.5)/3,4tan(22.5),4)
所以现在可以求出平面的方程了:
向量BD=(-16tan(22.5)/3,4tan(22.5),4)
向量BE=(-16*tan(22.5)/3,0,4)

在这里插入图片描述

而我们知道裁剪空间的左平面为(1,0,0,1)
投影矩阵P为:
在这里插入图片描述
对于摄像机空间的点Q通过乘以投影矩阵P,就得到了裁剪空间的点Q’。
而摄像机空间的平面C,需要通过乘以P的逆转矩阵才能得到裁剪空间的平面。
所以我们有如下的公式:
P逆转*C=C’

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wodownload2/article/details/88977178