代碼如下:說明代碼中用到的.x模型:http://download.csdn.net/source/3416898
/******************************** * Author: rabbit729 * E-mail: wlq_729@163.com * Date: 2011-07-04 * Description: 四視圖********************************/#include <d3dx9.h>//-----------------------------------------------------------------------------// Desc: 全域變數//-----------------------------------------------------------------------------#define WIDTH 800#define HEIGHT 600LPDIRECT3D9 g_pD3D = NULL; //Direct3D對象LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //Direct3D裝置對象LPD3DXFONT g_pFont = NULL; //Direct3D字型對象LPD3DXLINE g_pLine = NULL; //Direct3D畫線對象LPD3DXMESH g_pMesh = NULL; //網格模型對象D3DMATERIAL9* g_pMeshMaterials = NULL; //網格模型材質LPDIRECT3DTEXTURE9* g_pMeshTextures = NULL; //網格模型紋理DWORD g_dwNumMaterials = 0L; //網格模型材質數量D3DXVECTOR2* g_vHorArr = NULL; //水平分割線D3DXVECTOR2* g_vVerArr = NULL; //垂直分割線D3DVIEWPORT9 g_MainViewport; // 主視圖D3DVIEWPORT9 g_ProViewport; // 俯視圖視口D3DVIEWPORT9 g_FrontViewport; // 前視圖視口D3DVIEWPORT9 g_TopViewport; // 頂視圖視口D3DVIEWPORT9 g_LeftViewport; // 左視圖視口//-----------------------------------------------------------------------------// Desc: 設定世界矩陣//-----------------------------------------------------------------------------VOID SetWorldMatrix(){ //建立並設定世界矩陣 D3DXMATRIXA16 matWorld;D3DXMatrixIdentity(&matWorld); g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );}//-----------------------------------------------------------------------------// Desc: 設定俯視圖矩陣//-----------------------------------------------------------------------------VOID SeProViewMatrix(){//建立並設定觀察矩陣D3DXVECTOR3 vEyePt( 0.0f, 20.0f,-20.0f );D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );D3DXMATRIXA16 matView;D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );}//-----------------------------------------------------------------------------// Desc: 設定前視圖矩陣//-----------------------------------------------------------------------------VOID SetFrontViewMatrix(){//建立並設定觀察矩陣D3DXVECTOR3 vEyePt( 0.0f, 0.0f,-20.0f );D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );D3DXMATRIXA16 matView;D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );}//-----------------------------------------------------------------------------// Desc: 設定頂視圖矩陣//-----------------------------------------------------------------------------VOID SetTopViewMatrix(){//建立並設定觀察矩陣D3DXVECTOR3 vEyePt( 0.0f, 20.0f,0.0f );D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );D3DXVECTOR3 vUpVec( 0.0f, 0.0f, 1.0f );D3DXMATRIXA16 matView;D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );}//-----------------------------------------------------------------------------// Desc: 設定左視圖矩陣//-----------------------------------------------------------------------------VOID SetLeftViewMatrix(){//建立並設定觀察矩陣D3DXVECTOR3 vEyePt( -20.0f, 0.0f,0.0f );D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );D3DXMATRIXA16 matView;D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );}//-----------------------------------------------------------------------------// Desc: 設定投影矩陣//-----------------------------------------------------------------------------VOID SetProjMatrix(){ //建立並設定投影矩陣 D3DXMATRIXA16 matProj; D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f ); g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );}//-----------------------------------------------------------------------------// Desc: 初始化Direct3D//-----------------------------------------------------------------------------HRESULT InitD3D( HWND hWnd ){//建立Direct3D對象, 該對象用於建立Direct3D裝置對象 if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) return E_FAIL;//設定D3DPRESENT_PARAMETERS結構, 準備建立Direct3D裝置對象 D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; d3dpp.EnableAutoDepthStencil = TRUE; d3dpp.AutoDepthStencilFormat = D3DFMT_D16; //建立Direct3D裝置對象 if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice ) ) ) { return E_FAIL; }//建立字型對象if (FAILED(D3DXCreateFont(g_pd3dDevice, 0, 0, 0, 0, 0, 0, 0, 0, 0, L"Arial", &g_pFont))){return E_FAIL;}//建立畫線對象if (FAILED(D3DXCreateLine(g_pd3dDevice, &g_pLine))){return E_FAIL;}//設定環境光線 g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0xffffffff );//設定觀察矩陣和投影矩陣SetProjMatrix();// 計算四視圖視口尺寸g_pd3dDevice->GetViewport(&g_MainViewport);g_LeftViewport.Width = g_TopViewport.Width =g_FrontViewport.Width = g_ProViewport.Width = g_MainViewport.Width / 2;g_LeftViewport.Height = g_TopViewport.Height =g_FrontViewport.Height = g_ProViewport.Height = g_MainViewport.Height / 2;g_LeftViewport.X = g_FrontViewport.X = 0;g_LeftViewport.Y = g_TopViewport.Y = 0;g_FrontViewport.Y = g_ProViewport.Y = g_MainViewport.Height / 2;g_TopViewport.X = g_ProViewport.X = g_MainViewport.Width / 2;g_LeftViewport.MinZ = g_TopViewport.MinZ =g_FrontViewport.MinZ = g_ProViewport.MinZ = 0.f;g_LeftViewport.MaxZ = g_TopViewport.MaxZ =g_FrontViewport.MaxZ = g_ProViewport.MaxZ = 1.0f; return S_OK;}//-----------------------------------------------------------------------------// Desc: 從絕對路徑中提取紋理檔案名稱//-----------------------------------------------------------------------------void RemovePathFromFileName(LPSTR fullPath, LPWSTR fileName){//先將fullPath的類型變換為LPWSTRWCHAR wszBuf[MAX_PATH];MultiByteToWideChar( CP_ACP, 0, fullPath, -1, wszBuf, MAX_PATH );wszBuf[MAX_PATH-1] = L'\0';WCHAR* wszFullPath = wszBuf;//從絕對路徑中提取檔案名稱LPWSTR pch=wcsrchr(wszFullPath,'\\');if (pch)lstrcpy(fileName, ++pch);elselstrcpy(fileName, wszFullPath);}//-----------------------------------------------------------------------------// Desc: 建立情境圖形//-----------------------------------------------------------------------------HRESULT InitGeometry(){ LPD3DXBUFFER pD3DXMtrlBuffer; //儲存網格模型材質的緩衝區對象 //從磁碟檔案載入網格模型 if( FAILED( D3DXLoadMeshFromX( L"airplane.x", D3DXMESH_MANAGED, g_pd3dDevice, NULL, &pD3DXMtrlBuffer, NULL, &g_dwNumMaterials, &g_pMesh ) ) ) { MessageBox(NULL, L"Could not find airplane.x", L"Mesh", MB_OK); return E_FAIL; } //從網格模型中提取材質屬性和紋理檔案名稱 D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer(); g_pMeshMaterials = new D3DMATERIAL9[g_dwNumMaterials]; if( g_pMeshMaterials == NULL ) return E_OUTOFMEMORY; g_pMeshTextures = new LPDIRECT3DTEXTURE9[g_dwNumMaterials]; if( g_pMeshTextures == NULL ) return E_OUTOFMEMORY;//逐塊提取網格模型材質屬性和紋理檔案名稱 for( DWORD i=0; i<g_dwNumMaterials; i++ ) { //材料屬性 g_pMeshMaterials[i] = d3dxMaterials[i].MatD3D;//設定模型材料的環境光線反射係數, 因為模型材料本身沒有設定環境光線反射係數 g_pMeshMaterials[i].Ambient = g_pMeshMaterials[i].Diffuse; g_pMeshTextures[i] = NULL; if( d3dxMaterials[i].pTextureFilename != NULL && strlen(d3dxMaterials[i].pTextureFilename) > 0 ) {//擷取紋理檔案名稱WCHAR filename[256];RemovePathFromFileName(d3dxMaterials[i].pTextureFilename, filename); //建立紋理 if( FAILED( D3DXCreateTextureFromFile( g_pd3dDevice, filename, &g_pMeshTextures[i] ) ) ) { MessageBox(NULL, L"Could not find texture file", L"Mesh", MB_OK); } } }//釋放在載入模型檔案時建立的儲存模型材質和紋理資料的緩衝區對象 pD3DXMtrlBuffer->Release(); //填充水平垂直分割線g_vHorArr = new D3DXVECTOR2[2];g_vHorArr[0].x = 0;g_vHorArr[0].y = g_vHorArr[1].y = HEIGHT / 2;g_vHorArr[1].x = WIDTH;//填充垂直分割線g_vVerArr = new D3DXVECTOR2[2];g_vVerArr[0].y = 0;g_vVerArr[0].x = g_vVerArr[1].x = WIDTH / 2;g_vVerArr[1].y = HEIGHT; return S_OK;}//-----------------------------------------------------------------------------// Desc: 釋放建立的對象//-----------------------------------------------------------------------------VOID Cleanup(){//釋放網格模型材質 if( g_pMeshMaterials != NULL ) delete[] g_pMeshMaterials;//釋放網格模型紋理 if( g_pMeshTextures ) { for( DWORD i = 0; i < g_dwNumMaterials; i++ ) { if( g_pMeshTextures[i] ) g_pMeshTextures[i]->Release(); } delete[] g_pMeshTextures; }//釋放網格模型對象 if( g_pMesh != NULL ) g_pMesh->Release(); //釋放畫線對象if (g_pLine != NULL){g_pLine->Release();}delete[] g_vHorArr;g_vHorArr = NULL;delete[] g_vVerArr;g_vVerArr = NULL;//釋放字型對象if(g_pFont != NULL)g_pFont->Release();//釋放Direct3D裝置對象 if( g_pd3dDevice != NULL ) g_pd3dDevice->Release();//釋放Direct3D對象 if( g_pD3D != NULL ) g_pD3D->Release();}//-----------------------------------------------------------------------------// Desc: 渲染情境//-----------------------------------------------------------------------------VOID Render(){ // 清除緩衝區 g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(43,43,43), 1.0f, 0 ); //開始渲染情境 if( SUCCEEDED( g_pd3dDevice->BeginScene() ) ) { SetWorldMatrix(); //設定世界矩陣 // 渲染左視圖SetLeftViewMatrix();g_pd3dDevice->SetViewport(&g_LeftViewport); //逐塊渲染網格模型 for( DWORD i=0; i<g_dwNumMaterials; i++ ) { //設定材料和紋理 g_pd3dDevice->SetMaterial( &g_pMeshMaterials[i] ); g_pd3dDevice->SetTexture( 0, g_pMeshTextures[i] );//渲染模型 g_pMesh->DrawSubset( i ); }// 渲染頂視圖SetTopViewMatrix();g_pd3dDevice->SetViewport(&g_TopViewport);//逐塊渲染網格模型for( DWORD i=0; i<g_dwNumMaterials; i++ ){//設定材料和紋理g_pd3dDevice->SetMaterial( &g_pMeshMaterials[i] );g_pd3dDevice->SetTexture( 0, g_pMeshTextures[i] );//渲染模型g_pMesh->DrawSubset( i );}// 渲染前視圖SetFrontViewMatrix();g_pd3dDevice->SetViewport(&g_FrontViewport);//逐塊渲染網格模型for( DWORD i=0; i<g_dwNumMaterials; i++ ){//設定材料和紋理g_pd3dDevice->SetMaterial( &g_pMeshMaterials[i] );g_pd3dDevice->SetTexture( 0, g_pMeshTextures[i] );//渲染模型g_pMesh->DrawSubset( i );}// 渲染俯視圖SeProViewMatrix();g_pd3dDevice->SetViewport(&g_ProViewport);//逐塊渲染網格模型for( DWORD i=0; i<g_dwNumMaterials; i++ ){//設定材料和紋理g_pd3dDevice->SetMaterial( &g_pMeshMaterials[i] );g_pd3dDevice->SetTexture( 0, g_pMeshTextures[i] );//渲染模型g_pMesh->DrawSubset( i );}//繪製分割線g_pd3dDevice->SetViewport(&g_MainViewport);g_pLine->SetWidth(4.f);g_pLine->SetAntialias(TRUE);g_pLine->SetPattern(0xffffffff);g_pLine->Draw(g_vHorArr, 2, 0xffffffff);g_pLine->Draw(g_vVerArr, 2, 0xffffffff);// 繪製描述資訊RECT rtText;rtText.left = g_LeftViewport.X;rtText.top = g_LeftViewport.Y;rtText.right = rtText.left + 200;rtText.bottom = rtText.top + 50;g_pFont->DrawText(0, L"Left View", -1, &rtText, DT_LEFT, 0xffffffff );rtText.left = g_TopViewport.X + 6;rtText.top = g_TopViewport.Y;rtText.right = rtText.left + 200;rtText.bottom = rtText.top + 50;g_pFont->DrawText(0, L"Top View", -1, &rtText, DT_LEFT, 0xffffffff );rtText.left = g_FrontViewport.X;rtText.top = g_FrontViewport.Y + 20;rtText.right = rtText.left + 200;rtText.bottom = rtText.top + 50;g_pFont->DrawText(0, L"Front View", -1, &rtText, DT_LEFT, 0xffffffff );rtText.left = g_ProViewport.X + 6;rtText.top = g_ProViewport.Y + 20;rtText.right = rtText.left + 200;rtText.bottom = rtText.top + 50;g_pFont->DrawText(0, L"Project View", -1, &rtText, DT_LEFT, 0xffffffff ); //情境渲染結束 g_pd3dDevice->EndScene(); } //在螢幕上顯示情境 g_pd3dDevice->Present( NULL, NULL, NULL, NULL );}//-----------------------------------------------------------------------------// Desc: 視窗過程, 處理訊息//-----------------------------------------------------------------------------LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ){ switch( msg ) { case WM_DESTROY:Cleanup(); PostQuitMessage( 0 ); return 0; } return DefWindowProc( hWnd, msg, wParam, lParam );}//-----------------------------------------------------------------------------// Desc: 入口函數//-----------------------------------------------------------------------------INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT ){ //註冊視窗類別 WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L"ClassName", NULL }; RegisterClassEx( &wc ); //建立視窗 HWND hWnd = CreateWindow( L"ClassName", L"四視圖", WS_OVERLAPPEDWINDOW, 100, 100, WIDTH, HEIGHT, GetDesktopWindow(), NULL, wc.hInstance, NULL );//初始化Direct3D if( SUCCEEDED( InitD3D( hWnd ) ) ) { //建立情境圖形 if( SUCCEEDED( InitGeometry() ) ) { //顯示視窗 ShowWindow( hWnd, SW_SHOWDEFAULT ); UpdateWindow( hWnd ); //進入訊息迴圈 MSG msg; ZeroMemory( &msg, sizeof(msg) ); while( msg.message!=WM_QUIT ) { if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } else{ Render(); //渲染情境} } } } UnregisterClass( L"ClassName", wc.hInstance ); return 0;}