ティーポットを描画する

DirectX でティーポットのメッシュを生成して回転しながら描画します。

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

プロジェクトの説明

  1. Common のフォルダーと相対的な位置関係にある場所に、フォルダーを作成して下さい。
    詳細は TEXT を表示する を参照して下さい。
  2. g_pMesh3D が Teapot Mesh の定義です。
    g_Camera はカメラの Object 定義です。
    g_matObj には回転座標を設定します。
        /*************************************************/
        /*  ティポットを回転しながら描画する    前田 稔  */
        /*************************************************/
        #include "dxstdafx.h"
        #include <commdlg.h>
        #include "resource.h"
    
        // Global variables
        ID3DXMesh*          g_pMesh3D = NULL;       // Teapot Mesh
        CFirstPersonCamera  g_Camera;               // A model viewing camera
        D3DXMATRIXA16       g_matObj;               // World Matrix
        
  3. 関数のプロトタイプ宣言です。
    アプリケーションで必要な CALLBACK 関数だけを宣言しています。
        // Forward declarations 
        HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext );
        void    CALLBACK OnFrameMove( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext );
        void    CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext );
        void    CALLBACK OnLostDevice( void* pUserContext );
        
  4. WinMain で CALLBACK 関数を設定します。
    DXUTMainLoop() でメッセージループに入ります。
  5. DirectX の主要な処理は CALLBACK 関数で行います。
    OnResetDevice() で描画環境の設定とメッシュの生成を行います。
    描画環境の設定ではライトを設定して Teapot を照らします。
        HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice, 
                                        const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
        {
            pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
            pd3dDevice->SetRenderState( D3DRS_DITHERENABLE, TRUE );
            pd3dDevice->SetRenderState( D3DRS_SPECULARENABLE, TRUE );
            pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
            pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0x80808080);
            D3DLIGHT9 light;
            D3DXVECTOR3 vecLightDirUnnormalized(10.0f, -10.0f, 10.0f);
            ZeroMemory( &light, sizeof(D3DLIGHT9) );
            light.Type        = D3DLIGHT_DIRECTIONAL;
            light.Diffuse.r   = 1.0f;
            light.Diffuse.g   = 1.0f;
            light.Diffuse.b   = 1.0f;
            D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecLightDirUnnormalized );
            light.Position.x   = 10.0f;
            light.Position.y   = -10.0f;
            light.Position.z   = 10.0f;
            light.Range        = 1000.0f;
            pd3dDevice->SetLight(0, &light );
            pd3dDevice->LightEnable(0, TRUE);
    
            // Set the transform matrices
            D3DXMATRIXA16  matWorld;
            D3DXMatrixIdentity( &matWorld );
            pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
    
            // Setup the camera with view & projection matrix
            D3DXVECTOR3 vecEye(0.0f, 0.0f, -5.0f);
            D3DXVECTOR3 vecAt (0.0f, 0.0f, 0.0f);
            g_Camera.SetViewParams( &vecEye, &vecAt );
            float fAspectRatio = pBackBufferSurfaceDesc->Width / (FLOAT)pBackBufferSurfaceDesc->Height;
            g_Camera.SetProjParams( D3DX_PI/4, fAspectRatio, 1.0f, 1000.0f );
    
            SAFE_RELEASE( g_pMesh3D );
            //ティーポットの生成
            if (FAILED(D3DXCreateTeapot(pd3dDevice,&g_pMesh3D,NULL)))   return E_FAIL;
    
            return S_OK;
        }
        
  6. フレームの回転設定です。
    D3DXMatrixRotationAxis() でワールド座標を回転します。
        void CALLBACK OnFrameMove( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
        {
            // Setup five rotation matrices (for rotating text strings)
            D3DXVECTOR3 vAxis(0.0f,1.0f,0.0f);
            D3DXMatrixRotationAxis( &g_matObj, &vAxis, (float)fTime );
        }
        
  7. Rendering を行う CALLBACK 関数です。
    View 座標と Proj を設定して、WORLD 座標を回転しながら描画します。
    Clear() で背景色を指定して、D3DMATERIAL9 で Teapot の色を設定します。
        void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
        {
            D3DMATERIAL9 mtrl;
    
            D3DXMATRIXA16 matView = *g_Camera.GetViewMatrix();
            D3DXMATRIXA16 matProj = *g_Camera.GetProjMatrix();
    
            pd3dDevice->SetTransform( D3DTS_VIEW,       &matView );
            pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
    
            pd3dDevice->Clear( 0L, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00004060, 1.0f, 0L );
    
            if( SUCCEEDED( pd3dDevice->BeginScene() ) )
            {
                if( g_pMesh3D != NULL )
                {
                    CDXUTPerfEventGenerator g( DXUT_PERFEVENTCOLOR, L"Demonstration Part 1" );
                    ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) );
                    mtrl.Diffuse.r=mtrl.Diffuse.g=mtrl.Diffuse.b=mtrl.Diffuse.a= 1.0f;
                    mtrl.Ambient.r=mtrl.Ambient.g=mtrl.Ambient.b=mtrl.Ambient.a= 0.5f;
                    mtrl.Diffuse.b=mtrl.Ambient.b= 0.0f;
    
                    pd3dDevice->SetMaterial( &mtrl );
                    pd3dDevice->SetTransform( D3DTS_WORLD, &g_matObj );
                    g_pMesh3D->DrawSubset(0);
                }
                DXUT_EndPerfEvent(); // end of demonstration code
    
                pd3dDevice->EndScene();
            }
        }
        
  8. OnLostDevice() で Teapot のメッシュを開放します。
        void CALLBACK OnLostDevice( void* pUserContext )
        {
            SAFE_RELEASE( g_pMesh3D );
        }
        

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

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

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

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