ティーポットを回転しながら描画する

August2007 DirectX9 の Template を使ってティーポットを回転しながら描画します。

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

プロジェクトの作成

  1. Template のプロジェクトをコピーして、フォルダーの名前を Teapot に変更して下さい。
    Template の作成は August 2007 DirectX9 の template を作成する を参照して下さい。
  2. g_pMesh は Teapot のメッシュを格納する領域です。
    material はメッシュのマテリアルを設定する領域です。
    light はメッシュを照らすライトを設定する領域です。
    ViewForm はカメラの座標です。
    LPD3DXMESH              g_pMesh = NULL;
    D3DMATERIAL9            material;
    D3DLIGHT9               light;
    D3DXVECTOR3             ViewForm(0.0f,0.0f,5.0f);
    
  3. OnD3D9CreateDevice() で Teapot のメッシュを生成します。
    次にマテリアルと光源を設定します。
    material.Diffuse.b= 0.2f; で青のレベルを下げて Teapot を黄色に設定しています。
    HRESULT CALLBACK OnD3D9CreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
    {
        //ティーポットの生成
        D3DXCreateTeapot(pd3dDevice,&g_pMesh,NULL);
        //初期マテリアルの設定
        material.Diffuse.r= material.Diffuse.g= material.Diffuse.b= 1.0f;
        material.Diffuse.b= 0.2f;
        material.Ambient.r= material.Ambient.g= material.Ambient.b= 0.5f;
        material.Specular.r= material.Specular.g= material.Specular.b= 0.0f;
        material.Emissive.r= material.Emissive.g= material.Emissive.b= 0.0f;
        material.Power= 0;
        //光源の作成
        ZeroMemory(&light,sizeof(D3DLIGHT9));
        light.Type = D3DLIGHT_DIRECTIONAL;
        light.Diffuse.r= light.Diffuse.g= light.Diffuse.b= 1.0f;
        light.Specular.r= light.Specular.g= light.Specular.b= 0.2f;
        light.Ambient.r= light.Ambient.g= light.Ambient.b= 0.5f;
        light.Direction = D3DXVECTOR3(2,-3,-2);
        return S_OK;
    }
    
  4. OnD3D9FrameRender() でメッシュを描画します。
    メッシュの回転とマテリアルと光源の設定は SetupMatrices() 関数で行います。
    void CALLBACK OnD3D9FrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
    {
        HRESULT hr;
    
        // Clear the render target and the zbuffer 
        V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 45, 50, 170), 1.0f, 0) );
    
        // Render the scene
        if( SUCCEEDED( pd3dDevice->BeginScene() ) )
        {
            SetupMatrices(pd3dDevice);
            g_pMesh->DrawSubset(0);
            V( pd3dDevice->EndScene() );
        }
    }
    
  5. メッシュの回転とマテリアルと光源の設定を行う SetupMatrices() 関数です。
    回転の速度は timeGetTime()/1000.0f で調整して下さい。
    VOID SetupMatrices(IDirect3DDevice9* pd3dDevice)
    {
        D3DXMATRIX      matWorld;
        D3DXMATRIX      matView;
        D3DXMATRIX      matProj;
    
        //World 座標をY軸を中心に自動回転
        D3DXMatrixRotationY(&matWorld,timeGetTime()/1000.0f);
        pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);
        //View 座標の設定
        D3DXMatrixLookAtLH(&matView,&ViewForm,
                           &D3DXVECTOR3(0.0f,0.0f,0.0f),&D3DXVECTOR3(0.0f,1.0f,0.0f));
        pd3dDevice->SetTransform(D3DTS_VIEW,&matView);
        //透視変換の設定
        D3DXMatrixPerspectiveFovLH(&matProj,D3DXToRadian(45.0f),640.0f/480.0f,1,50);
        pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj);
        pd3dDevice->SetMaterial(&material);
        // Set miscellaneous render states
        pd3dDevice->SetRenderState(D3DRS_DITHERENABLE,  FALSE);
        pd3dDevice->SetRenderState(D3DRS_SPECULARENABLE,FALSE);
        pd3dDevice->SetRenderState(D3DRS_ZENABLE,       TRUE);
        pd3dDevice->SetRenderState(D3DRS_AMBIENT,       0x000F0F0F);
    
        pd3dDevice->SetLight(0,&light);
        pd3dDevice->LightEnable(0,TRUE);
    }
    
  6. OnD3D9DestroyDevice() でメッシュを開放します。
    void CALLBACK OnD3D9DestroyDevice( void* pUserContext )
    {
        SAFE_RELEASE(g_pMesh);
    }
    
  7. あとは Template で作成したソースコードのままです。
    プログラムは各自で完成させて下さい。

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

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

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