游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2315|回复: 4

DX关于矩阵变换的问题,敬请赐教.

[复制链接]

30

主题

126

帖子

126

积分

注册会员

Rank: 2

积分
126
发表于 2006-5-20 13:13:00 | 显示全部楼层 |阅读模式



问题:
自定义的SetupMatrices()函数调用无效.我画的三角形它不转.SetTransform函数调用是成功的.且D3DXMatrixRotationY调用也是成功的.百思不得其解,从昨天郁闷到今天,实在是搞不清楚为什么会这样?敬请赐教.本人将没齿难望.谢谢.
SetupMatrices()代码如下:
HRESULT SetupMatrices(HWND hWnd)
{       
        //float angle=m_nRotateY*D3DX_PI/180;
        if(angle>360)
                angle=0;       
        D3DXMatrixRotationY( &matWorld, angle );
        if(FAILED(g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld )))
        {
                MessageBox(hWnd,"世界转换失败。","坐标变换失败",MB_OK);
                return E_FAIL;
        }
        D3DXVECTOR3 vEyePt   ( 0.0f, 3.0f,-5.0f );
        D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
        D3DXVECTOR3 vUpVec   ( 0.0f, 1.0f, 0.0f );
       
        D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
        g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );

        D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,2.0f,1.0f,500.0f);
        g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj);
        angle+=5;
}

全部代码如下:
#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>

#define D3DFVF_CUSTOMVERTEX D3DFVF_XYZRHW|D3DFVF_DIFFUSE

struct CUSTOMVERTEX{
        FLOAT x,y,z,rhw;
        DWORD color;
};

LPDIRECT3D9                                g_pD3D=NULL;
LPDIRECT3DDEVICE9                g_pd3dDevice=NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVB=NULL;

D3DXMATRIX matWorld;
D3DXMATRIX matView;
D3DXMATRIX matProj;
static FLOAT angle=0;

HRESULT InitD3D(HWND hWnd)
{
        if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
                return E_FAIL;
        D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory( &d3dpp, sizeof(d3dpp) );
        d3dpp.Windowed = TRUE;
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
        if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
                D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                &d3dpp, &g_pd3dDevice ) ) )
        {
                return E_FAIL;
        }
        return S_OK;
}

HRESULT InitVB()
{
        CUSTOMVERTEX vertices[] =
        {
                { 150.0f,  50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color
                { 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, },
                {  50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, },
        };
        if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),0 /*Usage*/,
                D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
                return E_FAIL;
        VOID* pVertices;
        if( FAILED( g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) )
                return E_FAIL;
        memcpy( pVertices, vertices, sizeof(vertices) );
        g_pVB->Unlock();
        return S_OK;
}

HRESULT SetupMatrices(HWND hWnd)
{       
        //float angle=m_nRotateY*D3DX_PI/180;
        if(angle>360)
                angle=0;
       

        D3DXMatrixRotationY( &matWorld, angle );
        if(FAILED(g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld )))
        {
                MessageBox(hWnd,"世界转换失败。","坐标变换失败",MB_OK);
                return E_FAIL;
        }

        D3DXVECTOR3 vEyePt   ( 0.0f, 0.0f,-50.0f );
        D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
        D3DXVECTOR3 vUpVec   ( 0.0f, 1.0f, 0.0f );
       
        D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
        g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );

        D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,2.0f,1.0f,500.0f);
        g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj);
        angle+=5;
}


HRESULT Render(HWND hWnd)
{
        if(NULL==g_pd3dDevice)
                return E_FAIL;
        g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
        // Begin the scene

        if(SUCCEEDED(g_pd3dDevice->BeginScene()))
        {
                SetupMatrices(hWnd);

                // Rendering of scene objects happens here
                g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
                g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
                g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );
                /*        {
                MessageBox(hWnd,"DrawPrimitive","DrawPrimitive",MB_OK);
                return E_FAIL;
                }*/
                // End the scene
                g_pd3dDevice->EndScene();
        }
        g_pd3dDevice-&gtresent( NULL, NULL, NULL, NULL );
        return S_OK;
}


VOID ClearUp()
{
        if(NULL!=g_pD3D)
                g_pD3D->Release();
        if(NULL!=g_pd3dDevice)
                g_pd3dDevice->Release();
        if(NULL!=g_pVB)
                g_pVB->Release();

}

LRESULT WINAPI WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
        switch( msg )
        {
        case WM_DESTROY:
                ClearUp();
                PostQuitMessage( 0 );
                return 0;
        }
        return DefWindowProc( hWnd, msg, wParam, lParam );
}

INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT)
{
        WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L,
                GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                "Direct3D Tutorial", NULL };
        RegisterClassEx( &wc );
        // Create the application's window.
        HWND hWnd = CreateWindow( "Direct3D Tutorial", "Direct3D Tutorial 01: CreateDevice",
                WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
                GetDesktopWindow(), NULL, wc.hInstance, NULL );

        if(SUCCEEDED(InitD3D(hWnd)))
        {
                if(SUCCEEDED(InitVB()))
                {
                        ShowWindow(hWnd,SW_SHOWDEFAULT);
                        UpdateWindow(hWnd);

                        MSG msg;
                        ZeroMemory(&msg,sizeof(msg));
                        while(msg.message!=WM_QUIT)
                        {
                                if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
                                {
                                        TranslateMessage(&msg);
                                        DispatchMessage(&msg);
                                }
                                else
                                        Render(hWnd);
                        }
                }
        }
        UnregisterClass("Direct3D Tutorial",wc.hInstance);
        return 0;
} [em7] [em7] [em7]

30

主题

126

帖子

126

积分

注册会员

Rank: 2

积分
126
 楼主| 发表于 2006-5-20 15:53:00 | 显示全部楼层

Re:DX关于矩阵变换的问题,敬请赐教.

我将程序进行了如下修改,可以得到预期结果,但不知道其原因?请高手赐教.修改如下:
#define D3DFVF_CUSTOMVERTEX D3DFVF_XYZRHW|D3DFVF_DIFFUSE
struct CUSTOMVERTEX
{
    FLOAT x, y, z, rhw; // The transformed position for the vertex.
    DWORD color;        // The vertex color.
};
CUSTOMVERTEX vertices[] =
{
    { 150.0f,  50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color
    { 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, },
    {  50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, },
};

改为:

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
struct CUSTOMVERTEX
{
        FLOAT x, y, z; // The transformed position for the vertex.
        DWORD color;        // The vertex color.
};
CUSTOMVERTEX vertices[] =
        {
                { -1.0f,-1.0f, 0.0f, 0xffff0000, },
        {  1.0f,-1.0f, 0.0f, 0xff0000ff, },
        {  0.0f, 1.0f, 0.0f, 0xffffffff, },
        };

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2006-5-20 17:37:00 | 显示全部楼层

Re:DX赜诰卣蟊浠坏奈侍?敬请赐教.

大哥。。。D3DFVF_XYZRHW的含义你没搞清楚,它表示该顶点已经经过变换和光照,也就是说渲染管线会跳过变换、光照的计算,当然会设置世界矩阵没效果了,要有效果才叫不正常。。。
[em10]
PS:还贴这么多代码上来。。。尼亚加拉瓜大瀑布汗……

30

主题

126

帖子

126

积分

注册会员

Rank: 2

积分
126
 楼主| 发表于 2006-5-22 14:27:00 | 显示全部楼层

Re:DX关于矩阵变换的问题,敬请赐教.

别这么说我嘛,搞得我很无地自容的.

11

主题

123

帖子

123

积分

注册会员

Rank: 2

积分
123
发表于 2006-5-23 02:17:00 | 显示全部楼层

Re:DX关于矩阵变换的问题,敬请赐教.

还是要贴原码的,不然大家也不能这么快帮你找到错误的原因,天才也从无知开始,你有什么好无地的呢?懂了不就赚了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-24 14:08

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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