游戏开发论坛

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

关于如何得到view Frustum

[复制链接]

12

主题

70

帖子

70

积分

注册会员

Rank: 2

积分
70
发表于 2005-12-14 10:54:00 | 显示全部楼层 |阅读模式
先说明我用的是DX,通常的做法是获得matView ,matProj,然后
D3DXMatrixMultiply(&clip,&m_matView,&m_matProj);
        //D3DXMatrixInverse(&clip,NULL,&clip);

        m_FrustumInfo[FRUSTUM_NEAR].a = clip._13;
        m_FrustumInfo[FRUSTUM_NEAR].b = clip._23 ;
        m_FrustumInfo[FRUSTUM_NEAR].c = clip._33 ;
        m_FrustumInfo[FRUSTUM_NEAR].d = clip._43 ;
       
        D3DXPlaneNormalize(&m_FrustumInfo[FRUSTUM_NEAR],&m_FrustumInfo[FRUSTUM_NEAR]);

        m_FrustumInfo[FRUSTUM_FAR].a = clip._14 - clip._13;
        m_FrustumInfo[FRUSTUM_FAR].b = clip._24 - clip._23;
        m_FrustumInfo[FRUSTUM_FAR].c = clip._34 - clip._33;
        m_FrustumInfo[FRUSTUM_FAR].d = clip._44 - clip._43;

        D3DXPlaneNormalize(&m_FrustumInfo[FRUSTUM_FAR],&m_FrustumInfo[FRUSTUM_FAR]);

        m_FrustumInfo[FRUSTUM_LEFT].a = clip._14 + clip._11;
        m_FrustumInfo[FRUSTUM_LEFT].b = clip._24 + clip._12;
        m_FrustumInfo[FRUSTUM_LEFT].c = clip._34 + clip._13;
        m_FrustumInfo[FRUSTUM_LEFT].d = clip._44 + clip._14;

        D3DXPlaneNormalize(&m_FrustumInfo[FRUSTUM_LEFT],&m_FrustumInfo[FRUSTUM_LEFT]);

        m_FrustumInfo[FRUSTUM_RIGHT].a = clip._14 - clip._11;
        m_FrustumInfo[FRUSTUM_RIGHT].b = clip._24 - clip._12;
        m_FrustumInfo[FRUSTUM_RIGHT].c = clip._34 - clip._13;
        m_FrustumInfo[FRUSTUM_RIGHT].d = clip._44 - clip._14;

        D3DXPlaneNormalize(&m_FrustumInfo[FRUSTUM_RIGHT],&m_FrustumInfo[FRUSTUM_RIGHT]);

        m_FrustumInfo[FRUSTUM_TOP].a = clip._14 - clip._12;
        m_FrustumInfo[FRUSTUM_TOP].b = clip._24 - clip._22;
        m_FrustumInfo[FRUSTUM_TOP].c = clip._34 - clip._32;
        m_FrustumInfo[FRUSTUM_TOP].d = clip._44 - clip._42;

        D3DXPlaneNormalize(&m_FrustumInfo[FRUSTUM_TOP],&m_FrustumInfo[FRUSTUM_TOP]);

        m_FrustumInfo[FRUSTUM_BOTTOM].a = clip._14 + clip._12;
        m_FrustumInfo[FRUSTUM_BOTTOM].b = clip._24 + clip._22;
        m_FrustumInfo[FRUSTUM_BOTTOM].c = clip._34 + clip._32;
        m_FrustumInfo[FRUSTUM_BOTTOM].d = clip._44 + clip._42;

        D3DXPlaneNormalize(&m_FrustumInfo[FRUSTUM_BOTTOM],&m_FrustumInfo[FRUSTUM_BOTTOM]);
但是我目前根据这个算出来的结果总感觉不对,一个处于原点的摄像机,SetPerspective(D3DX_PI/4, (float)640/(float)480, 1.0f, 1000.0f);向上为正方向,得到的FRUSTUM很奇怪
-        [0]        {a=0.00000000 b=0.00000000 c=0.99999988 ...}       
        a        0.00000000        float
        b        0.00000000        float
        c        0.99999988        float
        d        -1.0000000        float
-        [1]        {a=0.00000000 b=0.00000000 c=-1.0000000 ...}        D3DXPLANE
        a        0.00000000        float
        b        0.00000000        float
        c        -1.0000000        float
        d        1000.0601        float
-        [2]        {a=0.92387950 b=0.00000000 c=0.38268346 ...}        D3DXPLANE
        a        0.92387950        float
        b        0.00000000        float
        c        0.38268346        float
        d        0.00000000        float
-        [3]        {a=-0.92387950 b=0.00000000 c=0.38268346 ...}        D3DXPLANE
        a        -0.92387950        float
        b        0.00000000        float
        c        0.38268346        float
        d        0.00000000        float
-        [4]        {a=0.00000000 b=-0.92387950 c=0.38268346 ...}        D3DXPLANE
        a        0.00000000        float
        b        -0.92387950        float
        c        0.38268346        float
        d        0.00000000        float
-        [5]        {a=0.00000000 b=0.92387950 c=0.38268346 ...}        D3DXPLANE
        a        0.00000000        float
        b        0.92387950        float
        c        0.38268346        float
        d        0.00000000        float
为什么后面的4个面的d全为0呢?

11

主题

114

帖子

118

积分

注册会员

Rank: 2

积分
118
QQ
发表于 2005-12-14 11:30:00 | 显示全部楼层

Re:关于如何得到view Frustum

这并不奇怪,因为那4个为0的面是视锥体的上下左右四个面,他们在视图空间中都是过原点的

12

主题

70

帖子

70

积分

注册会员

Rank: 2

积分
70
 楼主| 发表于 2005-12-14 13:36:00 | 显示全部楼层

Re:关于如何得到view Frustum

明白了,开始没想清楚,以为4个面都过原点就没交集,就无法形成视锥体了,没想到延伸出去的部分可以
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-22 23:20

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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