游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2333|回复: 6

问个关于视截体平面的问题.

[复制链接]

3

主题

5

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2007-1-6 12:38:00 | 显示全部楼层 |阅读模式
视截体的6个平面如何才能求出,在网上看到通过matView和matProj的组合矩阵求6个平面公式如下:

平面                        <N,D>
               近                         M4+M3
               远                         M4-M3
               左                         M4+M1
               右                         M4-M1
               上                         M4+M2
               下                         M4-M2
M4+M3 = a = M._41+M._31
              b = M._42+M._32
              c = M._43+M._43
              d = M._44+M._44
我的理解是对的吗,公式是对的吗,这样求出的平面只是在摄像机空间中的矩阵吧,如何把它转换到世界坐标系空间中呢,因为我要拿它和顶点做是否包围计算,还有我在别处看到的一个求平面的代码如下:
D3DXMATRIX matWorld, matView, matProj;
  //检查设备是否为空
  if(pd3dDevice == NULL)
    return false;
  //取得投影变换矩阵
  pd3dDevice->GetTransform(D3DTS_PROJECTION, &matProj);
  //取得摄影变换矩阵
  pd3dDevice->GetTransform(D3DTS_VIEW, &matView);
  //计算摄影和投影变换后的世界变换矩阵
  D3DXMatrixMultiply(&matWorld, &matView, &matProj);
  //计算视截体的6个平面方程
  m_Planes[0].a = matWorld._13;//近平面
  m_Planes[0].b = matWorld._23;
  m_Planes[0].c = matWorld._33;
  m_Planes[0].d = matWorld._43;
  D3DXPlaneNormalize(&m_Planes[0], &m_Planes[0]);

  m_Planes[1].a = matWorld._14 - matWorld._13; //远平面
  m_Planes[1].b = matWorld._24 - matWorld._23;
  m_Planes[1].c = matWorld._34 - matWorld._33;
  m_Planes[1].d = matWorld._44 - matWorld._43;
  D3DXPlaneNormalize(&m_Planes[1], &m_Planes[1]);

  m_Planes[2].a = matWorld._14 + matWorld._11; //左平面
  m_Planes[2].b = matWorld._24 + matWorld._21;
  m_Planes[2].c = matWorld._34 + matWorld._31;
  m_Planes[2].d = matWorld._44 + matWorld._41;
  D3DXPlaneNormalize(&m_Planes[2], &m_Planes[2]);

  m_Planes[3].a = matWorld._14 - matWorld._11; //右平面
  m_Planes[3].b = matWorld._24 - matWorld._21;
  m_Planes[3].c = matWorld._34 - matWorld._31;
  m_Planes[3].d = matWorld._44 - matWorld._41;
  D3DXPlaneNormalize(&m_Planes[3], &m_Planes[3]);

  m_Planes[4].a = matWorld._14 - matWorld._12; //顶面
  m_Planes[4].b = matWorld._24 - matWorld._22;
  m_Planes[4].c = matWorld._34 - matWorld._32;
  m_Planes[4].d = matWorld._44 - matWorld._42;
  D3DXPlaneNormalize(&m_Planes[4], &m_Planes[4]);

  m_Planes[5].a = matWorld._14 + matWorld._12; //底面
  m_Planes[5].b = matWorld._24 + matWorld._22;
  m_Planes[5].c = matWorld._34 + matWorld._32;
  m_Planes[5].d = matWorld._44 + matWorld._42;
  D3DXPlaneNormalize(&m_Planes[5], &m_Planes[5]);

怎么和上面的公式不一样呢,是我无法理解还是其中一个是错的,还是这个代码求出的直接是世界空间中的平面.请大虾们指点,本人也是刚投入D3D编程中来,并且线性代数的基础很差,请各位在讲解时不要太笼统.拜谢~~!

35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2007-1-6 21:18:00 | 显示全部楼层

Re:问个关于视截体平面的问题.

先学一下计算机图形学,搞清3D管线,仔细研究一下其中的裁剪矩阵,既知.

10

主题

214

帖子

402

积分

中级会员

Rank: 3Rank: 3

积分
402
发表于 2007-1-7 11:45:00 | 显示全部楼层

Re:问个关于视截体平面的问题.

求OPENGL和D3D的视截体平面的方法是有区别的

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2007-1-8 16:27:00 | 显示全部楼层

Re:问个关于视截体平面的问题.

你在别处看到的代码是直接求出在世界坐标系内的平面

8

主题

284

帖子

296

积分

中级会员

Rank: 3Rank: 3

积分
296
QQ
发表于 2007-1-9 05:09:00 | 显示全部楼层

Re:问个关于视截体平面的问题.

OPENGL的做法。

// OpenGL
        D3DXMatrixMultiply( &mat, pMatView, pMatProj );
        // Right Plane
        pCullInfo->planeFrustumNormalizePlane[0].a = mat._14 - mat._11;
        pCullInfo->planeFrustumNormalizePlane[0].b = mat._24 - mat._21;
        pCullInfo->planeFrustumNormalizePlane[0].c = mat._34 - mat._31;
        pCullInfo->planeFrustumNormalizePlane[0].d = mat._44 - mat._41;
        // Normalize
        D3DXPlaneNormalize( &pCullInfo->planeFrustumNormalizePlane[0], &pCullInfo->planeFrustumNormalizePlane[0] );

        // Left
        pCullInfo->planeFrustumNormalizePlane[1].a = mat._14 + mat._11;
        pCullInfo->planeFrustumNormalizePlane[1].b = mat._24 + mat._21;
        pCullInfo->planeFrustumNormalizePlane[1].c = mat._34 + mat._31;
        pCullInfo->planeFrustumNormalizePlane[1].d = mat._44 + mat._41;

        D3DXPlaneNormalize( &pCullInfo->planeFrustumNormalizePlane[1], &pCullInfo->planeFrustumNormalizePlane[1] );

        // BOTTOM
        pCullInfo->planeFrustumNormalizePlane[2].a = mat._14 + mat._12;
        pCullInfo->planeFrustumNormalizePlane[2].b = mat._24 + mat._22;
        pCullInfo->planeFrustumNormalizePlane[2].c = mat._34 + mat._32;
        pCullInfo->planeFrustumNormalizePlane[2].d = mat._44 + mat._42;

        D3DXPlaneNormalize( &pCullInfo->planeFrustumNormalizePlane[2], &pCullInfo->planeFrustumNormalizePlane[2] );

        // TOP
        pCullInfo->planeFrustumNormalizePlane[3].a = mat._14 - mat._12;
        pCullInfo->planeFrustumNormalizePlane[3].b = mat._24 - mat._22;
        pCullInfo->planeFrustumNormalizePlane[3].c = mat._34 - mat._32;
        pCullInfo->planeFrustumNormalizePlane[3].d = mat._44 - mat._42;

        D3DXPlaneNormalize( &pCullInfo->planeFrustumNormalizePlane[3], &pCullInfo->planeFrustumNormalizePlane[3] );

        // BACK
        pCullInfo->planeFrustumNormalizePlane[4].a = mat._14 - mat._13;
        pCullInfo->planeFrustumNormalizePlane[4].b = mat._24 - mat._23;
        pCullInfo->planeFrustumNormalizePlane[4].c = mat._34 - mat._33;
        pCullInfo->planeFrustumNormalizePlane[4].d = mat._44 - mat._43;

        D3DXPlaneNormalize( &pCullInfo->planeFrustumNormalizePlane[4], &pCullInfo->planeFrustumNormalizePlane[4] );

        // FRONT
        pCullInfo->planeFrustumNormalizePlane[5].a = mat._14 + mat._13;
        pCullInfo->planeFrustumNormalizePlane[5].b = mat._24 + mat._23;
        pCullInfo->planeFrustumNormalizePlane[5].c = mat._34 + mat._33;
        pCullInfo->planeFrustumNormalizePlane[5].d = mat._44 + mat._43;

        D3DXPlaneNormalize( &pCullInfo->planeFrustumNormalizePlane[5], &pCullInfo->planeFrustumNormalizePlane[5] );

8

主题

284

帖子

296

积分

中级会员

Rank: 3Rank: 3

积分
296
QQ
发表于 2007-1-9 05:11:00 | 显示全部楼层

Re:问个关于视截体平面的问题.

这是D3D的做法。

pCullInfo->vecFrustum[0] = D3DXVECTOR3(-1.0f, -1.0f,  0.0f); // xyz
    pCullInfo->vecFrustum[1] = D3DXVECTOR3( 1.0f, -1.0f,  0.0f); // Xyz
    pCullInfo->vecFrustum[2] = D3DXVECTOR3(-1.0f,  1.0f,  0.0f); // xYz
    pCullInfo->vecFrustum[3] = D3DXVECTOR3( 1.0f,  1.0f,  0.0f); // XYz
    pCullInfo->vecFrustum[4] = D3DXVECTOR3(-1.0f, -1.0f,  1.0f); // xyZ
    pCullInfo->vecFrustum[5] = D3DXVECTOR3( 1.0f, -1.0f,  1.0f); // XyZ
    pCullInfo->vecFrustum[6] = D3DXVECTOR3(-1.0f,  1.0f,  1.0f); // xYZ
    pCullInfo->vecFrustum[7] = D3DXVECTOR3( 1.0f,  1.0f,  1.0f); // XYZ

    for( INT i = 0; i < 8; i++ )
        D3DXVec3TransformCoord( &pCullInfo->vecFrustum, &pCullInfo->vecFrustum, &mat );

    D3DXPlaneFromPoints( &pCullInfo->planeFrustum[0], &pCullInfo->vecFrustum[0],
        &pCullInfo->vecFrustum[1], &pCullInfo->vecFrustum[2] ); // Near
    D3DXPlaneFromPoints( &pCullInfo->planeFrustum[1], &pCullInfo->vecFrustum[6],
        &pCullInfo->vecFrustum[7], &pCullInfo->vecFrustum[5] ); // Far
    D3DXPlaneFromPoints( &pCullInfo->planeFrustum[2], &pCullInfo->vecFrustum[2],
        &pCullInfo->vecFrustum[6], &pCullInfo->vecFrustum[4] ); // Left
    D3DXPlaneFromPoints( &pCullInfo->planeFrustum[3], &pCullInfo->vecFrustum[7],
        &pCullInfo->vecFrustum[3], &pCullInfo->vecFrustum[5] ); // Right
    D3DXPlaneFromPoints( &pCullInfo->planeFrustum[4], &pCullInfo->vecFrustum[2],
        &pCullInfo->vecFrustum[3], &pCullInfo->vecFrustum[6] ); // Top
    D3DXPlaneFromPoints( &pCullInfo->planeFrustum[5], &pCullInfo->vecFrustum[1],
        &pCullInfo->vecFrustum[0], &pCullInfo->vecFrustum[4] ); // Bottom

8

主题

284

帖子

296

积分

中级会员

Rank: 3Rank: 3

积分
296
QQ
发表于 2007-1-9 05:11:00 | 显示全部楼层

Re:问个关于视截体平面的问题.

D3D的做法让人明白一些。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-26 05:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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