// ============================================================================= // Desc:坐标变换 // ============================================================================= #include < d3dx9.h > // D3DX实用库函数,该头文件中又包含了d3d9.h头文件 // ----------------------------------------------------------------------------- // Desc:全局变量 // ----------------------------------------------------------------------------- LPDIRECT3D9g_pD3D = NULL; // Direct3D对象 LPDIRECT3DDEVICE9g_pd3dDevice = NULL; // Direct3D设备对象 LPDIRECT3DVERTEXBUFFER9g_pVB = NULL; // 顶点缓冲区对象 HWNDg_Wnd = NULL; // 窗口句柄 D3DRECTg_ClentRect; // ----------------------------------------------------------------------------- // Desc:顶点结构 // ----------------------------------------------------------------------------- struct CUSTOMVERTEX {D3DXVECTOR3position;DWORDcolor;} ; #define D3DFVF_CUSTOMVERTEX(D3DFVF_XYZ|D3DFVF_DIFFUSE) // ----------------------------------------------------------------------------- // Desc:设置世界矩阵 // ----------------------------------------------------------------------------- VOIDSetupWorldMatrice() {//建立一个绕X轴动态旋转的世界矩阵D3DXMATRIXmatWorld;UINTiTime=timeGetTime()%1000;FLOATfAngle=iTime*(2.0f*D3DX_PI)/1000.0f;//旋转角度D3DXMatrixIdentity(&matWorld);//单位矩阵D3DXMatrixRotationX(&matWorld,fAngle);//饶x轴选择//设置世界矩阵g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);} // ----------------------------------------------------------------------------- // Desc:设置观察矩阵和投影矩阵 // ----------------------------------------------------------------------------- VOIDSetupViewandProjMatrices() {//建立并设置观察矩阵D3DXVECTOR3vEyePt(0.0f,3.0f,-5.0f);D3DXVECTOR3vLookatPt(0.0f,0.0f,0.0f);D3DXVECTOR3vUpVec(0.0f,1.0f,0.0f);D3DXMATRIXmatView;D3DXMatrixLookAtLH(&matView,&vEyePt,&vLookatPt,&vUpVec);g_pd3dDevice->SetTransform(D3DTS_VIEW,&matView);//建立并设置投影矩阵D3DXMATRIXmatProj;D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,1.0f,1.0f,100.0f);g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj);} // ----------------------------------------------------------------------------- // Desc:设置视区 // ----------------------------------------------------------------------------- VOIDSetupViewPort() {RECTrect;GetClientRect(g_Wnd,&rect);D3DVIEWPORT9vp;vp.X=0;vp.Y=0;vp.Width=rect.right;vp.Height=rect.bottom;vp.MinZ=0.0f;vp.MaxZ=1.0f;g_pd3dDevice->SetViewport(&vp);} // ----------------------------------------------------------------------------- // Desc:初始化Direct3D // ----------------------------------------------------------------------------- HRESULTInitD3D(HWNDhWnd) {//创建Direct3D对象,该对象用于创建Direct3D设备对象if(NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))returnE_FAIL;//设置D3DPRESENT_PARAMETERS结构,准备创建Direct3D设备对象D3DPRESENT_PARAMETERSd3dpp;ZeroMemory(&d3dpp,sizeof(d3dpp));d3dpp.Windowed=TRUE;d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;//创建Direct3D设备对象if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pd3dDevice))){returnE_FAIL;}//设置剔出模式为不剔出任何面(正面和反面)g_pd3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);//关闭光照处理,默认情况下启用光照处理g_pd3dDevice->SetRenderState(D3DRS_LIGHTING,FALSE);//设置观察和投影矩阵SetupViewandProjMatrices();//设置视区SetupViewPort();returnS_OK;} // ----------------------------------------------------------------------------- // Desc:创建场景图形 // ----------------------------------------------------------------------------- HRESULTInitGeometry() {//创顶点缓冲区if(FAILED(g_pd3dDevice->CreateVertexBuffer(50*2*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,&g_pVB,NULL))){returnE_FAIL;}//填充顶点缓冲区CUSTOMVERTEX*pVertices;if(FAILED(g_pVB->Lock(0,0,(void**)&pVertices,0)))returnE_FAIL;for(DWORDi=0;i<50;i++){FLOATtheta=(2*D3DX_PI*i)/(50-1);pVertices[2*i+0].position=D3DXVECTOR3(sinf(theta),-1.0f,cosf(theta));pVertices[2*i+0].color=0xffffff00;pVertices[2*i+1].position=D3DXVECTOR3(sinf(theta),1.0f,cosf(theta));pVertices[2*i+1].color=0xffffff00;}g_pVB->Unlock();returnS_OK;} // ----------------------------------------------------------------------------- // Desc:释放创建的对象 // ----------------------------------------------------------------------------- VOIDCleanup() {//释放顶点缓冲区对象if(g_pVB!=NULL)g_pVB->Release();//释放Direct3D设备对象if(g_pd3dDevice!=NULL)g_pd3dDevice->Release();//释放Direct3D对象if(g_pD3D!=NULL)g_pD3D->Release();} // ----------------------------------------------------------------------------- // Desc:渲染图形 // ----------------------------------------------------------------------------- VOIDRender() {//清空后台缓冲区g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(45,50,170),1.0f,0);//开始在后台缓冲区绘制图形if(SUCCEEDED(g_pd3dDevice->BeginScene())){//设置世界矩阵SetupWorldMatrice();//在后台缓冲区绘制图形g_pd3dDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX));g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2*50-2);//结束在后台缓冲区渲染图形g_pd3dDevice->EndScene();}//将在后台缓冲区绘制的图形提交到前台缓冲区显示g_pd3dDevice->Present(NULL,NULL,NULL,NULL);} // ----------------------------------------------------------------------------- // Desc:消息处理 // ----------------------------------------------------------------------------- LRESULTWINAPIMsgProc(HWNDhWnd,UINTmsg,WPARAMwParam,LPARAMlParam) {switch(msg){caseWM_DESTROY:Cleanup();PostQuitMessage(0);return0;}returnDefWindowProc(hWnd,msg,wParam,lParam);} // ----------------------------------------------------------------------------- // Desc:入口函数 // ----------------------------------------------------------------------------- INTWINAPIWinMain(HINSTANCEhInst,HINSTANCE,LPSTR,INT) {//注册窗口类WNDCLASSEXwc={sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,GetModuleHandle(NULL),NULL,NULL,NULL,NULL,L"ClassName",NULL};RegisterClassEx(&wc);//创建窗口HWNDhWnd=CreateWindow(L"ClassName",L"坐标变换",WS_OVERLAPPEDWINDOW,200,100,500,500,GetDesktopWindow(),NULL,wc.hInstance,NULL);g_Wnd=hWnd;//初始化Direct3Dif(SUCCEEDED(InitD3D(hWnd))){//创建场景图形if(SUCCEEDED(InitGeometry())){//显示窗口ShowWindow(hWnd,SW_SHOWDEFAULT);UpdateWindow(hWnd);//进入消息循环MSGmsg;ZeroMemory(&msg,sizeof(msg));while(msg.message!=WM_QUIT){if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE)){TranslateMessage(&msg);DispatchMessage(&msg);}else{Render();//渲染图形}}}}UnregisterClass(L"ClassName",wc.hInstance);return0;}