代码已给出 怎么生成3D旋转立方体
仙妮欧亚 2012-05-01 04:30:02 struct CUSTOMVERTEX
{
float x,y,z;
Dword colour;
}
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ_DIFFUSE)
HRESULT InitialiseVertexBuffer()
{
void* pVertices;
//存储立方体中每个顶点和其颜色
//确保多边形顶点是按顺时针方向排列的
//逆时针面将被剔除
CUSTOMVERTEX cvVertices[]=
{
//顶面
{-5.0f,5.0f,-5.0f,D3DCOLOR_XRGB(0,0,255);};//Vertex 0 -blue
{-5.0f,5.0f,5.0f,D3DCOLOR_XRGB(255,0,0);};//Vertex 1 -red
{5.0f,5.0f,-5.0f,D3DCOLOR_XRGB(255,0,0);};//Vertex 2 -red
{5.0f,5.0f,5.0f,D3DCOLOR_XRGB(0,255,0);};//Vertex 3 -green
//侧面1
{-5.0f,-5.0f,-5.0f,D3DCOLOR_XRGB(255,0,0);};//Vertex 4 -red
{-5.0f,5.0f,-5.0f,D3DCOLOR_XRGB(0,0,255);};//Vertex 5 -blue
{5.0f,-5.0f,-5.0f,D3DCOLOR_XRGB(0,255,0);};//Vertex 6 -green
{5.0f,5.0f,-5.0f,D3DCOLOR_XRGB(255,0,0);};//Vertex 7 -red
//侧面2
{5.0f,-5.0f,5.0f,D3DCOLOR_XRGB(0,0,255);};//Vertex 8 -blue
{5.0f,5.0f,5.0f,D3DCOLOR_XRGB(0,255,0);};//Vertex 9 -green
//侧面3
{-5.0f,-5.0f,5.0f,D3DCOLOR_XRGB(0,255,0);};//Vertex 10 -green
{-5.0f,5.0f,5.0f,D3DCOLOR_XRGB(255,0,0);};//Vertex 11 -red
//侧面4
{-5.0f,-5.0f,-5.0f,D3DCOLOR_XRGB(255,0,0);};//Vertex 12 -red
{-5.0f,5.0f,-5.0f,D3DCOLOR_XRGB(0,0,255);};//Vertex 13 -blue
//底面
{5.0f,-5.0f,-5.0f,D3DCOLOR_XRGB(0,255,0);};//Vertex 14 -green
{5.0f,-5.0f,5.0f,D3DCOLOR_XRGB(0,0,255);};//Vertex 15 -blue
{-5.0f,-5.0f,-5.0f,D3DCOLOR_XRGB(255,0,0);};//Vertex 16 -red
{-5.0f,-5.0f,5.0f,D3DCOLOR_XRGB(0,255,0);};//Vertex 17 -green
};
//创建顶点缓冲
if(failed(g_pD3DDevice->CreateVertexBuffer(18 * sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,&g_pVertexBuffer)))
{
return e_fail;
}
//锁住顶点缓冲区
if(failed(g_pVertexBuffer->Lock(0,sizeof(cvVertices),(BYTE**)&pVertices,0)))
{
return e_fail;
}
//在顶点缓冲区中填入顶点数据
memcpy(pVertices,cvVertices,sizeof(cvVertices));
//解锁顶点缓冲区
g_pVertexBuffer->UnLock();
return S_OK;
}
void SetupRotation()
{
//旋转世界坐标X,Y,Z
D3DXMATRIX matWorldX,matWorldY,matWorldZ;
//创建变换矩阵
D3DXMATRIXRotationX(&matWorldX,timeGetTime()/400.0f);
D3DXMATRIXRotationY(&matWorldY,timeGetTime()/400.0f);
D3DXMATRIXRotationZ(&matWorldZ,timeGetTime()/400.0f);
//乘以变换矩阵
D3DXMarixMutiply(&matWorld,&matWorldX,&matWorldY);
D3DXMarixMutiply(&matWorld,&matWorld,&matWorldZ);
//应用变换
g_pD3DDevice->SetTransform(D3DTS_WORLD,&matWorld);
}
void SetupCamera()
{
//设置照相机
//照相机有三个设置:相机位置、视点和顶方向
D3DXMarix matVeiw;
D3DXMatrixLookAtLH(&matView,&D3DXVECTOR3(0.0f,0.0f,-30.0f),&D3DXVECTOR3(0.0f,0.0f,0.0f),&D3DXVECTOR3(0.0f,1.0f,0.0f));
g_pD3DDevice->SetTransform(D3DTS_VIEW,&matView);
}
void SetupPerspective()
{
//这里定义投影视图、比例、近处/远处的裁剪平面
D3DXMarix matProj
D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,1.0f,1.0f,500.0f);
g_pD3DDevice->SetTransform(D3DTS_PROJECTION,&matProj);
}
void Render()
{
if(g_pD3DDevice==null)
{
return;
}
//清楚后台缓冲为黑色
g_pD3DDevice->Clear(0,null,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
//开始场景
g_pD3DDevice->BeginScene();
//设置旋转,相机和投影矩阵
SetupRotation();
SetupCamera();
SetupPerspective();
//渲染对象
g_pD3DDevice->SetStreamSource(0, g_pVertexBuffer,sizeof(CUSTOMVERTEX));
g_pD3DDevice->SetVertexShader(D3DFVF_CUSTOMVERTEX);
g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);//top
g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,4,8);//sides
g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,14,2);//bottom
//终结场景
g_pD3DDevice->EndScence();
//交换前后缓冲区
g_pD3DDevice->Present(NULL,NULL,NULL);
}
}