トーラスとコーンを親子関係で描画する

トーラスがタイマ設定で自動回転し、その回りを逆方向にコーンが回転します。
DirectX の D3DXMatrixTranslation, D3DXMatrixMultiply などの使い方を説明します。

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

プログラムの説明

  1. Global Area の定義です。
    *myd3d が MyD3D Object Class の定義です。
    pMeshApp1 はトーラスのオブジェクトです。
    pMeshApp2 はコーンのオブジェクトです。
    ViewForm は View(カメラ)の座標です。
        //Global Area
        MyD3D                   *myd3d    = NULL;
        HWND                    g_hWnd    = NULL;
        LPDIRECT3DDEVICE9       g_pDEV    = NULL;
        LPD3DXMESH              pMeshApp1 = NULL;
        LPD3DXMESH              pMeshApp2 = NULL;
        bool                    g_bActive = false;
        D3DXVECTOR3             ViewForm(0.0f,0.0f,-10.0f);
        
  2. DirectX Graphics の初期化です。
    D3DXCreateTeapot() でトーラスのメッシュを生成します。
    D3DXCreateCylinder() でコーンのメッシュを生成します。
        HRESULT InitDevices(void)
        {
            myd3d= new MyD3D(g_hWnd);
            myd3d->InitD3D(&g_pDEV);
            //ティーポットのメッシュを生成
            //D3DXCreateTeapot(g_pDEV,&pMeshApp1,NULL);
            //トーラスメッシュの生成
            D3DXCreateTorus(g_pDEV,0.3f,0.8f,32,32,&g_pMesh1,NULL);
            //コーンのメッシュを生成
            D3DXCreateCylinder(g_pDEV,0.7f,0.0f,1.5f,30,30,&pMeshApp2,NULL);
            return  S_OK;
        }
        
  3. メッシュを描画する関数です。
    SetupMatrices() で全体の描画環境を設定します。
    トーラスの描画です。
    1. D3DXMatrixRotationY() でY軸を中心にして World 座標を回転します。
    2. SetTransform() で World 座標を設定します。
    3. myd3d->SetMaterial() でトーラスの Material を設定します。
      ここでトーラスの色が決まります。
    4. pMeshApp1->DrawSubset(0) でトーラスのメッシュを描画します。
    コーンの描画です。
    1. D3DXMatrixRotationY() でトーラスとは逆方向に World 座標を回転します。
    2. D3DXMatrixTranslation(&matX,4.0f,0.0f,0.0f) でコーンのX座標を 4.0f 移動します。
    3. D3DXMatrixMultiply() で回転と移動を掛け合わせた座標を求めます。
      「matWorld= matX*matY;」と書くこともできます。
    4. SetTransform() で World 座標を設定します。
    5. myd3d->SetMaterial() でコーンの Material を設定します。
      ここでコーンの色が決まります。
    6. pMeshApp2->DrawSubset(0) でコーンのメッシュを描画します。
        void Draw(void)
        {    D3DXMATRIX      matWorld,matX,matY;
    
            if (!g_pDEV || !g_bActive)  return;
            g_pDEV->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,150),1.0f,0);
            if (SUCCEEDED(g_pDEV->BeginScene()))
            {   //描画環境の設定
                SetupMatrices();
                //トーラスの描画
                D3DXMatrixRotationY(&matWorld,timeGetTime()/4000.0f);
                g_pDEV->SetTransform(D3DTS_WORLD,&matWorld);
                myd3d->SetMaterial(1.0f,0.8f,0.4f);
                pMeshApp1->DrawSubset(0);
                //コーンの描画
                D3DXMatrixRotationY(&matY,0-(timeGetTime()/1200.0f));
                D3DXMatrixTranslation(&matX,4.0f,0.0f,0.0f);
                D3DXMatrixMultiply(&matWorld,&matX,&matY);
                //matWorld= matX*matY;
                g_pDEV->SetTransform(D3DTS_WORLD,&matWorld);
                myd3d->SetMaterial(0.5f,1.0f,0.4f);
                pMeshApp2->DrawSubset(0);
                g_pDEV->EndScene();
            }
            g_pDEV->Present(NULL,NULL,NULL,NULL);
        }
        
  4. 描画環境を設定する関数です。
    ここでは、トーラスとコーンに共通の描画環境を設定します。
    D3DXMatrixLookAtLH() で View 座標を計算して SetTransform() で設定します。
    D3DXMatrixPerspectiveFovLH() で透視変換の設定をします。
    g_pDEV->SetRenderState(D3DRS_AMBIENT,0x00808080) は環境光の設定です。
        void  SetupMatrices(void)
        {   RECT            rect;
            D3DXMATRIX      matView;
            D3DXMATRIX      matProj;
    
            GetClientRect(g_hWnd,&rect);
            //View 座標の設定
            D3DXMatrixLookAtLH(&matView,&ViewForm,
                               &D3DXVECTOR3(0.0f,0.0f,0.0f),&D3DXVECTOR3(0.0f,1.0f,0.0f));
            g_pDEV->SetTransform(D3DTS_VIEW,&matView);
            //透視変換の設定
            D3DXMatrixPerspectiveFovLH(&matProj,D3DXToRadian(45.0f),(float)rect.right/(float)rect.bottom,1,50);
            g_pDEV->SetTransform(D3DTS_PROJECTION,&matProj);
            g_pDEV->SetRenderState(D3DRS_AMBIENT,0x00808080);
            myd3d->SetLight();
        }
        
  5. その他の関数は MyD3D Class でティーポットを描画する と同じです。

【課題】

  1. モデルの色を変えて描画してみましょう。
  2. ティーポットとコーンとトーラスに親子孫の関係を設定して描画して下さい。

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

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

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