45fan.com - 路饭网

搜索: 您的位置主页 > 网络频道 > 阅读资讯:提取视截面的方法

提取视截面的方法

2016-09-02 09:16:52 来源:www.45fan.com 【

提取视截面的方法

在Frustum Culling的计算中,我们需要提取出视截面。那如果计算视截面呢?
首先,我们需要了解平面的表示方法:
平面的数学表达式是:Ax+By+Cz+D=0;
若A,B,C组成的向量(A,B,C)等于平面的单位法向量,则|D|表示原点到此平面的距离。若D>0,则原点位于平面的正面(法向量所指的一面);若D<0,则原点位于平面的背面;若D=0,则平面经过原点。
这样,用一个四维向量可以很方便的表示一个平面:缩写记号<N,D>来表示满足方程NQ+D=0中点Q组成的平面。
接着,下面就是如何计算视截面,分以下两种情况:
1. 在已知视截体的焦距e,屏幕高宽比a,近视截面的距离n,远视截面的距离f的情况下,可以通过以下公式计算在摄象机空间所看到的平面向量:
平面 <N,D>
近 <0,0,-1,-n>
远 <0,0,1,f>
左 <e/sqrt(e*e+1),0, -1/sqrt(e*e+1), 0>
右 <-e/sqrt(e*e+1),0, -1/sqrt(e*e+1),0>
上 <0,-e/sqrt(e*e+a*a), -a/sqrt(e*e+a*a), 0>
下<0,e/sqrt(e*e+a*a), -a/sqrt(e*e+a*a),0>
这种情况适合于用glFrustum()来指定投影矩阵的情况。
2. 在其他的情况下,需要首先获得PROJECTION_MATRIX和MODELVIEW_MATRIX:
float proj[16],modv[16];
glGetfloatv( GL_PROJECTION_MATRIX, proj );
glGetfloatv( GL_MODELVIEW_MATRIX, modv );
在这种情况下又可以分为两种情况,第一种情况,MODELVIEW_MATRIX为单位矩阵:
设透视投影矩阵为M,则摄象机空间内的视截面为:
平面<N,D>
近M4+M3
远 M4-M3
左 M4+M1
右 M4-M1
上 M4+M2
下M4-M2
其中的Mi(1<=i<=4)表示矩阵M的第i行。
第二种情况,MODELVIEW_MATRIX不是单位矩阵:
若透视投影矩阵为P,MODELVIEW为M,组合矩阵MP代替上面六式中的M,得到的结果是在模型空间内的视截面。

参考文件:
1.《3D数学与计算机图形学中的数学方法》,Eric Lengyel著,清华大学出版社出版。

-----------------------------致力于多媒体技术,成为有思想的软件工程师------------------------

此文章为我原创作品,若要转载,请和本人联系,或注明出处。
欢迎大家对文章内容提出宝贵意见,同时希望大家及时指出文中的错误之处,这样我可以及时更正。
我的联系方式:
QQ: 7578420
Email: jerrydong@tom.com

----------------------------------------------------------------------------------------

 

本文地址:http://www.45fan.com/a/question/71128.html
Tags: 提取 截面 Frustum
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部