大家好,又见面了,我是你们的朋友全栈君。
参考网址: 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的长度为4tan(22.5) 而屏幕的宽高比为4:3
所以EA/AC=4/3 所以EA=4tan(22.5)4/3=16tan(22.5)/3 所以E点的坐标为(-16tan(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’
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/188367.html原文链接:https://javaforall.cn