游戏开发论坛

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

在CubeMap中怎样获得6个观察矩阵?

[复制链接]

83

主题

169

帖子

202

积分

中级会员

Rank: 3Rank: 3

积分
202
发表于 2010-3-5 18:35:00 | 显示全部楼层 |阅读模式
如题。

我自己试了一下,但是效果不对,大家帮我看看。谢谢!

//
//
//Cube观察矩阵
D3DXMATRIX matCubeView;

//观察方向
D3DXVECTOR3 LookatPt( 0.0f, 0.0f, 0.0f );

EyePt=D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
D3DXVECTOR3 vUpVec;

switch(iFace)
{
    case D3DCUBEMAP_FACE_POSITIVE_X:
    {
        LookatPt=D3DXVECTOR3( 1.0f, 0.0f, 0.0f );
        vUpVec=D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
        break;
    }
    case D3DCUBEMAP_FACE_NEGATIVE_X :
    {
        LookatPt=D3DXVECTOR3( -1.0f, 0.0f, 0.0f );
        vUpVec=D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
        break;
    }
    case D3DCUBEMAP_FACE_POSITIVE_Y:
    {
        LookatPt=D3DXVECTOR3( 0.0f, 2.0f, 0.0f );
        vUpVec=D3DXVECTOR3( 0.0f, 0.0f, -1.0f );
        break;
    }
    case D3DCUBEMAP_FACE_NEGATIVE_Y:
    {
        LookatPt=D3DXVECTOR3( 0.0f, -1.0f, 0.0f );
        vUpVec=D3DXVECTOR3( 0.0f, 0.0f, 1.0f );
        break;
     }
     case D3DCUBEMAP_FACE_POSITIVE_Z:
     {
        LookatPt=D3DXVECTOR3( 0.0f, 0.0f, 1.0f );
        vUpVec=D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
        break;
     }
     case D3DCUBEMAP_FACE_NEGATIVE_Z :
     {
         LookatPt=D3DXVECTOR3( 0.0f, 0.0f, -1.0f );
         vUpVec=D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
         break;
     }
}

D3DXMatrixLookAtLH( &matCubeView, &EyePt, &LookatPt, &vUpVec );

15

主题

62

帖子

64

积分

注册会员

Rank: 2

积分
64
发表于 2010-3-6 13:55:00 | 显示全部楼层

Re:在CubeMap中怎样获得6个观察矩阵?

这是我clight类里的代码,仅供参考
                void GetLightViewMatrix(D3DXMATRIXA16* pmatLightView ,
                        D3DCUBEMAP_FACES iFace = D3DCUBEMAP_FACE_POSITIVE_X)
                {
                        if (m_eType == SGELIGHT_SPOT)
                        {
                                D3DXVECTOR3 vLookAt = m_vPosition + m_vDirection;
                                D3DXVECTOR3 vLookUp;
                                if (m_vDirection.x == 0 && m_vDirection.z == 0)
                                        vLookUp = D3DXVECTOR3(1.0f , 0.0f , 0.0f);
                                else
                                        vLookUp = D3DXVECTOR3(0.0f , 1.0f , 0.0f);
                                D3DXMatrixLookAtLH(pmatLightView , &m_vPosition , &vLookAt , &vLookUp);
                        }
                        if (m_eType == SGELIGHT_POINT)
                        {
                                D3DXVECTOR3 vLookDir;
                                D3DXVECTOR3 vLookUp;
                                switch(iFace)
                                {
                                case D3DCUBEMAP_FACE_POSITIVE_X:
                                        vLookDir = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
                                        vLookUp    = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
                                        break;
                                case D3DCUBEMAP_FACE_NEGATIVE_X:
                                        vLookDir = D3DXVECTOR3(-1.0f, 0.0f, 0.0f);
                                        vLookUp    = D3DXVECTOR3( 0.0f, 1.0f, 0.0f);
                                        break;
                                case D3DCUBEMAP_FACE_POSITIVE_Y:
                                        vLookDir = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
                                        vLookUp    = D3DXVECTOR3(0.0f, 0.0f,-1.0f);
                                        break;
                                case D3DCUBEMAP_FACE_NEGATIVE_Y:
                                        vLookDir = D3DXVECTOR3(0.0f,-1.0f, 0.0f);
                                        vLookUp    = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
                                        break;
                                case D3DCUBEMAP_FACE_POSITIVE_Z:
                                        vLookDir = D3DXVECTOR3( 0.0f, 0.0f, 1.0f);
                                        vLookUp    = D3DXVECTOR3( 0.0f, 1.0f, 0.0f);
                                        break;
                                case D3DCUBEMAP_FACE_NEGATIVE_Z:
                                        vLookDir = D3DXVECTOR3(0.0f, 0.0f,-1.0f);
                                        vLookUp    = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
                                        break;
                                }
                                D3DXVECTOR3 vLookAt = m_vPosition + vLookDir;
                                D3DXMatrixLookAtLH(pmatLightView , &m_vPosition , &vLookAt , &vLookUp);
                        }
                }

83

主题

169

帖子

202

积分

中级会员

Rank: 3Rank: 3

积分
202
 楼主| 发表于 2010-3-6 14:26:00 | 显示全部楼层

Re:在CubeMap中怎样获得6个观察矩阵?

谢谢!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-12 17:52

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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