Sample Brower でティーポットを描画

Sample Brower で生成したプロジェクトでティーポットを描画します。

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

プログラムの説明

  1. DirectX のプロジェクトは Sample Brower を使って生成する方法がお勧めです。
    Sample Brower から提供されるサンプルは、何も手を加えなくてもそのまま実行できます。
    Tiny のアニメーション などはその例です。
    ここでは Sample Brower を使ってティーポットのメッシュを描画する方法を説明します。
  2. [スタート] から [プログラム][Microsoft DirectX] を選択して [DirectX Sample Browser] を実行して下さい。
    「SimpleSample」の「Install Project」をクリックすると、自動的に空のプロジェクトが構築されます。
    作成されたプロジェクトをそのままコンパイルして、空のウインドウが表示される事を確かめて下さい。
    エラーが発生するときや、正常に実行出来ないときは、残念ながら現在の構成は相性が悪いようです。
    詳細は「Tiny のアニメーション」を参照して下さい。
  3. 生成された SimpleSample から、次のファイルを残して削除して下さい。
    ・DXUT のフォルダー
    ・resource.h 削除可能
    ・SimpleSample.rc 削除可能
    ・SimpleSample_2010.sln
    ・SimpleSample_2010.vcproj
    次に下記のファイルを格納して下さい。
    ファイル名 説明
    SimpleSample.cpp ティーポットを描画
  4. SimpleSample_2010.vcproj から起動して下さい。
    メッシュの描画は 球をライトで照らして View 座標を回転する などを参考にして下さい。
    リソースは使っていないので、次のファイルはプロジェクトから削除することが出来ます。
    ・resource.h
    ・SimpleSample.rc
  5. C# でも同様のプログラムを作成しています。
    超初心者のプログラム入門(C#)から Sample Brower でティーポットを描画 を参照して下さい。
    リンクがエラーになるときは「前田稔の超初心者のプログラム入門」から辿って下さい。

プログラムの説明

  1. グローバル領域です。
    g_Camera; はモデルを映し出すカメラです。
    g_pMesh はティーポットのメッシュです。
    material で描画環境を設定します。
    light はモデルを照らすライトです。
    // Global variables
    CModelViewerCamera          g_Camera;
    LPD3DXMESH                  g_pMesh = NULL;
    D3DMATERIAL9                material;
    D3DLIGHT9                   light;
    
  2. OnCreateDevice() でティーポットのメッシュを生成して、カメラの座標と注視点を設定します。
    HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc,
                                     void* pUserContext )
    {
        // Load the mesh
        D3DXCreateTeapot(pd3dDevice, &g_pMesh, NULL);
    
        // Setup the camera's view parameters
        D3DXVECTOR3 vecEye( 0.0f, 0.0f, -5.0f );
        D3DXVECTOR3 vecAt ( 0.0f, 0.0f, 0.0f );
        g_Camera.SetViewParams( &vecEye, &vecAt );
    
        return S_OK;
    }
    
  3. OnResetDevice() でプロジェクションとマテリアルとライトを設定します。
    HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice,
            const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
    {
        pd3dDevice->SetRenderState(D3DRS_AMBIENT,0x00080808);
        float fAspectRatio = pBackBufferSurfaceDesc->Width / ( FLOAT )pBackBufferSurfaceDesc->Height;
        g_Camera.SetProjParams( D3DX_PI/4, fAspectRatio, 0.1f, 1000.0f );
        g_Camera.SetWindow( pBackBufferSurfaceDesc->Width, pBackBufferSurfaceDesc->Height );
    
        //マテリアルの設定
        material.Diffuse.r= material.Diffuse.g= material.Diffuse.b= 1.0f;
        material.Diffuse.b= 0.2;
        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;
        pd3dDevice->SetMaterial(&material);
    
        //光源の作成
        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(1,-3,5);
        pd3dDevice->SetLight(0,&light);
        pd3dDevice->LightEnable(0,TRUE);
    
        return S_OK;
    }
    
  4. OnFrameRender() でティーポットのメッシュを描画します。
    void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
    {
        HRESULT hr;
        pd3dDevice->SetTransform(D3DTS_WORLD, &(*g_Camera.GetWorldMatrix()));
        pd3dDevice->SetTransform(D3DTS_VIEW, &(*g_Camera.GetViewMatrix()));
        pd3dDevice->SetTransform(D3DTS_PROJECTION, &(*g_Camera.GetProjMatrix()));
    
        // Clear the render target and the zbuffer 
        V( pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB( 0, 45, 50, 70 ), 1.0f, 0 ) );
    
        // Render the scene
        if( SUCCEEDED( pd3dDevice->BeginScene() ) )
        {
            g_pMesh->DrawSubset(0);
            V( pd3dDevice->EndScene() );
        }
    }
    
  5. ティーポットをマウスの操作で回転します。
    マウスをキャプチャーしてモデルを回転するプログラムは結構面倒なのですが、CModelViewerCamera を使うと全て面倒を見てくれます。
    ※マウスの左ボタンで g_Camera.WorldMatrix が回転します。
    ※マウスの右ボタンで g_Camera.ViewMatrix が回転します。
    LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing,
                              void* pUserContext )
    {
        // Pass all remaining windows messages to camera so it can respond to user input
        g_Camera.HandleMessages( hWnd, uMsg, wParam, lParam );
    
        return 0;
    }
    
    OnFrameMove() で g_Camera.FrameMove(fElapsedTime); を呼び出して下さい。
    void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext )
    {
        // Update the camera's position based on user input 
        g_Camera.FrameMove( fElapsedTime );
    }
    
  6. モデルの回転には Camera を使う方法と ArcBall を使う方法があります。
    超初心者のプログラム入門(DirectX10)から ティーポットを ArcBall で操作ティーポットを Camera で操作 を参照して下さい。
    C# でもティーポットを描画するプログラムを作成しています。
    超初心者のプログラム入門(C#)から Sample Brower でティーポットを描画 を参照して下さい。
    リンクがエラーになるときは「前田稔の超初心者のプログラム入門」から辿って下さい。

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

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