|
|

楼主 |
发表于 2007-2-24 19:09:00
|
显示全部楼层
Re:摄像机类及演示
下面是一个使用CCamera的例子。
鼠标的控制和CS一样。a,s,d,w这个不用解释了把。r,f是向上,下
注意的是,j,l,是向左右旋转,但和鼠标不一样,
j,l,是围绕摄像机自己的Y轴(Up向量)旋转,而鼠标向左,右,总是围绕(0,1,0)向量旋转。
i,k,和鼠标的上下一样。都是围绕摄像机自己的X轴(Right向量)旋转。
u,o,像开飞机一样,左右翻滚。都是围绕摄像机自己的Z轴(Look向量)旋转。
//app.cpp
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"winmm.lib")
#include <d3d9.h>
#include <d3dx9.h>
#include "Mouse.h"
#include "camera.h"
const float PI=3.14159265358f;
void Cleanup();
void Initd3d(HWND hwnd);
void OnKeyDown(WORD KeyCode);
LRESULT WINAPI WinProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam);
void Render();
void FrameMove();
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR CmdLine,int nShowCmd);
CCamera* g_pCamera;
CMouse* g_pMouse;
long g_mouseX,g_mouseY;
HWND g_hwnd=0;
//D3DXMATRIXA16 g_matTrans;
LPDIRECT3D9 g_pd3d=0;
LPDIRECT3DDEVICE9 g_pdev=0;
LPDIRECT3DDEVICE9 g_pdev2=0;
LPDIRECT3DVERTEXBUFFER9 g_pvb=0;
LPDIRECT3DINDEXBUFFER9 g_pib=0;
LPDIRECT3DVERTEXBUFFER9 g_pvb2=0;
LPDIRECT3DINDEXBUFFER9 g_pib2=0;
typedef struct
{
FLOAT x,y,z;
DWORD color;
}CUSTOMVERTEX;
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
#define TURE -1;
#define TRY(x) if(FAILED(x))MessageBox(0,"failed!","",0)
void Initd3d(HWND hwnd)
{
if(!(g_pd3d=Direct3DCreate9(D3D_SDK_VERSION))) MessageBox(0,"err","",0);
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed=TURE;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;
TRY(g_pd3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pdev));
////
g_pCamera=new CCamera(0,0,-50.0f);
}
void InitDraw()
{
TRY(g_pdev->CreateVertexBuffer(8*sizeof(CUSTOMVERTEX),D3DUSAGE_WRITEONLY,D3DFVF_CUSTOMVERTEX,
D3DPOOL_MANAGED,&g_pvb,0));
TRY(g_pdev->CreateIndexBuffer(36*sizeof(WORD),D3DUSAGE_WRITEONLY,D3DFMT_INDEX16,
D3DPOOL_MANAGED,&g_pib,0));
const float len=10.0f;
CUSTOMVERTEX source_vertices[]={
{-len,-len,-len,D3DCOLOR_XRGB(255,0,0)},
{-len, len,-len,D3DCOLOR_XRGB(0,255,0)},
{ len, len,-len,D3DCOLOR_XRGB(0,0,255)},
{ len,-len,-len,D3DCOLOR_XRGB(255,255,0)},
{-len,-len, len,D3DCOLOR_XRGB(255,0,255)},
{-len, len, len,D3DCOLOR_XRGB(0,255,255)},
{ len, len, len,D3DCOLOR_XRGB(0,0,0)},
{ len,-len, len,D3DCOLOR_XRGB(255,255,255)},
};
CUSTOMVERTEX* pVertices;
TRY(g_pvb->Lock(0,8*sizeof(CUSTOMVERTEX),(void**)&pVertices,0));
memcpy(pVertices,source_vertices,8*sizeof(CUSTOMVERTEX));
g_pvb->Unlock();
/////////////ib///////////////
WORD* indices=0;
WORD tmpindices[]={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};
g_pib->Lock(0,0,(void**)&indices,0);
memcpy(indices,tmpindices,36*sizeof(WORD));
g_pib->Unlock();
//////////////////////////
g_pdev->SetRenderState(D3DRS_LIGHTING,FALSE);
}
void Cleanup()
{
delete g_pMouse;
delete g_pCamera;
if(g_pvb)g_pvb->Release();
if(g_pdev)g_pdev->Release();
if(g_pd3d)g_pd3d->Release();
}
void FrameMove()
{
g_pdev->SetTransform(D3DTS_VIEW,&g_pCamera->GetViewMat());
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI*0.5f,(float)800/(float)600,1.0f,1000.0f);
g_pdev->SetTransform(D3DTS_PROJECTION,&matProj);
/////
D3DXMATRIXA16 mat;
D3DXMatrixIdentity(&mat);
D3DXMatrixRotationY(&mat,timeGetTime()/300.0f);
g_pdev->SetTransform(D3DTS_WORLD,&mat);
}
void Render()
{
g_pdev->Clear(0,0,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0);
g_pdev->BeginScene();
{
g_pdev->SetStreamSource(0,g_pvb,0,sizeof(CUSTOMVERTEX));
g_pdev->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pdev->SetIndices(g_pib);
g_pdev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,8,0,12);
}
g_pdev->EndScene();
/////////////////////
g_pdev-> resent(0,0,0,0);
}
LRESULT WINAPI WinProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
switch(msg)
{
case WM_KEYDOWN:
OnKeyDown(wparam);
break;
case WM_MOUSEMOVE:
if(!g_pMouse)g_pMouse=new CMouse((float)g_mouseX,(float)g_mouseY,PI*0.001f,PI*0.001f);
float retx,rety;
g_pMouse->MovePos((float)g_mouseX,(float)g_mouseY,&retx,&rety);
g_pCamera->Rotate(rety,0,0);
g_pCamera->RotateByWorld(0,retx,0);
break;
case WM_DESTROY:
Cleanup();
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,msg,wparam,lparam);
}
|
|