Object のサイズと描画のサイズ

Object のサイズと描画のサイズは別物で、1ミリ以下のものから数キロメートルを超えるものまで 画面全体に同じように描画することができます。
DirectX の D3DXMatrixLookAtLH と D3DXMatrixPerspectiveFovLH が関係します。

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

プログラムの説明

  1. 4面体の頂点座標(X,Y,Z)と頂点の色を定義しています。
    隣り合った三角形の一辺がつながるように頂点を定義(TRIANGLESTRIP)しています。
    前回と違いサイズが一桁小さくなっています。
    モデルを画面全体に大きく描画して下さい。
          //頂点フォーマット
          #define D3DFVF_VERTEX  (D3DFVF_XYZ | D3DFVF_DIFFUSE)
          typedef struct _D3DLVERTEX_
          {   float   x,y,z;
              DWORD   color;
          }   D3DVERTEXCOR;
    
          //四面体の定義
          D3DVERTEXCOR vtx[6]=
          { { -0.5,    0,       0.5,      0xff0000ff  },   //青の頂点
            {  0.5,    0,       0.5,      0xffff0000  },   //赤の頂点
            {  0,      0.816f,  0.211f,   0xffffffff  },   //白の頂点
            {  0,      0,      -0.366f,   0xff00ff00  },   //緑の頂点
            { -0.5,    0,       0.5,      0xff0000ff  },   //青の頂点
            {  0.5,    0,       0.5,      0xffff0000  }    //赤の頂点
          };
          
  2. 4面体の頂点座標(X,Y,Z)と頂点の色を定義しています。
    隣り合った三角形の一辺がつながるように頂点を定義(TRIANGLESTRIP)しています。
    前回と違いサイズが二桁大きくなっています。
    モデルを画面全体に収まるように描画して下さい。
          //頂点フォーマット
          #define D3DFVF_VERTEX  (D3DFVF_XYZ | D3DFVF_DIFFUSE)
          typedef struct _D3DLVERTEX_
          {   float   x,y,z;
              DWORD   color;
          }   D3DVERTEXCOR;
    
          //四面体の定義
          D3DVERTEXCOR vtx[6]=
          { { -500,      0,      500,      0xff0000ff  },   //青の頂点
            {  500,      0,      500,      0xffff0000  },   //赤の頂点
            {    0,    816,      211,      0xffffffff  },   //白の頂点
            {    0,      0,     -366,      0xff00ff00  },   //緑の頂点
            { -500,      0,      500,      0xff0000ff  },   //青の頂点
            {  500,      0,      500,      0xffff0000  }    //赤の頂点
          };
          
  3. モデルのサイズが変わると「どこをどう設定しなければならない」のでしょう。
    ヒントは 4面体を回転しながら描画する を参照して下さい。
  4. モデルの中心座標は (0,0,0) に設定するのが普通なのですが、中心をずらすとどうなるのでしょう。
    下記に定義した四面体を画面の中央に描画して下さい。
    中央に描画する方法には、カメラの座標を変える方法と、注視点を変える方法と、Object の座標を変える 方法などがあります。
          //頂点フォーマット
          #define D3DFVF_VERTEX  (D3DFVF_XYZ | D3DFVF_DIFFUSE)
          typedef struct _D3DLVERTEX_
          {   float   x,y,z;
              DWORD   color;
          }   D3DVERTEXCOR;
    
          //四面体の定義
          D3DVERTEXCOR vtx[6]=
          { {    0,      0,      500,      0xff0000ff  },   //青の頂点
            { 1000,      0,      500,      0xffff0000  },   //赤の頂点
            {  500,    816,      211,      0xffffffff  },   //白の頂点
            {  500,      0,     -366,      0xff00ff00  },   //緑の頂点
            {    0,      0,      500,      0xff0000ff  },   //青の頂点
            { 1000,      0,      500,      0xffff0000  }    //赤の頂点
          };
          
  5. このままではウインドウのアスペクト比(縦横比)が変わるとモデルの形も変わります。
    そこでウインドウのアスペクト比が変わってもモデルの形が変わらないように設定してみましょう。
    ウインドウを縦長,横長にして、モデルの形が変わらないことを確認して下さい。
        RECT            rect;
    
        GetClientRect(g_hWnd,&rect);
        //透視変換の設定
        D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,(float)rect.right/(float)rect.bottom,1,100);
        

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

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