游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1749|回复: 3

做视锥裁减的时候有点问题请教一下~

[复制链接]

64

主题

272

帖子

272

积分

中级会员

Rank: 3Rank: 3

积分
272
发表于 2008-7-12 22:40:00 | 显示全部楼层 |阅读模式
裁减体的6个平面是用一个6行4列的变量m_fFrustum[6][4]保存,每行定义一个平面,每列的前三个变量组成面的法向量,最后一个变量是面到原点的距离。
我的疑问是经过clip = matView * matProj后应该有-1<x<1,-1<y<1, 0<z<1;那么m_fFrustum的第四列保存的距离应该是个[0,1]之间的值吧(因为裁减体被平移到了原点上???),可是实际算出来的是一个几十的数值
我觉得可能我概念上有点理解错误了 ,希望大家指点一下~~~~~

//计算裁减体
void Clip::ExtractFrustum(D3DXMATRIX matView, D3DXMATRIX matProj)
{
        D3DXMATRIX clip = matView * matProj;

        m_fFrustum[0][0] = clip._11 + clip._14; m_fFrustum[0][1] = clip._21 + clip._24;
        m_fFrustum[0][2] = clip._31 + clip._34; m_fFrustum[0][3] = clip._41 + clip._44;//左平面
        m_fFrustum[1][0] = clip._14 - clip._11; m_fFrustum[1][1] = clip._24 - clip._21;
        m_fFrustum[1][2] = clip._34 - clip._31; m_fFrustum[1][3] = clip._44 - clip._41;//右平面
        m_fFrustum[2][0] = clip._14 - clip._12; m_fFrustum[2][1] = clip._24 - clip._22;
        m_fFrustum[2][2] = clip._34 - clip._32; m_fFrustum[2][3] = clip._44 - clip._42;//上
        m_fFrustum[3][0] = clip._12 + clip._14; m_fFrustum[3][1] = clip._22 + clip._24;
        m_fFrustum[3][2] = clip._32 + clip._34; m_fFrustum[3][3] = clip._42 + clip._44;//下
        m_fFrustum[4][0] = clip._14 - clip._13; m_fFrustum[4][1] = clip._24 - clip._23;
        m_fFrustum[4][2] = clip._34 - clip._33; m_fFrustum[4][3] = clip._44 - clip._43;//远
        m_fFrustum[5][0] = clip._13; m_fFrustum[5][1] = clip._23; m_fFrustum[5][2] = clip._33; m_fFrustum[5][3] = clip._43;//近

        //对每个平面的向量normalize
        for (int i = 0; i < 6; ++i) {
       
                float temp = sqrt(m_fFrustum[0] * m_fFrustum[0] + m_fFrustum[1] * m_fFrustum[1] + m_fFrustum[2] * m_fFrustum[2]);
                m_fFrustum[0] = m_fFrustum[0] / temp;
                m_fFrustum[1] = m_fFrustum[1] / temp;
                m_fFrustum[2] = m_fFrustum[2] / temp;
        }
}
在用球包围体判断物体是否在裁减体内时也遇到类似的问题
bool Clip::IsSphereInFrustum(float x, float y, float z, float r)
{
        for (int i = 0; i < 6; ++i) {

                if (m_fFrustum[0] * x + m_fFrustum[1] * y + m_fFrustum[2] * z + m_fFrustum[3] < -r)
                        return false;
        }

        return true;
}

64

主题

272

帖子

272

积分

中级会员

Rank: 3Rank: 3

积分
272
 楼主| 发表于 2008-7-12 22:45:00 | 显示全部楼层

Re:做视锥裁减的时候有点问题请教一下~

PS.最后我调用IsSphereInFrustum判断是否在裁减体内时候全返回false……图的坐标轴y应该是z

64

主题

272

帖子

272

积分

中级会员

Rank: 3Rank: 3

积分
272
 楼主| 发表于 2008-7-13 09:46:00 | 显示全部楼层

Re:做视锥裁减的时候有点问题请教一下~

搞明白了,对于变换后平面方程V = (A, B, C, D)有View * Proj * (V^-1) = (A1, B1, C1, D1) = V2.
V2是变换前的平面方程~~所以那个是实际距离~~~~~~~~~~~~

假如View * Proj = (m1, m2, m3, m4);//mi表示第i列
我算的平面方程是:
N: m3            F:m4 - m3
L: m1 + m4       R:m4 - m1
B: m2 + m4       T:m4 - m2
不知道我是不是这里计算错误了~

64

主题

272

帖子

272

积分

中级会员

Rank: 3Rank: 3

积分
272
 楼主| 发表于 2008-7-13 10:17:00 | 显示全部楼层

Re:做视锥裁减的时候有点问题请教一下~

汗……原来是包围体段错了……这个没错……
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-22 01:22

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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