虎のモデルを描画する

テクスチャを貼り付けた虎のモデルを回転しながら描画します。

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

プログラムの説明

  1. マテリアルを設定して、虎のモデルを描画するでは MyD3D Class を使いましたが、今回は使わずにプログラムします。
    虎のモデルを描画するソースプログラム Main.cpp と虎のモデルです。
    虎のモデルは DirectX をインストールしたサンプルフォルダーに格納されています。
    ファイル名 説明
    Main.cpp 虎のモデルを描画
    Tiger.x 虎の3Dモデル
    Tiger.bmp Tiger.x のテクスチャ
  2. 空のプロジェクトを作成して Main.cpp をプロジェクトに取り込んで下さい。
    プロジェクトの作成は ティーポットを描画する を参照して下さい。
    文字セットに[マルチバイト文字セットを使用する]を選択して下さい。
    Tiger.x と Tiger.bmp は "C:\DATA\Model" のフォルダーに格納して下さい。
    別のフォルダーに格納するときは、次の行を修正して下さい。
    SetCurrentDirectory("C:\\DATA\\Model");
    SetCurrentDirectory() でモデルが格納されているフォルダーをカレントディレクトリに設定します。
  3. D3DXLoadMeshFromX() で tiger.x をロードします。
        hr  = D3DXLoadMeshFromX("tiger.x", D3DXMESH_SYSTEMMEM, g_pD3DDevice,
            NULL, &pD3DXMtrlBuffer, NULL, &g_dwNumMaterials, &g_pMesh);
        
  4. tiger.x のマテリアル情報を入力します。
        D3DXMATERIAL*   d3dxMaterials;
        d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
        g_pMeshMaterials= new D3DMATERIAL9[g_dwNumMaterials];
        g_pMeshTextures = new LPDIRECT3DTEXTURE9[g_dwNumMaterials];
    
        // 各マテリアル情報を保存
        for (int i = 0; i < (int)g_dwNumMaterials; i++)
        {   g_pMeshMaterials[i]= d3dxMaterials[i].MatD3D;
            g_pMeshMaterials[i].Ambient= g_pMeshMaterials[i].Diffuse;
            // テクスチャの読み込み
            hr  = D3DXCreateTextureFromFile(g_pD3DDevice, d3dxMaterials[i].pTextureFilename, &g_pMeshTextures[i]);
            if (FAILED(hr)) g_pMeshTextures[i]= NULL;   // テクスチャ無し
        }
        
  5. tiger.x には法線ベクトルが設定されていないので、そのまま描画すると真っ黒になります。
    法線ベクトルが設定されていないときに設定するコードです。
        // 法線ベクトルが設定されていないときはプログラムで設定する
        if (!( g_pMesh->GetFVF() & D3DFVF_NORMAL ))
        {   // 法線ベクトルを持つ新しいメッシュを作成
            LPD3DXMESH  pNewMesh;
            hr= g_pMesh->CloneMeshFVF(g_pMesh->GetOptions(), g_pMesh->GetFVF() | D3DFVF_NORMAL, g_pD3DDevice, &pNewMesh);
            if (FAILED(hr))     return hr;
    
            // 各頂点の法線ベクトルを計算
            hr  = D3DXComputeNormals(pNewMesh, NULL);
            if (FAILED(hr)) return hr;
            SAFE_RELEASE(g_pMesh);
            g_pMesh = pNewMesh;
        }
        
  6. 今回は View 座標をY軸を中心に回転しながら描画してみました。
    裏から見た時、虎のモデルが薄暗くなるのを確かめて下さい。
        //View 座標の回転
        D3DXMatrixRotationY(&w,timeGetTime()/1000.0f);
        //D3DXMatrixRotationX(&w,timeGetTime()/1000.0f);
        D3DXMatrixTranslation(&matView,0,0,4.0f);
        matView= w*matView;
        g_pD3DDevice->SetTransform(D3DTS_VIEW,&matView);
        
  7. 後はティーポットなどの描画と同じ要領です。

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

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