d3d实现一个旋转的三菱椎

来源:互联网 发布:mac app store 更新 编辑:程序博客网 时间:2024/04/27 17:05

#include "d3d9.h"
#include "d3dx9math.h"

#pragma comment(lib,"d3d9.lib")   
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib, "winmm.lib")

LPDIRECT3D9 g_pD3D = NULL;//Direct3D¶ÔÏó
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;//Direct3dÉ豸¶ÔÏó
IDirect3DVertexBuffer9  *g_pVB = NULL;
int g_RotateY = 0;

struct CUSTOMVERTEX {
 float x, y, z;
 DWORD color;
};

#define D3DFVF_CUSTOVMVERTEX    (D3DFVF_XYZ | D3DFVF_DIFFUSE)

//³õʼ»¯Direct3D
HRESULT init3D(HWND hWnd)
{
 //´´½¨Direct3D¶ÔÏ󣬸öÔÏóÓÃÀ´´´½¨Direct3DÉ豸¶ÔÏó
 if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
 {
  return E_FAIL;
 }

 //ÉèÖÃD3DPERSENT_PARAMETERS½á¹¹£¬×¼±¸´´½¨Direct3DÉ豸¶ÔÏó
 D3DPRESENT_PARAMETERS d3dpp;
 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)))
 {
  return E_FAIL;
 }

 g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
 g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, false);

 return S_OK;
}

void SetupMatrices()
{
 //°ÑÐýת½Ç»»Ëã³É»¡¶È
 float angle = g_RotateY * D3DX_PI / 180;

 D3DXMATRIX matWorld;
 //¼ÆËãÊÀ½ç±ä»»¾ØÕó
 ::D3DXMatrixRotationY( &matWorld, angle );

 //°ÑÊÀ½ç±ä»»¾ØÕóÉèÖõ½äÖȾ»·¾³
 g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);

 D3DXVECTOR3 eye( 0.0f, 0.0f,-5.0f ); //¹Û²ìµã
 D3DXVECTOR3 lookat( 0.0f, 0.0f, 0.0f ); //ÊÓÏßÄ¿±êµã
 D3DXVECTOR3 up( 0.0f, 1.0f, 0.0f ); //ÉÏ·½Ïò

 D3DXMATRIX matView;

 //¼ÆËãÊӽDZ任¾ØÕó
 ::D3DXMatrixLookAtLH( &matView, &eye, &lookat, &up );

 //°ÑÊӽDZ任¾ØÕóÉèÖõ½äÖȾ»·¾³
 g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );

 D3DXMATRIXA16 matProj;

 //¼ÆËã͸ÊÓͶӰ±ä»»¾ØÕó
 ::D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f);

 //°ÑͶӰ±ä»»¾ØÕóÉèÖõ½äÖȾ»·¾³
 g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
}

HRESULT initVB(void)
{
 CUSTOMVERTEX Vertex[] = {
              { -0.5f, -0.5f, -0.5f, D3DCOLOR_XRGB(255,0,0) }, //µãA£¬ºìÉ«
              { 0.0f, 0.5f, 0.0f, D3DCOLOR_XRGB(0,255,0) }, //µãB£¬ÂÌÉ«
              { 0.5f, -0.5f, -0.5f, D3DCOLOR_XRGB(0,255,255) },//µãC£¬Ç³À¶

     { -0.5f, -0.5f, -0.5f, D3DCOLOR_XRGB(0,255,0) }, //µãA£¬ºìÉ«
              { 0.0f, 0.5f, 0.0f, D3DCOLOR_XRGB(0,0,255) }, //µãB£¬ÂÌÉ«
              { 0.0f, -0.5f, 0.5f, D3DCOLOR_XRGB(0,255,255) },//µãC£¬Ç³À¶

              { 0.0f, 0.5f, 0.0f, D3DCOLOR_XRGB(255,0,0) }, //µãB£¬ÂÌÉ«
              { 0.5f, -0.5f, -0.5f, D3DCOLOR_XRGB(0,0,255) },//µãC£¬Ç³À¶
              { 0.0f, -0.5f, 0.5f, D3DCOLOR_XRGB(255,255,0) },//µãC£¬Ç³À¶

     { -0.5f, -0.5f, -0.5f, D3DCOLOR_XRGB(255,255,0) }, //µãA£¬ºìÉ«
              { 0.5f, -0.5f, -0.5f, D3DCOLOR_XRGB(0,0,255) },//µãC£¬Ç³À¶
              { 0.0f, -0.5f, 0.5f, D3DCOLOR_XRGB(0,0,255) },//µãC£¬Ç³À¶
 };

 if(FAILED(g_pd3dDevice->CreateVertexBuffer(sizeof(Vertex), 0, D3DFVF_CUSTOVMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL))) {
  return E_FAIL;
 }

   void* pVertices;

   g_pVB->Lock( 0, sizeof(Vertex), (void**)&pVertices, 0 );
   memcpy( pVertices, Vertex, sizeof(Vertex) );
   g_pVB->Unlock();

 return S_OK;
}

//ÊÍ·Å´´½¨¶ÔÏó
void cleanUp()
{
 if(NULL != g_pVB){
  g_pVB->Release();
 }
 //ÊÍ·ÅDirect3DÉ豸¶ÔÏó
 if (g_pd3dDevice != NULL)
 {
  g_pd3dDevice->Release();
 }
 //ÊÍ·ÅDirect3D¶ÔÏó
 if (g_pD3D != NULL)
 {
  g_pD3D->Release();
 }
}

//äÖȾͼÐÎ
VOID render()
{
 //Çå¿Õºǫ́»º³åÇø
 g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(45,50,170),1.0f,0);
 if (SUCCEEDED(g_pd3dDevice->BeginScene()))
 {
  //ÔÚºǫ́»º³åÇø»æÖÆͼÐÎ
  SetupMatrices();
  g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX));
  g_pd3dDevice->SetFVF(D3DFVF_CUSTOVMVERTEX);
  g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 4);

  //½áÊøÔÚºǫ́»º³åÇøäÖȾͼÐÎ
  g_pd3dDevice->EndScene();
 }
 //½«ÔÚºǫ́»º³åÇø»æÖƵÄͼÐÎÌá½»µ½Ç°Ì¨»º³åÇøÏÔʾ
 g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
}

//ÏûÏ¢´¦Àí
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 switch (msg)
 {
 case WM_DESTROY:
  cleanUp();
  KillTimer(hWnd, 1);
  PostQuitMessage(0);
  return 0;
 default:
  break;
 }
 return DefWindowProc(hWnd, msg, wParam, lParam);
}

VOID CALLBACK TimerProc(HWND hwnd,
      UINT uMsg,
      UINT_PTR idEvent,
      DWORD dwTime
)
{
 render();
 g_RotateY += 2;
 g_RotateY = g_RotateY % 1000;
}

//³ÌÐòÈë¿Ú
INT WINAPI WinMain(HINSTANCE hInst,
   HINSTANCE,
   LPTSTR,
   INT)
{
 //×¢²á´°¿ÚÀà
 WNDCLASSEX wc = {sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,GetModuleHandle(NULL),
 NULL,NULL,NULL,NULL,"ClassName",NULL};

 RegisterClassEx( &wc );

 //´´½¨´°¿Ú
 HWND hWnd = CreateWindow("ClassName","×î¼òµ¥µÄ",
 WS_OVERLAPPEDWINDOW,200,100,600,500,
 NULL,NULL,wc.hInstance,NULL);

 //³õʼ»¯Direct3D
 if (SUCCEEDED(init3D(hWnd)))
 {
  if(SUCCEEDED(initVB())) {
   //ÏÔʾÖ÷´°¿Ú
   ShowWindow(hWnd,SW_SHOWDEFAULT);
   UpdateWindow(hWnd);
   g_RotateY = 0;
   SetTimer(hWnd, 1, 100, TimerProc);
   //½øÈëÏûϢѭ»·
   MSG msg;
   ZeroMemory(&msg,sizeof(msg));
   while (msg.message != WM_QUIT)
   {
    if (PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
    {
     TranslateMessage(&msg);
     DispatchMessage(&msg);
    }
   }
  }
 }

 UnregisterClass("ClassName",wc.hInstance);

 return 0;
}

 

原创粉丝点击