3D编程-旋转的立方形
2012-12-21 16:31
288 查看
#include <d3d9.h> #include <d3dx9.h> #include <stdio.h> #pragma comment(lib,"d3d9.lib") #pragma comment(lib,"d3dx9.lib") #pragma comment(lib,"winmm.lib") #define KeyDown(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) #define Msg(info) MessageBox(NULL,info,"message",MB_OK) #define ErrorMsg(info) MessageBox(NULL,info,"error",MB_ICONSTOP) #define SAFE_RELEASE_OBJ(pObject) if(pObject){pObject->Release();} #define WND_CLASS "wndclass" #define WND_TITLE "D3DApp Demo" #define WND_WIDTH 400 #define WND_HEIGHT 300 HWND g_hwnd; HINSTANCE g_hinst; LPDIRECT3D9 g_d3d; LPDIRECT3DDEVICE9 g_device; LPDIRECT3DVERTEXBUFFER9 g_vb; LPDIRECT3DINDEXBUFFER9 g_ib; #define D3DFVF_CUSTOM (D3DFVF_XYZ | D3DFVF_DIFFUSE) struct CustomVertex { float x,y,z; long color; }; bool InitGeometry() { CustomVertex cube[]= { -1,-1,-1,0X00FF00, -1,1,-1,0XFF0000, 1,1,-1,0X0000FF, 1,-1,-1,0XFF00FF, -1,-1,1,0XFFFF00, -1,1,1,0XABCDEF, 1,1,1,0XFEDCBA, 1,-1,1,0XFF00 }; int cube_index_list[]= { 0,1,2, 0,2,3, 4,6,5, 4,7,6, 4,5,1, 4,1,0, 3,2,6, 3,6,7, 1,5,6, 1,6,2, 4,0,3, 4,3,7 }; if(FAILED(g_device->CreateVertexBuffer(sizeof(cube), 0, D3DFVF_CUSTOM, D3DPOOL_DEFAULT, &g_vb, NULL))) return false; if(FAILED(g_device->CreateIndexBuffer(sizeof(cube_index_list), D3DUSAGE_WRITEONLY, D3DFMT_INDEX32, D3DPOOL_MANAGED, &g_ib, 0))) return false; // fill vextex buffer void * paddr; g_vb->Lock(0, 0, (void**)&paddr, 0); memcpy(paddr, cube, sizeof(cube)); g_vb->Unlock(); // fill index buffer int * pIndex = 0; g_ib->Lock(0, 0, (void**)&pIndex, 0); memcpy(pIndex, cube_index_list, sizeof(cube_index_list)); g_ib->Unlock(); return true; } bool InitD3D() { if(NULL==(g_d3d = Direct3DCreate9(D3D_SDK_VERSION))) return false; D3DDISPLAYMODE d3dpm; if(FAILED(g_d3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3dpm))) return false; D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = TRUE; d3dpp.hDeviceWindow = g_hwnd; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = d3dpm.Format; if(FAILED(g_d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_device))) return false; g_device->SetRenderState(D3DRS_LIGHTING, FALSE); g_device->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); return true; } bool InitApp() { if(!InitD3D() || !InitGeometry()) { ErrorMsg("Unable to Initialize D3D !"); return false; } return true; } void SetupMatrix() { D3DXMATRIX world,view,proj; D3DXVECTOR3 eye(0.0f, 2.0f, 6.0f),lookat(0.0f, 0.0f, 0.0f), updir(0.0f, 1.0f, 0.0f); D3DXMatrixRotationY(&world, timeGetTime()/500.0f); g_device->SetTransform(D3DTS_WORLD, &world); D3DXMatrixLookAtLH(&view, &eye, &lookat, &updir); g_device->SetTransform(D3DTS_VIEW, &view); D3DXMatrixPerspectiveFovLH(&proj, D3DX_PI / 2.0f, WND_WIDTH/WND_HEIGHT, 1.0f, 1000.0f); g_device->SetTransform(D3DTS_PROJECTION, &proj); } void Render() { g_device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0); g_device->BeginScene(); SetupMatrix(); g_device->SetStreamSource(0, g_vb, 0, sizeof(CustomVertex)); g_device->SetIndices(g_ib); g_device->SetFVF(D3DFVF_CUSTOM); g_device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12); g_device->EndScene(); g_device->Present(NULL, NULL, NULL, NULL); } void ShutdownApp() { SAFE_RELEASE_OBJ(g_ib); SAFE_RELEASE_OBJ(g_vb); SAFE_RELEASE_OBJ(g_device); SAFE_RELEASE_OBJ(g_d3d); } LRESULT CALLBACK MsgProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { switch(msg) { case WM_DESTROY: PostQuitMessage(0); break; default: break; } return DefWindowProc(hwnd, msg, wparam, lparam); } int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hprevinst, LPSTR cmdlint, INT show) { g_hinst = hinst; WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_CLASSDC; wcex.lpfnWndProc = MsgProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = GetModuleHandle(NULL); wcex.hIcon = LoadIcon(NULL, IDC_APPSTARTING); wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wcex.hCursor = LoadCursor( NULL, IDC_ARROW ); wcex.lpszClassName = WND_CLASS; wcex.lpszMenuName = NULL; wcex.hIconSm = LoadIcon(NULL, IDC_APPSTARTING); if(!RegisterClassEx(&wcex)) { ErrorMsg("RegisterClassEx failed!"); return 0; } g_hwnd = CreateWindow(WND_CLASS, WND_TITLE, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WND_WIDTH, WND_HEIGHT, NULL, NULL, hinst, NULL); if(!g_hwnd) return 0; ShowWindow(g_hwnd, SW_SHOWNORMAL); UpdateWindow(g_hwnd); MSG msg={0}; if(!InitApp()) msg.message = WM_QUIT; while(msg.message != WM_QUIT) { if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } Render(); } ShutdownApp(); UnregisterClass(WND_CLASS, wcex.hInstance); return 0; }
相关文章推荐
- Directx 3D编程实例:绘制可变速旋转的三角形
- cesium编程入门(七)3D Tiles,模型旋转
- Directx 3D编程实例:随机绘制的立体图案旋转
- Flash与3D编程探秘(六)- 全方位旋转摄像机
- Android编程实现3D滑动旋转效果的方法
- Qt下的OpenGL 编程(9)3D视图变换、旋转的地球
- Qt下的OpenGL 编程(9)3D视图变换、旋转的地球
- Android编程实现3D立体旋转效果的实例代码
- Flash与3D编程探秘(四)- 摄像机旋转基础知识
- 3D编程-旋转的三角形
- Flash与3D编程探秘(五)- 摄像机旋转和移动
- Flash与3D编程探秘(五)- 摄像机旋转和移动
- Flash与3D编程探秘(四)- 摄像机旋转基础知识
- Directx 3D编程实例:随机绘制的立体图案旋转
- iOS编程——Swift实现一个3D可旋转的立方体(可做菜单页)
- Flash与3D编程探秘(六)- 全方位旋转摄像机
- Qt下的OpenGL 编程(9)3D视图变换、旋转的地球
- css3 js实现3D旋转效果
- WPF 3D编程介绍
- 3D旋转的时钟