CSDN博客

img houdy

提取视截面

发表于2004/10/31 19:50:00  1609人阅读

分类: 计算机图形学

在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

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

阅读全文
0 0

相关文章推荐

img
取 消
img