ティーポットとコーンとトーラスを親子孫で回転する

ティーポットを中心にしてコーンが回転し、その周囲をトーラスが周ります。
DirectX の座標変換と、マテリアルの設定とオブジェクトのレンダリングの関係を説明します。

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

プログラムの説明

  1. #define と #include と Direct3D の領域です。
    myd3d は MyD3D Object Class の定義です。
    pMeshApp1 はティーポットのメッシュです。
    pMeshApp2 はコーンのメッシュです。
    pMeshApp3 はトーラスのメッシュです。
    ViewForm は View の座標です。
        #define     NAME        "Model 3"
        #include    "MyD3D.h"
    
        //Global Area
        MyD3D                   *myd3d    = NULL;
        HWND                    g_hWnd    = NULL;
        LPDIRECT3DDEVICE9       g_pDEV    = NULL;
        LPD3DXMESH              pMeshApp1 = NULL;
        LPD3DXMESH              pMeshApp2 = NULL;
        LPD3DXMESH              pMeshApp3 = NULL;
        bool                    g_bActive = false;
        D3DXVECTOR3             ViewForm(0.0f,0.0f,-10.0f);
        
  2. InitDevices() 関数です。
    MyD3D Object Class をインスタンス化して、インターフェースを取得します。
    D3DXCreateTeapot() でティーポットのメッシュを生成します。
    D3DXCreateCylinder() でコーンのメッシュを生成します。
    D3DXCreateTorus() でトーラスメッシュを生成します。
    ティーポットのメッシュが思ったより小さかったので、これに合わせてサイズを設定しています。
        HRESULT InitDevices(void)
        {
            myd3d= new MyD3D(g_hWnd);
            myd3d->InitD3D(&g_pDEV);
            //ティーポットのメッシュを生成
            D3DXCreateTeapot(g_pDEV,&pMeshApp1,NULL);
            //コーンのメッシュを生成
            D3DXCreateCylinder(g_pDEV,0.7f,0.0f,1.5f,30,30,&pMeshApp2,NULL);
            //トーラスのメッシュを生成
            D3DXCreateTorus(g_pDEV,0.15f,0.3f,32,32,&pMeshApp3,NULL);
            return  S_OK;
        }
        
  3. メッシュを描画する関数です。
    Clear() で画面をクリアします。
    BeginScene() でシーンの開始を設定します。
    SetupMatrices() は描画環境全体を設定する関数です。
    1. 最初にティーポットを描画します。
      World 座標をY軸を中心に自動回転します。
      SetTransform() で D3DTS_WORLD を設定します。
      SetMaterial() でマテリアルの黄色を強調します。
      pMeshApp1->DrawSubset() でメッシュを描画します。
    2. 次にコーンを描画します。
      World 座標をY軸を中心にしてティーポットと逆方向に回転します。
      D3DXMatrixTranslation() でX座標を 4.0 移動します。
      移動座標と回転座標を掛け合わせます。
      マトリックスの乗算では、順序が違うと乗算結果も変わります。
      SetTransform() で D3DTS_WORLD を設定します。
      SetMaterial() でマテリアルの緑色を強調します。
      pMeshApp2->DrawSubset() でメッシュを描画します。
    3. 最後にトーラスを描画します。
      コーンのX軸座標を中心にして自動回転します。
      D3DXMatrixTranslation() でY座標を 1.5 移動します。
      移動座標と回転座標とコーンの座標を掛け合わせます。
      SetTransform() で D3DTS_WORLD を設定します。
      SetMaterial() でマテリアルの赤色を強調します。
      pMeshApp3->DrawSubset() でメッシュを描画します。
        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);
                //トーラスの描画
                D3DXMatrixRotationX(&matY,0-(timeGetTime()/600.0f));
                D3DXMatrixTranslation(&matX,0.0f,1.5f,0.0f);
                matWorld= matX*matY*matWorld;
                g_pDEV->SetTransform(D3DTS_WORLD,&matWorld);
                myd3d->SetMaterial(1.0f,0.3f,0.4f);
                pMeshApp3->DrawSubset(0);
                g_pDEV->EndScene();
            }
            g_pDEV->Present(NULL,NULL,NULL,NULL);
        }
        
  4. 描画環境を設定する関数です。
    GetClientRect() で Window Size を取得してアスペクト比を設定してメッシュが変形するのを防ぎます。
    D3DXMatrixLookAtLH() で View 座標を設定します。
    D3DXMatrixPerspectiveFovLH() で透視変換の設定をします。
    myd3d->SetLight() で光源を設定します。
        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();
        }
        

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

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

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

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