竹林をバックに虎のメッシュを描画する

DirextX の LPD3DXSPRITE->Draw で竹林の背景を表示して、これをバックに DrawSubset で虎のメッシュを回転しながら描画します。
画像サイズが大きくなると重くなり、シューティングゲームのような速い動きが必要なプログラムでは使えないかも知れません。

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

プログラムの説明

  1. 空の新規プロジェクトを作成して、次のファイルをプロジェクトのフォルダーに格納して下さい。
    プロジェクト/既存項目の追加からプログラムファイルとヘッダファイルをプロジェクトに追加して下さい。
    ファイル名 ファイルの説明
    Tigerbak.cpp ソースプログラム
    myd3d.h MyD3D Object Class ヘッダファイル
    myd3d.cpp MyD3D Object Class プログラムファイル
    Tiger.x 虎の3Dモデル
    Tiger.bmp 虎のテクスチャ
    chikurin.jpg 背景画像
  2. Global Area と Direct3D Object と Surface の定義です。
    myd3d が MyD3D Object Class の定義です。
    g_pMesh は3Dモデル(虎)のオブジェクトです。
    g_pSprite はスプライトの定義で ImgFile[] が背景画像です。
        #include    "MyD3D.h"
    
        //Direct3D Global variables
        MyD3D                   *myd3d   = NULL;     // MyD3D Object Class
        HWND                    g_hWnd   = NULL;
        LPDIRECT3DDEVICE9       g_pDEV   = NULL;
        LPD3DXMESH              g_pMesh  = NULL;
        D3DMATERIAL9*           g_pMat   = NULL;
        LPDIRECT3DTEXTURE9*     g_pTex   = NULL;
        DWORD                   g_Num    = 0L;
        char                    XFile[24]= "Tiger.x";
    
        // Sprite の定義
        LPD3DXSPRITE            g_pSprite  = NULL;  // スプライト
        LPDIRECT3DTEXTURE9      g_pTexture = NULL;  // スプライトに使うテクスチャ
        char                    ImgFile[]   = "chikurin.jpg";
        
  3. Direct Graphics の初期化です。
    Object Class をインスタンス化して、インターフェースを取得します。
    LoadXFile() で虎のモデルを入力します。
    Sprite を生成します。
    画面のサイズに合わせて背景画像を入力します。
        HRESULT InitGraphics(HWND hWnd)
        {   HRESULT  hr;
            RECT     rc;
    
            myd3d= new MyD3D(hWnd);
            myd3d->InitD3D(&g_pDEV);
            //虎のモデル(X File)を入力
            g_Num= myd3d->LoadXFile(XFile,&g_pMesh,&g_pMat,&g_pTex);
            if (g_Num==0)
            {   MessageBox(NULL,XFile,"X-File Open Error",MB_OK);
                return E_FAIL;
            }
            // スプライト生成
            hr = D3DXCreateSprite(g_pDEV, &g_pSprite);
            if (FAILED(hr))
                return DXTRACE_ERR("InitDXGraphics D3DXCreateSprite", hr);
            // テクスチャの読み込み
            GetClientRect(g_hWnd,&rc);
            g_pTexture= myd3d->LoadTexture(ImgFile,rc);
            return S_OK;
        }
        
  4. Sprite で背景を表示して、虎のモデルを描画します。
    BeginScene() でシーンの開始を設定します。
    g_pSprite->Draw() で Sprite を描画します。
    &D3DXVECTOR3(0,0,1) が Sprite の座標と Zbuffer の深さで、1が設定されていることに注目して下さい。
    1は Zbuffer の一番奥を意味します。0にすると3Dモデルが Sprite の奥に隠れます。
    SetupMatrices() は描画環境を設定する関数です。
    g_pMat[] と g_pTex[] と g_pMesh->DrawSubset() で虎を描画します。
    EndScene() でシーンの処理を終了します。
    Present() で作成したシーンを描画します。
        VOID Render()
        {
            //Clear the backbuffer and the zbuffer
            g_pDEV->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,255),1.0f,0);
            if (SUCCEEDED(g_pDEV->BeginScene()))
            {   //スプライトの描画
                g_pSprite->Begin(0);
                g_pSprite->Draw(g_pTexture,NULL,NULL,&D3DXVECTOR3(0,0,1),0x00a0a0a0);
                g_pSprite->End();
                //虎のメッシュを描画
                SetupMatrices();
                for(DWORD i=0; i<g_Num; i++)
                {   g_pDEV->SetMaterial(&g_pMat[i]);
                    g_pDEV->SetTexture(0,g_pTex[i]);
                    g_pMesh->DrawSubset(i);     // Draw the mesh subset
                }
                g_pDEV->EndScene();
            }
            g_pDEV->Present(NULL,NULL,NULL,NULL);
        }
        
  5. 描画環境を設定する関数です。
    GetClientRect() で Window Size を取得して虎のモデルのアスペクト比を保ちます。
    ワールド座標をY軸を中心にして回転します。
    SetMaterial() でマテリアルを設定します。
    SetLight() でライトを設定します。
    D3DRS_AMBIENT で画面全体の明るさを設定します。
        VOID  SetupMatrices()
        {   RECT        rect;
            D3DXMATRIX  matView;
            D3DXMATRIX  matProj;
            D3DXMATRIX  matWorld;
    
            GetClientRect(g_hWnd,&rect);
            //World 座標をY軸を中心に自動回転
            D3DXMatrixRotationY(&matWorld,timeGetTime()/1000.0f);
            g_pDEV->SetTransform(D3DTS_WORLD,&matWorld);
            //View 座標の設定
            D3DXMatrixLookAtLH(&matView,&D3DXVECTOR3(0.0f,3.0f,-5.0f), 
                               &D3DXVECTOR3(0.0f,0.0f,0.0f),&D3DXVECTOR3(0.0f,1.0f,0.0f));
            g_pDEV->SetTransform(D3DTS_VIEW,&matView);
            //透視変換の設定
            D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,
                      (float)rect.right/(float)rect.bottom,1.0f,1000.0f);
            g_pDEV->SetTransform(D3DTS_PROJECTION,&matProj);
            myd3d->SetMaterial();
            myd3d->SetLight();
            g_pDEV->SetRenderState(D3DRS_AMBIENT,0x00FFFFFF);
        }
        
  6. 使用したオブジェクトと領域は終了する前に開放して下さい。
        VOID Cleanup()
        {
            SAFE_RELEASE(g_pSprite);
            SAFE_RELEASE(g_pTexture);
            SAFE_DELETE(g_pMat);
            if (g_pTex)
            {   for(DWORD i=0; i<g_Num; i++)   SAFE_RELEASE(g_pTex[i]);
                SAFE_DELETE(g_pTex);
            }
            SAFE_RELEASE(g_pMesh);
            SAFE_DELETE(myd3d);
        }
        

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

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

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

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