Mesh の頂点座標を変更する

メッシュ(トーラスと円錐)のX座標を myd3d->Move_Mesh で左右にずらして横に並べて表示します。
トーラスと円錐のマテリアルの設定を変えて、黄と赤で表示してみました。

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

プログラムの説明

  1. D3DXCreateTorus() などで生成したメッシュは D3DFVF_XYZ | D3DFVF_NORMAL になっています。
    D3DXVECTOR3 は、三次元空間ベクトルで float x,y,z; の要素が定義されています。
    D3DVERTEX は MyD3D.h の中で定義されているのでソースプログラムには書かれていません。
        #include    "MyD3D.h"
    
        #define D3DFVF_VERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)
        typedef struct
        {   D3DXVECTOR3 position; // The 3D position for the vertex
            D3DXVECTOR3 normal;   // The surface normal for the vertex
        }   D3DVERTEX;
        
  2. myd3d が MyD3D Object Class の定義です。
    g_pMesh1 がトーラスのメッシュで、g_pMesh2 が円錐のメッシュです。
        //DirectX オブジェクト
        MyD3D                   *myd3d   = NULL;    // MyD3D Object Class
        LPDIRECT3DDEVICE9       g_pDEV   = NULL;
        LPD3DXMESH              g_pMesh1 = NULL;
        LPD3DXMESH              g_pMesh2 = NULL;
        HWND                    g_hWnd;
        
  3. MyD3D Object Class をインスタンス化して、インターフェースを取得します。
    トーラスメッシュを生成して Move_Mesh() でX座標を 1.0 ずらします。
    円錐メッシュを生成して Move_Mesh() でX座標を -1.0 ずらします。
        HRESULT InitDevices(void)
        {
            myd3d= new MyD3D(g_hWnd);
            myd3d->InitD3D(&g_pDEV);
            //トーラスメッシュの生成
            D3DXCreateTorus(g_pDEV,0.3f,0.8f,32,32,&g_pMesh1,NULL);
            myd3d->Move_Mesh(g_pMesh1, D3DXVECTOR3(1,0,0));
            //円錐メッシュの生成
            D3DXCreateCylinder(g_pDEV,0,1,2.0f,32,32,&g_pMesh2,NULL);
            myd3d->Move_Mesh(g_pMesh2, D3DXVECTOR3(-1,0,0));
            return  S_OK;
        }
        
  4. トーラスメッシュと円錐メッシュの色を変えて描画します。
    SetMaterial(1.0f, 1.0f, 0.0f) でマテリアルを黄色に設定してトーラスを描画します。
    次に SetMaterial(1.0f, 0.0f, 0.0f) でマテリアルを赤色に変えて円錐を描画します。
        void Draw(void)
        {
            if (!myd3d)     return;
            g_pDEV->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,50,120),1.0f,0);
            //描画の開始
            g_pDEV->BeginScene();
            //描画環境の設定
            SetupMatrices();
            myd3d->SetMaterial(1.0f, 1.0f, 0.0f);
            g_pMesh1->DrawSubset(0);
            myd3d->SetMaterial(1.0f, 0.0f, 0.0f);
            g_pMesh2->DrawSubset(0);
            g_pDEV->EndScene();
            g_pDEV->Present(NULL,NULL,NULL,NULL);
        }
        
  5. 描画環境の設定です。
    World 座標をY軸を中心にして、取得した時刻で自動的に回転します。
        void  SetupMatrices(void)
        {   RECT            rect;
            D3DXMATRIX      matWorld;
            D3DXMATRIX      matView;
            D3DXMATRIX      matProj;
    
            GetClientRect(g_hWnd,&rect);
            //World 座標を時刻を元に自動回転
            D3DXMatrixRotationY(&matWorld,timeGetTime()/1000.0f);
            g_pDEV->SetTransform(D3DTS_WORLD,&matWorld);
            //透視変換の設定
            D3DXMatrixLookAtLH(&matView,&D3DXVECTOR3(0,0,-5),&D3DXVECTOR3(0,0,0),&D3DXVECTOR3(0,1,0));
            g_pDEV->SetTransform(D3DTS_VIEW,&matView);
            D3DXMatrixPerspectiveFovLH(&matProj,D3DXToRadian(45.0f),(float)rect.right/(float)rect.bottom,1,100);
            g_pDEV->SetTransform(D3DTS_PROJECTION,&matProj);
            myd3d->SetLight();
        }
        

【課題】

MyD3D Object Class を使わずにプログラムを作成して下さい。

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード
Object Class を使わずにプログラムを作成します。
全ソースコード

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

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

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