- 注册时间
- 2008-5-30
- 最后登录
- 1970-1-1
|
\Samples\C++\Direct3D\Tutorials\Tut03_Matrices
- //-----------------------------------------------------------------------------
- // File: Matrices.cpp
- //目的:介绍3D几何学中的4*4矩阵的使用
- //我们可以转换他,旋转他,伸缩他。。
- //在这个教程中,我们将介绍D3DX的使用
- //我们将学会D3DX最有用的矩阵使用
- //需要连接上 d3dx9.lib.
- // 微软公司(c) Microsoft Corporation.
- //翻译:Bill(c) [url=http://hi.baidu.com/probill/]http://hi.baidu.com/probill/[/url]
- //转载请注明出处 :-)
- //-----------------------------------------------------------------------------
- #include <Windows.h>
- #include <mmsystem.h>
- #include <d3dx9.h>
- #pragma warning( disable : 4996 ) // 禁用4996警告
- #include <strsafe.h>
- #pragma warning( default : 4996 )
- //-----------------------------------------------------------------------------
- // 全局变量
- //-----------------------------------------------------------------------------
- LPDIRECT3D9 g_pD3D = NULL; // 创建D3D设备
- LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // 创建渲染
- LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; // 顶点缓冲
- // 自定义顶点类型
- struct CUSTOMVERTEX
- {
- FLOAT x, y, z; // 顶点的3D位置
- DWORD color; //顶点颜色
- };
- // 自定义定点
- #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
- //-----------------------------------------------------------------------------
- // Name: InitD3D()
- // 目的:初始化 Direct3D
- //-----------------------------------------------------------------------------
- HRESULT InitD3D( HWND hWnd )
- {
- // 创建 D3D
- if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
- return E_FAIL;
- // 填充D3DDevice结构
- D3DPRESENT_PARAMETERS d3dpp;
- ZeroMemory( &d3dpp, sizeof(d3dpp) );
- d3dpp.Windowed = TRUE;
- d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
- d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
- // 创建D3DDevice
- if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
- D3DCREATE_SOFTWARE_VERTEXPROCESSING,
- &d3dpp, &g_pd3dDevice ) ) )
- {
- return E_FAIL;
- }
- // 不使用平面剔除,使我们可以看见背面
- g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
- // 不使用光照
- g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
- return S_OK;
- }
- //-----------------------------------------------------------------------------
- // Name: InitGeometry()
- // 目的: 初始化几何数据
- //-----------------------------------------------------------------------------
- HRESULT InitGeometry()
- {
- // 初始化顶点数据
- CUSTOMVERTEX g_Vertices[] =
- {
- { -1.0f,-1.0f, 0.0f, 0xffff0000, },
- { 1.0f,-1.0f, 0.0f, 0xff0000ff, },
- { 0.0f, 1.0f, 0.0f, 0xffffffff, },
- };
- // 创建顶点缓冲区
- if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
- 0, D3DFVF_CUSTOMVERTEX,
- D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
- {
- return E_FAIL;
- }
- //填入顶点数据
- VOID* pVertices;
- if( FAILED( g_pVB->Lock( 0, sizeof(g_Vertices), (void**)&pVertices, 0 ) ) )
- return E_FAIL;
- memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
- g_pVB->Unlock();
- return S_OK;
- }
- //-----------------------------------------------------------------------------
- // Name: Cleanup()
- // 目的:清理资源
- //-----------------------------------------------------------------------------
- VOID Cleanup()
- {
- if( g_pVB != NULL )
- g_pVB->Release();
- if( g_pd3dDevice != NULL )
- g_pd3dDevice->Release();
- if( g_pD3D != NULL )
- g_pD3D->Release();
- }
- //-----------------------------------------------------------------------------
- // Name: SetupMatrices()
- // 目的:设置世界、视角、投影矩阵
- //-----------------------------------------------------------------------------
- VOID SetupMatrices()
- {
- // 我们的物体绕Y轴旋转
- D3DXMATRIXA16 matWorld;
- //设置旋转矩阵去产生360度的旋转
- UINT iTime = timeGetTime() % 1000;
- FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;
- D3DXMatrixRotationY( &matWorld, fAngle );
- g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
- // 设置观察矩阵
- // 一个视点、一个目标点、一个上坐标(确定Y轴用的)
- D3DXVECTOR3 vEyePt( 0.0f, 3.0f,-5.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 );
- // 设置投影矩阵,把3D投影到2D
- D3DXMATRIXA16 matProj;
- D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
- g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
- }
- //-----------------------------------------------------------------------------
- // Name: Render()
- // 目的:渲染场景
- //-----------------------------------------------------------------------------
- VOID Render()
- {
- // 清空缓冲
- g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );
- // Begin the scene
- if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
- {
- // Setup the world, view, and projection matrices
- SetupMatrices();
- // Render the vertex buffer contents
- g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
- g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
- g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 1 );
- // End the scene
- g_pd3dDevice->EndScene();
- }
- // Present the backbuffer contents to the display
- g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
- }
- //-----------------------------------------------------------------------------
- // Name: MsgProc()
- // Desc: window' 消息处理
- //-----------------------------------------------------------------------------
- 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 );
- }
- //-----------------------------------------------------------------------------
- // Name: WinMain()
- // Desc: 程序入口
- //-----------------------------------------------------------------------------
- INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
- {
- // 注册窗口
- WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
- GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
- "D3D Tutorial", NULL };
- RegisterClassEx( &wc );
- // 创建窗口
- HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 03: Matrices",
- WS_OVERLAPPEDWINDOW, 100, 100, 256, 256,
- NULL, NULL, wc.hInstance, NULL );
- // Initialize Direct3D
- if( SUCCEEDED( InitD3D( hWnd ) ) )
- {
- // 初始化几何数据
- if( SUCCEEDED( InitGeometry() ) )
- {
- // Show the window
- ShowWindow( hWnd, SW_SHOWDEFAULT );
- UpdateWindow( hWnd );
- // Enter the message loop
- MSG msg;
- ZeroMemory( &msg, sizeof(msg) );
- while( msg.message!=WM_QUIT )
- {
- if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
- {
- TranslateMessage( &msg );
- DispatchMessage( &msg );
- }
- else
- Render();
- }
- }
- }
- UnregisterClass( "D3D 教程", wc.hInstance );
- return 0;
- }
复制代码 |
|