//=============================================================================
//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:顶点结构
//-----------------------------------------------------------------------------
structCUSTOMVERTEX

{
D3DXVECTOR3position;
DWORDcolor;
};
#defineD3DFVF_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;
//初始化Direct3D
if(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;
}
本文介绍了一个使用Direct3D实现动态坐标变换的示例程序,包括如何设置世界矩阵、观察矩阵和投影矩阵,以及如何渲染图形。通过绕X轴旋转的动态效果展示了三维空间中的坐标变换原理。
5292

被折叠的 条评论
为什么被折叠?



