游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2661|回复: 2

求助!!OpenGL透视投影六面系数如何取得

[复制链接]

3

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2006-3-17 17:10:00 | 显示全部楼层 |阅读模式
    在OpenGl中设置好透视矩阵后(全屏显示),如何根据给出在屏幕上的一个矩形框范围计算这个矩形框的透视投影的六个面的方程系数?(是不更改透视矩阵的情况下,通过算术如何计算?希望高手指点)
    另:跪求GameResources上的bsp算法的源代码,邮箱boy_jia@126.com
[em7] [em7] [em7] [em7] [em7] [em7] [em7] [em7]

0

主题

65

帖子

65

积分

注册会员

Rank: 2

积分
65
发表于 2006-3-17 18:55:00 | 显示全部楼层

Re:求助!!OpenGL透视投影六面系数如何取得



www.azure.com.cn



首先计算6个裁减面的方程系数

//-----------------------------------------------------------------------------
// Name: calculateFrustumPlanes()
// Desc:
//-----------------------------------------------------------------------------
void calculateFrustumPlanes( void )
{
float p[16]; // projection matrix
float mv[16]; // model-view matrix
float mvp[16]; // model-view-projection matrix
float t;

glGetFloatv( GL_PROJECTION_MATRIX, p );
glGetFloatv( GL_MODELVIEW_MATRIX, mv );

//
// Concatenate the projection matrix and the model-view matrix to produce
// a combined model-view-projection matrix.
//

mvp[ 0] = mv[ 0] * p[ 0] + mv[ 1] * p[ 4] + mv[ 2] * p[ 8] + mv[ 3] * p[12];
mvp[ 1] = mv[ 0] * p[ 1] + mv[ 1] * p[ 5] + mv[ 2] * p[ 9] + mv[ 3] * p[13];
mvp[ 2] = mv[ 0] * p[ 2] + mv[ 1] * p[ 6] + mv[ 2] * p[10] + mv[ 3] * p[14];
mvp[ 3] = mv[ 0] * p[ 3] + mv[ 1] * p[ 7] + mv[ 2] * p[11] + mv[ 3] * p[15];

mvp[ 4] = mv[ 4] * p[ 0] + mv[ 5] * p[ 4] + mv[ 6] * p[ 8] + mv[ 7] * p[12];
mvp[ 5] = mv[ 4] * p[ 1] + mv[ 5] * p[ 5] + mv[ 6] * p[ 9] + mv[ 7] * p[13];
mvp[ 6] = mv[ 4] * p[ 2] + mv[ 5] * p[ 6] + mv[ 6] * p[10] + mv[ 7] * p[14];
mvp[ 7] = mv[ 4] * p[ 3] + mv[ 5] * p[ 7] + mv[ 6] * p[11] + mv[ 7] * p[15];

mvp[ 8] = mv[ 8] * p[ 0] + mv[ 9] * p[ 4] + mv[10] * p[ 8] + mv[11] * p[12];
mvp[ 9] = mv[ 8] * p[ 1] + mv[ 9] * p[ 5] + mv[10] * p[ 9] + mv[11] * p[13];
mvp[10] = mv[ 8] * p[ 2] + mv[ 9] * p[ 6] + mv[10] * p[10] + mv[11] * p[14];
mvp[11] = mv[ 8] * p[ 3] + mv[ 9] * p[ 7] + mv[10] * p[11] + mv[11] * p[15];

mvp[12] = mv[12] * p[ 0] + mv[13] * p[ 4] + mv[14] * p[ 8] + mv[15] * p[12];
mvp[13] = mv[12] * p[ 1] + mv[13] * p[ 5] + mv[14] * p[ 9] + mv[15] * p[13];
mvp[14] = mv[12] * p[ 2] + mv[13] * p[ 6] + mv[14] * p[10] + mv[15] * p[14];
mvp[15] = mv[12] * p[ 3] + mv[13] * p[ 7] + mv[14] * p[11] + mv[15] * p[15];

//
// Extract the frustum's right clipping plane and normalize it.
//

g_frustumPlanes[0][0] = mvp[ 3] - mvp[ 0];
g_frustumPlanes[0][1] = mvp[ 7] - mvp[ 4];
g_frustumPlanes[0][2] = mvp[11] - mvp[ 8];
g_frustumPlanes[0][3] = mvp[15] - mvp[12];

t = (float) sqrt( g_frustumPlanes[0][0] * g_frustumPlanes[0][0] +
g_frustumPlanes[0][1] * g_frustumPlanes[0][1] +
g_frustumPlanes[0][2] * g_frustumPlanes[0][2] );

g_frustumPlanes[0][0] /= t;
g_frustumPlanes[0][1] /= t;
g_frustumPlanes[0][2] /= t;
g_frustumPlanes[0][3] /= t;

//
// Extract the frustum's left clipping plane and normalize it.
//

g_frustumPlanes[1][0] = mvp[ 3] + mvp[ 0];
g_frustumPlanes[1][1] = mvp[ 7] + mvp[ 4];
g_frustumPlanes[1][2] = mvp[11] + mvp[ 8];
g_frustumPlanes[1][3] = mvp[15] + mvp[12];

t = (float) sqrt( g_frustumPlanes[1][0] * g_frustumPlanes[1][0] +
g_frustumPlanes[1][1] * g_frustumPlanes[1][1] +
g_frustumPlanes[1][2] * g_frustumPlanes[1][2] );

g_frustumPlanes[1][0] /= t;
g_frustumPlanes[1][1] /= t;
g_frustumPlanes[1][2] /= t;
g_frustumPlanes[1][3] /= t;

//
// Extract the frustum's bottom clipping plane and normalize it.
//

g_frustumPlanes[2][0] = mvp[ 3] + mvp[ 1];
g_frustumPlanes[2][1] = mvp[ 7] + mvp[ 5];
g_frustumPlanes[2][2] = mvp[11] + mvp[ 9];
g_frustumPlanes[2][3] = mvp[15] + mvp[13];

t = (float) sqrt( g_frustumPlanes[2][0] * g_frustumPlanes[2][0] +
g_frustumPlanes[2][1] * g_frustumPlanes[2][1] +
g_frustumPlanes[2][2] * g_frustumPlanes[2][2] );

g_frustumPlanes[2][0] /= t;
g_frustumPlanes[2][1] /= t;
g_frustumPlanes[2][2] /= t;
g_frustumPlanes[2][3] /= t;

//
// Extract the frustum's top clipping plane and normalize it.
//

g_frustumPlanes[3][0] = mvp[ 3] - mvp[ 1];
g_frustumPlanes[3][1] = mvp[ 7] - mvp[ 5];
g_frustumPlanes[3][2] = mvp[11] - mvp[ 9];
g_frustumPlanes[3][3] = mvp[15] - mvp[13];

t = (float) sqrt( g_frustumPlanes[3][0] * g_frustumPlanes[3][0] +
g_frustumPlanes[3][1] * g_frustumPlanes[3][1] +
g_frustumPlanes[3][2] * g_frustumPlanes[3][2] );

g_frustumPlanes[3][0] /= t;
g_frustumPlanes[3][1] /= t;
g_frustumPlanes[3][2] /= t;
g_frustumPlanes[3][3] /= t;

//
// Extract the frustum's far clipping plane and normalize it.
//

g_frustumPlanes[4][0] = mvp[ 3] - mvp[ 2];
g_frustumPlanes[4][1] = mvp[ 7] - mvp[ 6];
g_frustumPlanes[4][2] = mvp[11] - mvp[10];
g_frustumPlanes[4][3] = mvp[15] - mvp[14];

t = (float) sqrt( g_frustumPlanes[4][0] * g_frustumPlanes[4][0] +
g_frustumPlanes[4][1] * g_frustumPlanes[4][1] +
g_frustumPlanes[4][2] * g_frustumPlanes[4][2] );

g_frustumPlanes[4][0] /= t;
g_frustumPlanes[4][1] /= t;
g_frustumPlanes[4][2] /= t;
g_frustumPlanes[4][3] /= t;

//
// Extract the frustum's near clipping plane and normalize it.
//

g_frustumPlanes[5][0] = mvp[ 3] + mvp[ 2];
g_frustumPlanes[5][1] = mvp[ 7] + mvp[ 6];
g_frustumPlanes[5][2] = mvp[11] + mvp[10];
g_frustumPlanes[5][3] = mvp[15] + mvp[14];

t = (float) sqrt( g_frustumPlanes[5][0] * g_frustumPlanes[5][0] +
g_frustumPlanes[5][1] * g_frustumPlanes[5][1] +
g_frustumPlanes[5][2] * g_frustumPlanes[5][2] );

g_frustumPlanes[5][0] /= t;
g_frustumPlanes[5][1] /= t;
g_frustumPlanes[5][2] /= t;
g_frustumPlanes[5][3] /= t;
}

球形包围盒判断

bool isBoundingSphereInFrustum( float x, float y, float z, float fRadius )
{
for( int i = 0; i < 6; ++i )
{
if( g_frustumPlanes[0] * x +
g_frustumPlanes[1] * y +
g_frustumPlanes[2] * z +
g_frustumPlanes[3] <= -fRadius )
return false;
}

return true;
}

3

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
 楼主| 发表于 2006-3-20 09:09:00 | 显示全部楼层

Re: 求助!!OpenGL透视投影六面系数如何取得

楼上的算法是求在设置了透视矩阵的时候得出得整个屏幕为投影面的立方体六面方程系数,我需要的是在设置了透视矩阵的情况下求出任意矩形为投影面的立方体六面矩阵。
举个例子:
      我先设置透视矩阵为全屏1024×768,角度为60度,远平面距离3000。设置好了以后,我如何求出依据屏幕上的某一块矩形(如:屏幕右下角的一块矩形)为投影面的立方体的六面方程(矩形小于全屏范围)。
      据说HL2中就是通过计算Protal在屏幕上的投影包围框计算来得到一个frustum,都可以对其相连的区域所包含叶节点的AABB进行frustum culling运算。我就是想知道如何求得这个frustum。
      现在继续求助!!同时谢谢楼上!!
[em10]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-23 23:53

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表