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 | 返回顶部