LWOのモデルを描画

lwo2dx.exe で LIGHTWAVE で作成した LWO のモデルを直接コンバートして描画します。

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

事前準備

  1. ディ・ストームのホームページにアクセスして、変換プログラムとモデルをダウンロードして下さい。
    devkit25.zip の中に必要なファイル一式が格納されていました。
  2. プロジェクトのフォルダーを作成して、次のファイルを格納して下さい。
    ファイル名説明
    lwo2dx.exeSamples\DirectX に格納されています
    manga2.lwoSamples\data に格納されています
  3. manga2.lwo をXファイルに変換して、描画のテストを行います。
    コマンドプロンプトを起動してプロジェクトのフォルダーに移動して下さい。
    次のコマンドを実行して下さい。
    lwo2dx.exe manga2.lwo
    正常に終了すれば Unnamed.x のファイルが作成されます。
  4. mview.exe を起動して Unnamed.x の描画の確認を行います。
    mview.exe の格納場所は DirectX の Version によって多少異なります。
    C:\DX90SDK\Utilities\mview.exe
    C:\DXSDK\Bin\DXUtils\mview.exe
  5. ページ先頭のモデルが描画出来たら準備完了です。
    Unnamed.x を削除しておいて下さい。

プログラムの説明

  1. #define と #include と Direct3D の領域です。
    myd3d は MyD3D Object Class の定義です。
    ConvtLwo[] で描画する LWO のファイル名を定義します。
        /***************************************************/
        /*  LWO をXファイルに変換して描画する    前田 稔  */
        /***************************************************/
        #define     NAME        "LWO to X"
        #include    "MyD3D.h"
    
        //Global variables
        MyD3D                   *myd3d   = NULL;    // MyD3D Object Class
        HWND                    g_hWnd;
        //Direct3D Area
        LPDIRECT3DDEVICE9       g_pDEV   = NULL;
        LPD3DXMESH              g_pMesh  = NULL;
        D3DMATERIAL9*           g_pMat   = NULL;
        LPDIRECT3DTEXTURE9*     g_pTex   = NULL;
        DWORD                   g_Num    = 0L;
        bool                    g_bActive= false;   // アクティブ状態
        D3DXVECTOR3             ViewForm(0.0f,0.0f,-5.0f);
        char                    ConvtLwo[24]= "lwo2dx.exe manga2.lwo";
        char                    XFile[24]= "Unnamed.x";
        
  2. InitGraphics() 関数です。
    Convt() 関数で LWO をXファイルに変換します。
    MyD3D Object Class をインスタンス化して、インターフェースを取得します。
    LoadXFile() でXファイルを入力します。
        //デバイスモード等の初期化
        HRESULT  InitGraphics(HWND hWnd)
        {
            //LWO をXファイルに変換する
            Convt();
            myd3d= new MyD3D(hWnd);
            myd3d->InitD3D(&g_pDEV);
            //X File を入力
            g_Num= myd3d->LoadXFile(XFile,&g_pMesh,&g_pMat,&g_pTex);
            if (g_Num==0)
            {   MessageBox(NULL,XFile,"X-File Open Error",MB_OK);
                return E_FAIL;
            }
            return S_OK;
        }
        
  3. LWO をXファイルに変換する Convt() 関数です。
        void  Convt()
        {   STARTUPINFO          si;
            PROCESS_INFORMATION  pi;
    
            ZeroMemory(&si,sizeof(STARTUPINFO));
            ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
            si.cb= sizeof(STARTUPINFO);
            si.dwFlags= STARTF_USESHOWWINDOW;
            si.dwFlags= SW_SHOWNORMAL;
            CreateProcess(NULL,ConvtLwo,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
            if (pi.hProcess)
            {   DWORD   dwExitCode= STILL_ACTIVE;
                while(dwExitCode==STILL_ACTIVE)
                {   WaitForSingleObject(pi.hProcess,1000);
                    GetExitCodeProcess(pi.hProcess,&dwExitCode);
                }
            }
        }
        
  4. メッシュを描画する関数です。
    Clear() で描画領域をクリアします。
    SetupMatrices() で描画環境を設定してモデルを描画します。
        VOID Render()
        {
            if (!g_pDEV || !g_bActive)  return;
            //Clear the backbuffer and the zbuffer
            g_pDEV->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,255),1.0f,0);
            if (SUCCEEDED(g_pDEV->BeginScene()))
            {   //描画環境の設定
                SetupMatrices();
                //メッシュを描画
                for(DWORD i=0; i<g_Num; i++)
                {   g_pDEV->SetMaterial(&g_pMat[i]);
                    g_pDEV->SetTexture(0,g_pTex[i]);
                    g_pMesh->DrawSubset(i);     // Draw the mesh subset
                }
                g_pDEV->EndScene();
            }
            g_pDEV->Present(NULL,NULL,NULL,NULL);
        }
        
  5. 描画環境を設定する関数です。
    D3DXMatrixRotationY() でY軸で回転しながら描画します。
    モデルが画面中央に描画されるように D3DXMatrixTranslation() で少し移動しています。
    myd3d->SetMaterial() でマテリアルを設定します。
    myd3d->SetLight() で光源を設定します。
        //描画環境の設定
        VOID  SetupMatrices()
        {   RECT        rect;
            D3DXMATRIX  matView;
            D3DXMATRIX  matProj;
            D3DXMATRIX  matWorld,matX,matY;
    
            GetClientRect(g_hWnd,&rect);
            //World 座標をY軸を中心に自動回転
            D3DXMatrixRotationY(&matY,timeGetTime()/1000.0f);
            D3DXMatrixTranslation(&matX,0.0f,-1.6f,0.0f);
            matWorld= matY*matX;
            g_pDEV->SetTransform(D3DTS_WORLD,&matWorld);
            //View 座標の設定
            D3DXMatrixLookAtLH(&matView,&ViewForm,
                               &D3DXVECTOR3(0.0f,0.0f,0.0f),&D3DXVECTOR3(0.0f,1.0f,0.0f));
            g_pDEV->SetTransform(D3DTS_VIEW,&matView);
            //透視変換の設定
            D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,
                      (float)rect.right/(float)rect.bottom,1.0f,100.0f);
            g_pDEV->SetTransform(D3DTS_PROJECTION,&matProj);
            myd3d->SetMaterial();
            myd3d->SetLight();
            g_pDEV->SetRenderState(D3DRS_AMBIENT,0x00F0F0F0);
        }
        

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

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

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

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