游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3841|回复: 8

十万火急,再不解决老板就要炒人了

[复制链接]

15

主题

83

帖子

123

积分

注册会员

Rank: 2

积分
123
发表于 2004-8-13 10:47:00 | 显示全部楼层 |阅读模式
我始终算出来是错的,我草他吗!!!
下面是我的方法,请看看是不是有错

//计算出观察矩阵和透视矩阵
D3DXMATRIXA16 m_view;
D3DXMATRIXA16 m_proj;
D3DXMatrixLookAtLH( &m_view, &m_eye, &m_lookat, &m_up );
D3DXMatrixPerspectiveFovLH( &m_proj, m_pi, m_aspect, m_near, m_far );

//初始化m_stand_frustum_point,他是经过视图变换和投影变换后的范体
D3DXVECTOR3 m_stand_frustum_point[8];
m_stand_frustum_point[0] = D3DXVECTOR3(1, 1, 0);
m_stand_frustum_point[1] = D3DXVECTOR3(1, -1, 0);
m_stand_frustum_point[2] = D3DXVECTOR3(-1, 1, 0);
m_stand_frustum_point[3] = D3DXVECTOR3(-1, -1, 0);
m_stand_frustum_point[4] = D3DXVECTOR3(1, 1, 1);
m_stand_frustum_point[5] = D3DXVECTOR3(1, -1, 1);
m_stand_frustum_point[6] = D3DXVECTOR3(-1, 1, 1);
m_stand_frustum_point[7] = D3DXVECTOR3(-1, -1, 1);

D3DXMATRIX iver_view;
D3DXMATRIX iver_proj;
D3DXMATRIX mul_temp;

//计算出观察矩阵和透视矩阵的逆矩阵
D3DXMatrixInverse(&iver_proj, 0, &m_proj);
D3DXMatrixInverse(&iver_view, 0, &m_view);

//把他们相乘得到最终的反算矩阵
D3DXMatrixMultiply(&mul_temp, &iver_proj, &iver_view);

//把最终的范体的每个点乘上反算矩阵,应该得到他们在被进行视图变换和投影变换之前的位置
D3DXVECTOR4 temp;
D3DXVECTOR3 m_frustum_point[8];
for(int i=0; i<8; ++i)
{
D3DXVec3Transform( &temp, &m_stand_frustum_point, &mul_temp );
m_frustum_point.x = temp.x;
m_frustum_point.y = temp.y;
m_frustum_point.z = temp.z;
}
//但是结果根本和我想的不一样,好象X坐标有很大错误,请问为什么?我什么地方错了?

33

主题

445

帖子

446

积分

中级会员

Rank: 3Rank: 3

积分
446
发表于 2004-8-13 11:12:00 | 显示全部楼层

Re:十万火急,再不解决老板就要炒人了

//初始化m_stand_frustum_point,他是经过视图变换和投影变换后的范体
D3DXVECTOR3 m_stand_frustum_point[8];
m_stand_frustum_point[0] = D3DXVECTOR3(1, 1, 0);
m_stand_frustum_point[1] = D3DXVECTOR3(1, -1, 0);
m_stand_frustum_point[2] = D3DXVECTOR3(-1, 1, 0);
m_stand_frustum_point[3] = D3DXVECTOR3(-1, -1, 0);
m_stand_frustum_point[4] = D3DXVECTOR3(1, 1, 1);
m_stand_frustum_point[5] = D3DXVECTOR3(1, -1, 1);
m_stand_frustum_point[6] = D3DXVECTOR3(-1, 1, 1);
m_stand_frustum_point[7] = D3DXVECTOR3(-1, -1, 1);

我感觉根据你的意思应该是只经过视图变换后的平头截,不应该在投影了吧。

8

主题

284

帖子

296

积分

中级会员

Rank: 3Rank: 3

积分
296
QQ
发表于 2004-8-13 13:16: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] );

15

主题

83

帖子

123

积分

注册会员

Rank: 2

积分
123
 楼主| 发表于 2004-8-13 15:43:00 | 显示全部楼层

Re:十万火急,再不解决老板就要炒人了

但是矩阵乘法是可以这样的啊,还是我记错了....
P1x4 * A4x4 * B4x4 = Q1x4
P1x4 * A4x4 * B4x4 * B4x4(逆) = Q1x4 * B4x4(逆)
P1x4 * A4x4 * I = Q1x4 * B4x4(逆)
P1x4 * A4x4  = Q1x4 * B4x4(逆)
P1x4 * A4x4 * A4x4(逆) = Q1x4 * B4x4(逆) * A4x4(逆)
P1x4 * I = Q1x4 * B4x4(逆) * A4x4(逆)
P1x4 = Q1x4 * B4x4(逆) * A4x4(逆)

难道不对吗?

15

主题

83

帖子

123

积分

注册会员

Rank: 2

积分
123
 楼主| 发表于 2004-8-13 15:51:00 | 显示全部楼层

Re:十万火急,再不解决老板就要炒人了

而且好象我记得高等代数书上有个公式就是象上面那样推导的啊
A*B    的逆是    B(逆)*A(逆)

50

主题

992

帖子

1012

积分

金牌会员

Rank: 6Rank: 6

积分
1012
发表于 2004-8-13 20:51:00 | 显示全部楼层

Re: Re:十万火急,再不解决老板就要炒人了

想得到转换前的顶点可以用如下方法,文章里只介绍了提取面的方法,想得到顶点根据视角计算一下就行了

sf_2004813205142.rar

183.67 KB, 下载次数:

4

主题

12

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2004-12-8 17:04:00 | 显示全部楼层

Re:十万火急,再不解决老板就要炒人了

请问世界空间的View Frustum经过视图变换和投影变换后是上面所说的范体吗?
还有就是投影变换矩阵是什么样的(主要注意针对z坐标的变换),经过投影变换后的点坐标的
的z不是0吗?
如果View Frustum的front的z坐标被映射为0,而View Frustum的back的z坐标
被映射为1,请问这是如何经过投影变换得来的?
清高手指教!!

24

主题

161

帖子

179

积分

注册会员

Rank: 2

积分
179
发表于 2004-12-9 17:14:00 | 显示全部楼层

Re:十万火急,再不解决老板就要炒人了


D3DXMatrixMultiply(&mul_temp, &iver_proj, &iver_view);

改成
D3DXMatrixMultiply(&mul_temp, &iver_view, &iver_proj);
试一试

18

主题

631

帖子

660

积分

高级会员

Rank: 4

积分
660
发表于 2004-12-9 18:10:00 | 显示全部楼层

Re:十万火急,再不解决老板就要炒人了

炒了没有?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-23 16:13

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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