Tiny.x をマウスで操作

ArcBall を使って Tiny.x をアニメーションしながらマウスで操作します。

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

プロジェクトの設定

  1. X-FILE(Tiny.x) でアニメーション をベースに機能を追加します。
    EmptyProject9.cpp は「X-FILE(Tiny.x) でアニメーション」のままで、EmptyProject10.cpp のみ修正します。
    ファイル名 説明
    XfileTiny.zip 圧縮ファイル
  2. "DXUTcamera.h" を include に追加します。
    EmptyProject9.cpp で定義されている g_vObjectCenter と g_ArcBall を EmptyProject10.cpp で参照するので extern で宣言して下さい。
    OnFrameMove は EmptyProject9.cpp で定義した関数を使います。
    EmptyProject10.cpp の OnFrameMove() は削除して下さい。
    #include "DXUT.h"
    #include "DXUTcamera.h"
    
    //extern bool CALLBACK IsD3D9DeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat,
    //                                             bool bWindowed, void* pUserContext );
    extern HRESULT CALLBACK OnD3D9CreateDevice( IDirect3DDevice9* pd3dDevice,
                                                const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext );
    extern HRESULT CALLBACK OnD3D9ResetDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc,
                                               void* pUserContext );
    extern void CALLBACK OnD3D9FrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime,
                                            void* pUserContext );
    //extern void CALLBACK OnD3D9LostDevice( void* pUserContext );
    extern void CALLBACK OnD3D9DestroyDevice( void* pUserContext );
    
    extern void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext );
    extern void ReleaseFrame();
    extern D3DXVECTOR3  g_vObjectCenter;        // Center of bounding sphere of object
    extern CD3DArcBall  g_ArcBall;              // Arcball for model control
    
  3. モデルの操作は MsgProc() で行います。
    マウスのドラッグでモデルを回転する関数が g_ArcBall に用意されています。
    g_ArcBall.HandleMessages() を呼び出すと、マウスの左ドラッグで回転が、右ドラッグで移動が出来るようになります。
    ただし、Tiny.x のモデルはティーポットに比べてサイズが大きく(百倍)「移動や縮小」の利きが非常に悪いので、 Camera で回転する方が適しているかも知れません。
    LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
                              bool* pbNoFurtherProcessing, void* pUserContext )
    {
        g_ArcBall.HandleMessages( hWnd, uMsg, wParam, lParam );
        return 0;
    }
    
  4. wWinMain() を修正します。
    DirectX10 に関係する次の行をコメントアウト(または削除)して下さい。
    関数の本体も含めて削除すると、プログラムがすっきりします。
    終了時に DrawMeshContainer を再帰的に開放する関数 ReleaseFrame() を呼び出します。
    int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow )
    {       ・・・
            ・・・
        // Set the D3D9 DXUT callbacks. Remove these sets if the app doesn't need to support D3D9
        //DXUTSetCallbackD3D9DeviceAcceptable( IsD3D9DeviceAcceptable );
        DXUTSetCallbackD3D9DeviceCreated( OnD3D9CreateDevice );
        DXUTSetCallbackD3D9DeviceReset( OnD3D9ResetDevice );
        DXUTSetCallbackD3D9FrameRender( OnD3D9FrameRender );
        //DXUTSetCallbackD3D9DeviceLost( OnD3D9LostDevice );
        DXUTSetCallbackD3D9DeviceDestroyed( OnD3D9DestroyDevice );
    
        // Set the D3D10 DXUT callbacks. Remove these sets if the app doesn't need to support D3D10
    /*
        DXUTSetCallbackD3D10DeviceAcceptable( IsD3D10DeviceAcceptable );
        DXUTSetCallbackD3D10DeviceCreated( OnD3D10CreateDevice );
        DXUTSetCallbackD3D10SwapChainResized( OnD3D10ResizedSwapChain );
        DXUTSetCallbackD3D10FrameRender( OnD3D10FrameRender );
        DXUTSetCallbackD3D10SwapChainReleasing( OnD3D10ReleasingSwapChain );
        DXUTSetCallbackD3D10DeviceDestroyed( OnD3D10DestroyDevice );
    */
            ・・・
            ・・・
        ReleaseFrame();
    
        return DXUTGetExitCode();
    }
    
  5. Tiny.x よりワンレベル上のアニメーションセット(歩く/走る/時計や周りを見る)を設定するプログラムは Directx9 の「tiny_4anim.x でアニメーション」を参照して下さい。

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