メッシュを描画する基本プログラム

DirectX の D3DXCreateTorus でトーラスのメッシュを生成して描画する基本プログラムです。
メッシュとは、3次元形状を三角形や四角形の集合で表したもので、DirectX には簡単なモデルを自動的に生成する関数が用意されています。
マテリアルも光源も設定していないので、真っ白なモデルが回転しながら描画されます。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. プライベートライブラリを使わないで DirectX9 の標準ライブラリだけで作成します。
    必要なライブラリは #pragma でリンクしています。
    g_pD3D は Direct3D のオブジェクトです。
    g_p3DDev は Direct3D のデバイスです。
    pMeshApp はメッシュのオブジェクトです。
    ViewForm は View(カメラ)の座標です。
        #define     NAME        "Material"
        #include    <d3d9.h>
        #include    <d3dx9.h>
        #pragma once
        #pragma comment(lib,"dxguid.lib")
        #pragma comment(lib,"d3d9.lib")
        #pragma comment(lib,"d3dx9.lib")
        #pragma comment(lib,"winmm.lib")
    
        #define SAFE_DELETE(p)  { if (p) { delete (p);     (p)=NULL; } }
        #define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p)=NULL; } }
        #define EMSG(x)         MessageBox(NULL,x,"DirectX D3D",MB_OK);
    
        //Global Area
        HWND                    g_hWnd;
        LPDIRECT3D9             g_pD3D = NULL;
        LPDIRECT3DDEVICE9       g_p3DDev = NULL;
        LPD3DXMESH              pMeshApp = NULL;
        D3DXVECTOR3             ViewForm(0.0f,0.0f,200.0f);
        
  2. InitDevices() 関数です。
    Init3DDev() はデバイスを取得する関数です。
    Back Buffer を取得して円を描画する で作成したものを使って下さい。
    D3DXCreateTorus() でトーラスメッシュを生成します。
    多角形や球メッシュも試して下さい。
    多角形のメッシュは裏返っているときには描画されないので注意して下さい。
        HRESULT InitDevices(void)
        {
            if (FAILED(Init3DDev(g_hWnd,&g_pD3D,&g_p3DDev)))    return E_FAIL;
            //多角形メッシュの生成
            //D3DXCreatePolygon(g_p3DDev,50,6,&pMeshApp,NULL);
            //球メッシュの生成
            //D3DXCreateSphere(g_p3DDev,50,32,32,&pMeshApp,NULL);
            //トーラスメッシュの生成
            D3DXCreateTorus(g_p3DDev,16,40,32,32,&pMeshApp,NULL);
            //ライトを使用しない
            g_p3DDev->SetRenderState(D3DRS_LIGHTING,FALSE);  
            return  S_OK;
        }
        
  3. メッシュを描画する関数です。
    Clear() で画面とZバッファをクリアします。
    BeginScene() でシーンの開始を設定します。
    SetupMatrices() は描画環境を設定する関数です。この後で説明します。
    pMeshApp->DrawSubset(0) でメッシュを描画します。
    EndScene() でシーンの処理を終了します。
    Present() で作成したシーンを描画します。
        void Draw(void)
        {
            //黒で塗りつぶして消去
            g_p3DDev->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
            if (SUCCEEDED(g_p3DDev->BeginScene()))
            {   g_p3DDev->BeginScene();
                //描画環境の設定
                SetupMatrices();
                pMeshApp->DrawSubset(0);
                g_p3DDev->EndScene();
            }
            g_p3DDev->Present(NULL,NULL,NULL,NULL);
        }
        
  4. 描画環境を設定する関数です。
    GetClientRect() で Window Size を取得してアスペクト比を設定することでメッシュが変形するのを防ぎます。
    D3DXMatrixLookAtLH() で View 座標を設定します。
    D3DXMatrixPerspectiveFovLH() で透視変換の設定をします。
        void  SetupMatrices(void)
        {   RECT            rect;
            D3DXMATRIX      matView;
            D3DXMATRIX      matProj;
            D3DXMATRIX      matWorld;
    
            GetClientRect(g_hWnd,&rect);
            //ワールド座標の回転
            D3DXMatrixRotationY(&matWorld,timeGetTime()/1000.0f);
            g_p3DDev->SetTransform(D3DTS_WORLD,&matWorld);
            //View 座標の設定
            D3DXMatrixLookAtLH(&matView,&ViewForm,
                               &D3DXVECTOR3(0.0f,0.0f,0.0f),&D3DXVECTOR3(0.0f,1.0f,0.0f));
            g_p3DDev->SetTransform(D3DTS_VIEW,&matView);
            //透視変換の設定
            D3DXMatrixPerspectiveFovLH(&matProj,D3DXToRadian(45.0f),(float)rect.right/(float)rect.bottom,100,1000);
            g_p3DDev->SetTransform(D3DTS_PROJECTION,&matProj);
        }
        
  5. オブジェクトを開放する関数です。
    取得したオブジェクトは必ず開放して下さい。
        void Cleanup(void)
        {
            SAFE_RELEASE(pMeshApp);
            SAFE_RELEASE(g_p3DDev);
            SAFE_RELEASE(g_pD3D);
        }
        

【課題】

  1. メッシュに色を設定して立体的に描画して下さい。
    そのためには、ライトとマテリアルの設定が必要です。
  2. ライトを設定する関数は SetLight() です。
    g_p3DDev->SetLight(0,&Light);
    g_p3DDev->LightEnable(0,TRUE);
  3. マテリアルを設定する関数は SetMaterial() です。
    g_p3DDev->SetMaterial(&Material);

【補足説明 】

Zバッファを使用するので、デバイスの取得でステンシルバッファを設定して下さい。
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

超初心者の方のために全ソースコードを掲載します。 (^_^;)
こちらは MyD3D Object Class を使っています。
全ソースコード

前田稔(Maeda Minoru)の超初心者のプログラム入門

超初心者のプログラム入門(DirectX9 game program)

超初心者のプログラム入門(DirectX10 game program)