コーンのモデルを回転しながら描画する

コーンのモデルを光源で照らして回転しながら描画します。

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

プロジェクトの説明

  1. Common のフォルダーと相対的な位置関係にある場所に、フォルダーを作成して下さい。
    詳細は TEXT を表示する を参照して下さい。
    プロジェクトのフォルダーに Cone.x を格納して下さい。
    Cone.x は X-FILE(Cone.x) を参照して頂点データを定義する から取得することが出来ます。
  2. g_Mesh が Cone Mesh の定義です。
    g_Camera はカメラの Object 定義です。
    g_matObj には回転座標を設定します。
    Mesh_File[MAX_PATH] が入力するメッシュファイルの名前です。
    CALLBACK 関数は、アプリケーションで必要な関数だけを宣言しています。
        /************************************************************/
        /*  Mesh を Lighting して、回転しながら描画する    前田 稔  */
        /************************************************************/
        #include "dxstdafx.h"
        #include <commdlg.h>
        #include "resource.h"
    
        // Global variables
        CDXUTMesh           g_Mesh;                 // Cone Mesh
        CFirstPersonCamera  g_Camera;               // A model viewing camera
        D3DXMATRIXA16       g_matObj;               // World Matrix
        WCHAR               Mesh_File[MAX_PATH]= L"cone.x";
    
        // Forward declarations 
        HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext );
        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 );
        void    CALLBACK OnDestroyDevice( void* pUserContext );
        
  3. WinMain で CALLBACK 関数を設定します。
    DXUTMainLoop() でメッセージループに入ります。
  4. DirectX の主要な処理は CALLBACK 関数で行います。
    OnCreateDevice() で cone.x を入力してメッシュを生成します。
        HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
        {
            HRESULT hr;
    
            V_RETURN(g_Mesh.Create(pd3dDevice, Mesh_File));
    
            return S_OK;
        }
        
  5. OnResetDevice() で描画環境の設定を行います。
    cone mesh のレンダリングでは、光源を設定してモデルを照らします。
    テクスチャは使用していないので、SetTextureStageState の設定は不要です。
        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 );
    
            g_Mesh.RestoreDeviceObjects( pd3dDevice );
    
            return S_OK;
        }
        
  6. OnFrameMove() でワールド座標(g_matObj)をY軸を中心にして自動的に回転します。
        void CALLBACK OnFrameMove( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
        {
            D3DXVECTOR3 vAxis(0.0f,1.0f,0.0f);
            D3DXMatrixRotationAxis( &g_matObj, &vAxis, (float)fTime );
        }
        
  7. Rendering を行う CALLBACK 関数です。
    View 座標と Proj を設定して、WORLD 座標を回転しながら描画します。
        void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
        {
            HRESULT hr;
    
            D3DXMATRIXA16 matView = *g_Camera.GetViewMatrix();
            D3DXMATRIXA16 matProj = *g_Camera.GetProjMatrix();
    
            pd3dDevice->SetTransform( D3DTS_VIEW,       &matView );
            pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
    
            // Clear the viewport
            pd3dDevice->Clear( 0L, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00004060, 1.0f, 0L );
    
            // Begin the scene 
            if( SUCCEEDED( pd3dDevice->BeginScene() ) )
            {
                pd3dDevice->SetTransform( D3DTS_WORLD, &g_matObj );
                V( g_Mesh.Render( pd3dDevice ) );
                DXUT_EndPerfEvent(); // end of demonstration code
    
                // End the scene
                pd3dDevice->EndScene();
            }
        }
        
  8. OnLostDevice() で Cone のメッシュを無効にします。
        void CALLBACK OnLostDevice( void* pUserContext )
        {
            g_Mesh.InvalidateDeviceObjects();
        }
        
  9. OnDestroyDevice() で Cone のメッシュを開放します。
        void CALLBACK OnDestroyDevice( void* pUserContext )
        {
            g_Mesh.Destroy();
        }
        

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

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

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