游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3173|回复: 7

能解释一下SDK中那个投影映射是怎么完成的吗?

[复制链接]

8

主题

15

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2003-10-18 22:53:00 | 显示全部楼层 |阅读模式
如图所示,微软的文档上说把最右上角顶端的点映射成中间的点,它的具体数学演算是怎么样的.

在计算视锥时,它的各个平面的法向量都可以通过矩阵View与投影矩阵Projection的乘积得到,但是具体怎么得到的却不怎么清楚
sf_20031018225343.jpg

8

主题

15

帖子

19

积分

新手上路

Rank: 1

积分
19
 楼主| 发表于 2003-10-19 22:01:00 | 显示全部楼层

Re:能解释一下SDK中那个投影映射是怎么完成的吗?

怎么就没人回呢

10

主题

60

帖子

70

积分

注册会员

Rank: 2

积分
70
QQ
发表于 2003-10-19 23:46:00 | 显示全部楼层

Re: 能解释一下SDK中那个投影映射是怎么完成的吗?

要取得视锥的六个平面方程并不难.
给你我写的源码看看就知道了.
 
void CFrustum::CalculateFrustum(LPDIRECT3DDEVICE8 pD3DDevice)
{
        D3DXMATRIX mWorldMat;
        pD3DDevice->GetTransform( D3DTS_WORLD, &mWorldMat );

        D3DXMATRIX mProjectMat;
        pD3DDevice->GetTransform( D3DTS_PROJECTION, &mProjectMat );

        D3DXMATRIX mViewMat;
        pD3DDevice->GetTransform( D3DTS_VIEW, &mViewMat );
       
        D3DXMatrixMultiply( &mWorldMat, &mViewMat,&mWorldMat);
        //D3DXMatrixMultiply( &mWorldMat,&mWorldMat, &mViewMat);

        D3DXMATRIX mClipMat;
        D3DXMatrixMultiply( &mClipMat, &mWorldMat, &mProjectMat);

        m_Frustum[RIGHT][A] = mClipMat._14 - mClipMat._11;
        m_Frustum[RIGHT][B] = mClipMat._24 - mClipMat._21;
        m_Frustum[RIGHT][C] = mClipMat._34 - mClipMat._31;
        m_Frustum[RIGHT][D] = mClipMat._44 - mClipMat._41;

        NormalizePlane(m_Frustum,RIGHT);

        m_Frustum[LEFT][A] = mClipMat._14 + mClipMat._11;
        m_Frustum[LEFT][B] = mClipMat._24 + mClipMat._21;
        m_Frustum[LEFT][C] = mClipMat._34 + mClipMat._31;
        m_Frustum[LEFT][D] = mClipMat._44 + mClipMat._41;

        NormalizePlane(m_Frustum,LEFT);

        m_Frustum[BOTTOM][A] = mClipMat._14 + mClipMat._12;
        m_Frustum[BOTTOM][B] = mClipMat._24 + mClipMat._22;
        m_Frustum[BOTTOM][C] = mClipMat._34 + mClipMat._32;
        m_Frustum[BOTTOM][D] = mClipMat._44 + mClipMat._42;

        NormalizePlane(m_Frustum,BOTTOM);

        m_Frustum[TOP][A] = mClipMat._14 - mClipMat._12;
        m_Frustum[TOP][B] = mClipMat._24 - mClipMat._22;
        m_Frustum[TOP][C] = mClipMat._34 - mClipMat._32;
        m_Frustum[TOP][D] = mClipMat._44 - mClipMat._42;

        NormalizePlane(m_Frustum,TOP);

        m_Frustum[BACK][A] = mClipMat._14 - mClipMat._13;
        m_Frustum[BACK][B] = mClipMat._24 - mClipMat._23;
        m_Frustum[BACK][C] = mClipMat._34 - mClipMat._33;
        m_Frustum[BACK][D] = mClipMat._44 - mClipMat._43;

        NormalizePlane(m_Frustum,BACK);

        m_Frustum[FRONT][A] = mClipMat._14 + mClipMat._13;
        m_Frustum[FRONT][B] = mClipMat._24 + mClipMat._23;
        m_Frustum[FRONT][C] = mClipMat._34 + mClipMat._33;
        m_Frustum[FRONT][D] = mClipMat._44 + mClipMat._43;

        NormalizePlane(m_Frustum,FRONT);
}

8

主题

15

帖子

19

积分

新手上路

Rank: 1

积分
19
 楼主| 发表于 2003-10-20 16:58:00 | 显示全部楼层

Re:能解释一下SDK中那个投影映射是怎么完成的吗?

这段代码我在GameTutorials中找到过,但是不清楚它是怎么实现的.他是用OPENGL写的,我知道在DIRECTX中叉乘是相反的,我怕不知道原理的话会搞错,这位兄弟能解释一下吗?

8

主题

15

帖子

19

积分

新手上路

Rank: 1

积分
19
 楼主| 发表于 2003-10-20 17:07:00 | 显示全部楼层

Re:能解释一下SDK中那个投影映射是怎么完成的吗?

WindSprite兄好像以前哪见过,一定要解释一下,因为这个问题挺困惑人的,自己也分析过,但就是有点不明白.你是自己推出来的吗?

8

主题

15

帖子

19

积分

新手上路

Rank: 1

积分
19
 楼主| 发表于 2003-10-25 11:52:00 | 显示全部楼层

Re:能解释一下SDK中那个投影映射是怎么完成的吗?

再顶一下,希望得到解答

6

主题

582

帖子

582

积分

高级会员

Rank: 4

积分
582
发表于 2005-6-6 22:36:00 | 显示全部楼层

Re: Re: 能解释一下SDK中那个投影映射是怎么完成的吗?

windsprite: Re: 能解释一下SDK中那个投影映射是怎么完成的吗?

要取得视锥的六个平面方程并不难.
给你我写的源码看看就知道了.
 
void CFrustum::CalculateFrustum(LP...


我用你这段代码替换原来的opengl代码,结果不对啊,能告诉为什么么
其他人有谁知道?

33

主题

118

帖子

173

积分

注册会员

Rank: 2

积分
173
发表于 2005-6-9 15:16:00 | 显示全部楼层

Re:能解释一下SDK中那个投影映射是怎么完成的吗?

最起码下面的代码就不正确
D3DXMatrixMultiply( &mWorldMat, &mViewMat,&mWorldMat);

D3DXMATRIX mClipMat;
D3DXMatrixMultiply( &mClipMat, &mWorldMat, &mProjectMat);
上下的矩阵相乘顺序正好相反
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-25 23:08

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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