頂点座標の Index を使って BOX を描画する

DrawIndexedPrimitiveUP() で頂点座標の Index を使って BOX を描画します。
DirectX10 のプログラムは 立方体を回転しながら描画する に掲載しています。

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

プログラムの説明

  1. 長方体を DrawPrimitiveUP() で描画すると同じ座標を何度も定義しなければなりません。
    長方体を構成する8個の頂点座標を定義して、描画するときには頂点座標の Index を指定する方法があります。
  2. 8個の頂点座標の定義です。
    三次元座標では左下を基点にして、座標が大きくなる方向は「右(X座標), 上(Y座標), 奥(Z座標)」です。
    ウインドウや画像の座標とは異なるので注意して下さい。
    //頂点フォーマット
    #define D3DFVF_VERTEX  (D3DFVF_XYZ | D3DFVF_DIFFUSE)
    typedef struct _D3DVERTEXCOR_
    {   float   x,y,z;
        DWORD   color;
    }   D3DVERTEXCOR;
    
    //頂点座標の定義
    D3DVERTEXCOR vtx[]=
    { { -5,  5, -5, 0xffffffff  },  //前上左白
      {  5,  5, -5, 0xffffff00  },  //前上右黄
      { -5, -5, -5, 0xffff00ff  },  //前下左紫
      {  5, -5, -5, 0xffff0000  },  //前下右赤
      {  5,  5,  5, 0xff00ffff  },  //奥上右水
      { -5,  5,  5, 0xff00ff00  },  //奥上左緑
      {  5, -5,  5, 0xff0000ff  },  //奥下右青
      { -5, -5,  5, 0xff000000  },  //奥下左黒
    };
    
  3. D3DPT_TRIANGLELIST で三角形を組み合わせて長方体を描画するための Index の定義です。
    0,1,2 と 1,3,2 の三角形を組み合わせて矩形を定義します。
    三角形ポリゴンの座標は時計まわりに指定して下さい。
    長方体は6個の面(12個の三角形)で構成されます。
    //頂点座標の Index
    DWORD   idx[]=
    {  0,1,2, 1,3,2,  1,4,3, 4,6,3,  4,5,6, 5,7,6,  5,0,7, 0,2,7,  5,4,0, 4,1,0,  2,3,7, 3,6,7 };
    
  4. Draw() 関数では DrawIndexedPrimitiveUP() を使います。
    引数 説明
    D3DPT_TRIANGLELIST TRIANGLELIST で三角形を描画
    0 idx の開始位置
    8 Index の最大値(値の制限)
    12 描画する三角形の個数
    &idx Index の領域
    D3DFMT_INDEX32 Index のタイプ(サイズ)
    &vtx 頂点座標が定義されている領域
    sizeof(_D3DVERTEXCOR_) 頂点定義のサイズ
    void Draw(void)
    {
        if (!g_pD3D || !g_pDEV)     return;
        //黒で塗りつぶして消去
        g_pDEV->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0,0);
        //描画の開始
        g_pDEV->BeginScene();
        //描画環境の設定
        SetupMatrices();
        //デバイスに使用する頂点フォーマットをセットする
        g_pDEV->SetFVF(D3DFVF_VERTEX);
        //ストリームを使わないで直接データを渡して描画する
        g_pDEV->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST,0,8,12,&idx,D3DFMT_INDEX32,&vtx,sizeof(_D3DVERTEXCOR_));
        g_pDEV->EndScene();
        g_pDEV->Present(NULL,NULL,NULL,NULL);
    }
    
  5. 立方体のモデルなので、画面サイズも 600*600 に設定しています。
    CW_USEDEFAULT,CW_USEDEFAULT,600,600,

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

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

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