3Dプログラミング基本 1-2

~3Dプログラミングに必要なカメラとライトの設定、そしてモデルの表示~

ここからはプログラムのソースを一部、以下に記述して説明していく。

1-2-1.カメラ情報の設定

//	カメラセット										
D3DXMATRIX matview;         //	カメラ情報を格納するための行列変数							
//	注視マトリクスの生成	(↓順番に、カメラ位置、注視点、上方向の定義)						
D3DXMatrixLookAtLH( &matview , &D3DXVECTOR3(0,10,-10),&D3DXVECTOR3(0,0,0),&D3DXVECTOR3(0,1,0));											
DXUTGetD3DDevice()->SetTransform(D3DTS_VIEW,&matview);      //	マトリクスのセット			
        

カメラ情報の設定はカメラ位置、注視点、カメラ上方向の3要素を行列にセットする形で行う。

行列(又はマトリクスとも言う)については説明を割愛するが、各人でどういうものかを確認して欲しい。

それぞれの情報の意味は下図を確認。

画像中心の線がクロスしているところを原点として、手前をZ軸のマイナス方向、上をY軸のプラス方向としてカメラ位置を決めている。


▲TOP

1-2-2.カメラレンズ情報の設定

//  プロジェクション(パース)の生成									
D3DXMATRIX matproj;     //  プロジェクション情報を格納するための行列変数				
//  �視マトリクスの生成    (↓順番に、行列変数、視野角、アスペクト比、クリッピング領域(前方、後方))						
D3DXMatrixPerspectiveFovLH ( &matproj , D3DXToRadian(45),640.0f/480.0f , 0.1f,2000.0f);										
DXUTGetD3DDevice()->SetTransform(D3DTS_PROJECTION,&matproj);	//  マトリクスのセット			
        

プロジェクション設定はものの見え方に影響する項目で、項目ごとに解説していこう。


視野角 視界の広さ、一般に視野角が広くなればなるほど視界は広がり、パース(手前の物と奥の物の大きさの差)が大きくなる。

以下はカメラの位置情報を変えずに視野角だけを変えた例である。


例1:視野角45度(もっとも一般的な設定)


例2:視野角80度(強烈なパースがかかり、空間をダイナミックに見せる)


例3:視野角15度(遠近のパースがほぼなくなり、2Dのクォータビューに近い感じになる)


アスペクト比 画面の縦と横の比率を縦を基準にして出す。通常は画面サイズの(横幅/縦幅)を渡す。

クリッピング領域(前方) カメラからどれだけ近いものまでレンダリングするかを設定する。

クリッピング領域(後方) カメラからどれだけ遠いものまでレンダリングするかを設定する。

 

この設定いかんによって1画面に映るポリゴン数が大きく変化する場合があるので、パフォーマンスに大きく影響する値でもある。

  

▲TOP

1-2-3.ライトの設定

// ライトon  ライトを有効にすればデフォルト値で初期化される。						
DXUTGetD3DDevice()->LightEnable(0,true);									
        

ライトの設定は結構なボリュームがあるので、ここでは簡単に済ませておく。

  

1-2-4.モデル(Xファイル)のロード・表示・解放

CDXUTMesh  *g_mesh;    //  モデルを扱うポインタ変数										
        

モデルをロードする変数の型は、「CDXUTMesh *」を利用する。

ポインタなので、->(アロー演算子)を用いて関数を利用する。

//  モデルのロード									
g_mesh = new CDXUTMesh();                           //  変数を実体化し、アドレスを取得			
g_mesh->Create(DXUTGetD3DDevice(),_T("isu.x"));     //  モデルのロード(これは描画用でない)			
g_mesh->RestoreDeviceObjects(DXUTGetD3DDevice());   // 描画用モデルの作成												
        
//  モデルの表示				
g_mesh->Render( DXUTGetD3DDevice() );               //	モデルの表示											
        
//  モデルデータのメモリからの解放		
SAFE_DELETE( g_mesh );											
        

1-2-5.プログラミング

インストールしたプロジェクトに対して、項目の追加が必要になる。

画面左のソリューションエクスプローラ内のEmptyProject、Commonを順に展開(+アイコンクリック)。

Common上で右クリック後、追加→既存の項目クリック。


編集プロジェクト内のCommonフォルダにあるDXUTMesh.cppとDXUTMesh.hを選択し、追加ボタンをクリック。


これで画面左のソリューションエクスプローラ内のCommonフォルダに、DXUTMesh.cppとDXUTMesh.hが追加される。


モデル(isu.x)のダウンロードは以下のリンクから行う。


URL:


モデルデータは作業中のEmptyProjectフォルダの直下に貼り付けること。


※追加箇所はマーカーで表記

//--------------------------------------------------------------------------------------													
// File: EmptyProject.cpp													
//													
// Empty starting point for new Direct3D applications													
//													
// Copyright (c) Microsoft Corporation. All rights reserved.													
//--------------------------------------------------------------------------------------													
#include "dxstdafx.h"													
#include "resource.h"													
													
//変数宣言													
CDXUTMesh   *g_mesh;    //	モデルを扱うポインタ変数				
													
//--------------------------------------------------------------------------------------													
// Rejects any devices that aren't acceptable by returning false													
//--------------------------------------------------------------------------------------													
bool CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, 													
                                  D3DFORMAT BackBufferFormat, bool bWindowed, void* pUserContext )													
{													
    // Typically want to skip backbuffer formats that don't support alpha blending													
    IDirect3D9* pD3D = DXUTGetD3DObject(); 													
    if( FAILED( pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal, pCaps->DeviceType,													
                    AdapterFormat, D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING, 													
                    D3DRTYPE_TEXTURE, BackBufferFormat ) ) )													
        return false;													
													
    return true;													
}													
													
//--------------------------------------------------------------------------------------													
// Before a device is created, modify the device settings as needed													
//--------------------------------------------------------------------------------------													
bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, const D3DCAPS9* pCaps, void* pUserContext )													
{													
    return true;													
}													
													
//--------------------------------------------------------------------------------------													
// Create any D3DPOOL_MANAGED resources here 													
//--------------------------------------------------------------------------------------													
HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )													
{													
    return S_OK;													
}													
													
//--------------------------------------------------------------------------------------													
// Create any D3DPOOL_DEFAULT resources here 													
//--------------------------------------------------------------------------------------													
HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice, 													
                                const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )													
{													
    return S_OK;													
}													
													
//--------------------------------------------------------------------------------------													
// Handle updates to the scene													
//--------------------------------------------------------------------------------------													
void CALLBACK OnFrameMove( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )													
{													
}													
													
//--------------------------------------------------------------------------------------													
// Render the scene 													
//--------------------------------------------------------------------------------------													
void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )													
{													
    HRESULT hr;													
													
    // Clear the render target and the zbuffer 													
    V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 45, 50, 170), 1.0f, 0) );													
													
    // Render the scene													
    if( SUCCEEDED( pd3dDevice->BeginScene() ) )													
    {													
	//  モデルの表示											
	g_mesh->Render( DXUTGetD3DDevice() );												
													
	V( pd3dDevice->EndScene() );												
    }													
}													
													
//--------------------------------------------------------------------------------------													
// Handle messages to the application 													
//--------------------------------------------------------------------------------------													
LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, 													
                          bool* pbNoFurtherProcessing, void* pUserContext )													
{													
    return 0;													
}													
													
//--------------------------------------------------------------------------------------													
// Release resources created in the OnResetDevice callback here 													
//--------------------------------------------------------------------------------------													
void CALLBACK OnLostDevice( void* pUserContext )													
{													
}													
													
//--------------------------------------------------------------------------------------													
// Release resources created in the OnCreateDevice callback here													
//--------------------------------------------------------------------------------------													
void CALLBACK OnDestroyDevice( void* pUserContext )													
{													
	//  3Dモデルの解放											
	SAFE_DELETE( g_mesh );												
}													
													
//  アプリケーション初期化関数												
void InitApp( void )													
{													
	//  モデルのロード											
	g_mesh = new CDXUTMesh();                           //  モデルを実体化しポインタを取得				
	g_mesh->Create(DXUTGetD3DDevice(),L"isu.x");        //  モデルのロード(これは描画用でない)				
	g_mesh->RestoreDeviceObjects(DXUTGetD3DDevice());   //	描画用モデルの作成				
													
	/////////////////////////////////////////////////////////////////////////////////////////////												
	//	3D環境の設定											
	//	カメラセット											
	D3DXMATRIX matview;         //	カメラ情報を格納するための行列変数	
							
	//  注視マトリクスの生成    (↓順番に、カメラ位置、注視点、上方向の定義)							
	D3DXMatrixLookAtLH( &matview , &D3DXVECTOR3(0,10,-10),&D3DXVECTOR3(0,0,0),&D3DXVECTOR3(0,1,0));												
	DXUTGetD3DDevice()->SetTransform(D3DTS_VIEW,&matview);      //	マトリクスのセット				
													
	//  プロジェクション(パース)の生成											
	D3DXMATRIX matproj;                                         //  プロジェクション情報を格納するための行列変数						
	//  注視マトリクスの生成     (↓順番に、行列変数、視野角、アスペクト比、クリッピング領域(前方、後方))								
	D3DXMatrixPerspectiveFovLH ( &matproj , D3DXToRadian(45),640.0f/480.0f , 0.1f,2000.0f);												
	DXUTGetD3DDevice()->SetTransform(D3DTS_PROJECTION,&matproj);								//	マトリクスのセット			
													
	// ライトon  ライトを有効にすればデフォルト値で初期化される。												
	DXUTGetD3DDevice()->LightEnable(0,true);												
}													
													
//--------------------------------------------------------------------------------------													
// Initialize everything and go into a render loop													
//--------------------------------------------------------------------------------------													
INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )													
{													
    // Enable run-time memory check for debug builds.													
#if defined(DEBUG) | defined(_DEBUG)													
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );													
#endif													
													
    // Set the callback functions													
    DXUTSetCallbackDeviceCreated( OnCreateDevice );													
    DXUTSetCallbackDeviceReset( OnResetDevice );													
    DXUTSetCallbackDeviceLost( OnLostDevice );													
    DXUTSetCallbackDeviceDestroyed( OnDestroyDevice );													
    DXUTSetCallbackMsgProc( MsgProc );													
    DXUTSetCallbackFrameRender( OnFrameRender );													
    DXUTSetCallbackFrameMove( OnFrameMove );													
   													
    // TODO: Perform any application-level initialization here													
													
    // Initialize DXUT and create the desired Win32 window and Direct3D device for the application													
    DXUTInit( true, true, true );           // Parse the command line, handle the default hotkeys, and show msgboxes													
    DXUTSetCursorSettings( true, true );    // Show the cursor and clip it when in full screen													
    DXUTCreateWindow( L"EmptyProject" );													
    DXUTCreateDevice( D3DADAPTER_DEFAULT, true, 640, 480, IsDeviceAcceptable, ModifyDeviceSettings );													
													
//アプリケーションの初期化													
InitApp();													
													
    // Start the render loop													
    DXUTMainLoop();													
													
    // TODO: Perform any application-level cleanup here													
													
    return DXUTGetExitCode();													
}	
      

2-0-4.動作確認

↓このように画面へ椅子が表示されれば、完了です。


1-1-2 動作確認

▲TOP

>「1-3 移動、拡大縮小、回転」へ続く