游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1516|回复: 1

谁能给个四叉树视锥裁剪的算法例子?

[复制链接]

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2007-5-30 10:14:00 | 显示全部楼层 |阅读模式
我已经算出视锥的六个面的World坐标。

也建立了一个场景静态四叉树

怎么进行裁剪计算

65

主题

225

帖子

232

积分

中级会员

Rank: 3Rank: 3

积分
232
发表于 2007-6-1 09:43:00 | 显示全部楼层

Re:谁能给个四叉树视锥裁剪的算法例子?

D3DXVECTOR4 frustumPlane[6];
void ComputeFustumPlane( D3DXMATRIX &matCameraViewProj )
{
        enum
        {
                RIGHT,
                LEFT,
                BOTTOM,
                TOP,
                PFAR,
                PNEAR
        };
        D3DXMATRIX m = matCameraViewProj;
       
        D3DXVECTOR4 *p;
       
        p=&frustumPlane[RIGHT];
    p->x=m[3]-m[0];
    p->y=m[7]-m[4];
    p->z=m[11]-m[8];
    p->w=m[15]-m[12];

    p=&frustumPlane[LEFT];
    p->x=m[3]+m[0];
    p->y=m[7]+m[4];
    p->z=m[11]+m[8];
    p->w=m[15]+m[12];

    p=&frustumPlane[BOTTOM];
    p->x=m[3]+m[1];
    p->y=m[7]+m[5];
    p->z=m[11]+m[9];
    p->w=m[15]+m[13];

    p=&frustumPlane[TOP];
    p->x=m[3]-m[1];
    p->y=m[7]-m[5];
    p->z=m[11]-m[9];
    p->w=m[15]-m[13];

    p=&frustumPlane[PFAR];
    p->x=m[3]-m[2];
    p->y=m[7]-m[6];
    p->z=m[11]-m[10];
    p->w=m[15]-m[14];

    p=&frustumPlane[PNEAR];
    p->x=m[3]+m[2];
    p->y=m[7]+m[6];
    p->z=m[11]+m[10];
    p->w=m[15]+m[14];

        for(int i=0;i<6;i++)
        {
                float mag = sqrtf(frustumPlane.x*frustumPlane.x + frustumPlane.y*frustumPlane.y + frustumPlane.z*frustumPlane.z );
                frustumPlane.x = frustumPlane.x/mag;
                frustumPlane.y = frustumPlane.y/mag;
                frustumPlane.z = frustumPlane.z/mag;
                frustumPlane.w = frustumPlane.w/mag;
        }
}
BOOL CDymQuadTreeObj::isCollectCamera( D3DXMATRIX &matCameraViewProj , D3DXVECTOR3 *pMin , D3DXVECTOR3 *pMax )
{
        //if( m_listRenderObj.size () == 0 )return FALSE;
       
        //ComputeFustumPlane( matCameraViewProj );
        D3DXVECTOR3 vMin ;
        D3DXVECTOR3 vMax ;
        if( pMin && pMax )
        {
                vMin = *pMin;
                vMax = *pMax;
        }
        else
        {
                D3DXVECTOR3 vMid = D3DXVECTOR3( (m_vMin.x + m_vMax.x) / 2.0f , (m_vMin.y + m_vMax.y) / 2.0f , (m_vMin.z + m_vMax.z) / 2.0f );
                D3DXVECTOR3 vSize = D3DXVECTOR3( fabsf( m_vMax.x - m_vMin.x ) , fabsf( m_vMax.y - m_vMin.y ) , fabsf( m_vMax.z - m_vMin.z ) );
                vMin = vMid - vSize;
                vMax = vMid + vSize;
        }

        D3DXVECTOR3 v[8];
        v[0] = D3DXVECTOR3( vMin.x , vMax.y , vMax.z );
        v[1] = D3DXVECTOR3( vMax.x , vMax.y , vMax.z );
        v[2] = D3DXVECTOR3( vMax.x , vMax.y , vMin.z );
        v[3] = D3DXVECTOR3( vMin.x , vMax.y , vMin.z );
        v[4] = D3DXVECTOR3( vMin.x , vMin.y , vMax.z );
        v[5] = D3DXVECTOR3( vMax.x , vMin.y , vMax.z );
        v[6] = D3DXVECTOR3( vMax.x , vMin.y , vMin.z );
        v[7] = D3DXVECTOR3( vMin.x , vMin.y , vMin.z );
        int iTotalIn = 0;
        for(int i=0;i<6;i++)
    {
                int iInCount = 8;
//                int iPtIn = 1;
                D3DXVECTOR4 *p=&frustumPlane;
                for(int j = 0; j < 8; j++)
                {
                        //if(Vector3.Dot(new Vector3(p.A,p.B,p.C), bb.corners) + p.D < 0)
                        if( D3DXVec3Dot( &D3DXVECTOR3( p->x , p->y , p->z ) , &v[j] ) + p->w < 0)
                        {
                                // 点在面外
//                                iPtIn = 0;
                                --iInCount;
                        }
                }

                // 如果八个点都在同一个面外
                if(iInCount == 0)
                        return FALSE;

//                iTotalIn += iPtIn;
    }
        //if(iTotalIn == 6)
                return TRUE;
        //return FALSE;
}

视锥与四叉树的BOX碰撞检测,isCollectCamera传入视投影矩阵,和四叉树的BOX
反回TRUE就渲染这个叉,反回FALSE就不渲染

-------------------------------------------------------
欢迎加入游戏开发技术交流QQ群:40280598
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-26 06:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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