代码已给出 怎么生成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);

}
}


...全文
251 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
再见理想~ 2012-05-02
  • 打赏
  • 举报
回复
这代码看这就面熟!
三条猫 2012-05-02
  • 打赏
  • 举报
回复
楼主学那本封面是龙的dx教程吧,写得很好,代码也很清楚
ryfdizuo 2012-05-02
  • 打赏
  • 举报
回复
仙妮欧亚 2012-05-01
  • 打赏
  • 举报
回复
书的电子档我有
仙妮欧亚 2012-05-01
  • 打赏
  • 举报
回复
这是一本书里面的代码 讲的是生成3D旋转立方体 这本书名字叫Visual C++游戏开发技术与实例 思维科技 编著 对这个比较感兴趣 哪个教下我怎么弄

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧