第二个Direct3D程序——旋转的正方体

本文介绍了一个基于Direct3D的三维图形渲染程序的改进版本,通过更新顶点和索引缓冲区来绘制一个旋转的立方体。该程序实现了动态世界变换,并通过调整观察和投影矩阵来改善视觉效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上一个三角形程序的基础上改了两个函数,具体如下:

 

HRESULT hero::Load()
{
 VOID *pVertices;
 WORD *pIndices;
 MYVERTEX cVertices[]=
 {
  {1.0f,1.0f,-1.0f,0xffff0000,},
  {1.0f,-1.0f,-1.0f,0xff00ff00,},
  {-1.0f,-1.0f,-1.0f,0xff0000ff,},
  {-1.0f,1.0f,-1.0f,0xffffffff,},
  {-1.0f,1.0f,1.0f,0xffff0000,},
  {-1.0f,-1.0f,1.0f,0xff00ff00,},
  {1.0f,-1.0f,1.0f,0xff0000ff,},
  {1.0f,1.0f,1.0f,0xffffffff,},
 };
 WORD cIndices[]=
 {
  0,1,2,0,2,3,
  0,3,4,0,4,7,
  4,5,6,4,6,7,
  1,6,5,1,5,2,
  3,2,5,3,5,4,
  7,6,1,7,1,0
 };

 

 if(FAILED(m_pD3DDevice->CreateVertexBuffer(8*sizeof(MYVERTEX),0,MYFVF,D3DPOOL_DEFAULT,&m_pVB,NULL)))
  return E_FAIL;
 if(FAILED(m_pD3DDevice->CreateIndexBuffer(36*sizeof(WORD),0,D3DFMT_INDEX16,D3DPOOL_DEFAULT,&m_pIB,NULL)))
  return E_FAIL;
 if(FAILED(m_pVB->Lock(0,sizeof(cVertices),(void **)&pVertices,0))) return E_FAIL;
 memcpy(pVertices,cVertices,sizeof(cVertices));
 m_pVB->Unlock();
 if(FAILED(m_pIB->Lock(0,sizeof(cIndices),(void **)&pIndices,0))) return E_FAIL;
 memcpy(pIndices,cIndices,sizeof(cIndices));
 m_pIB->Unlock();

 

 return S_OK;
}

 

HRESULT hero::Render()
{
 if(m_pD3DDevice==NULL) return E_FAIL;

 

 m_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,0xff000000,1.0f,0);
 m_pD3DDevice->BeginScene();

 

 m_pD3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE);

 

 //世界变换
 D3DXMATRIX matWorld;
 UINT iTime=timeGetTime()%1000;
 FLOAT fSpeed=iTime*D3DX_PI/1000.0f;
 D3DXMatrixRotationY(&matWorld,fSpeed);
 m_pD3DDevice->SetTransform(D3DTS_WORLD,&matWorld);

 

 //观察变换
 D3DXVECTOR3 vEye(0.0f,4.0f,-4.0f);
 D3DXVECTOR3 vLook(0.0f,0.0f,0.0f);
 D3DXVECTOR3 vUp(0.0f,1.0f,1.0f);
 D3DXMATRIX matView;
 D3DXMatrixLookAtLH(&matView,&vEye,&vLook,&vUp);
 m_pD3DDevice->SetTransform(D3DTS_VIEW,&matView);

 

 //投影变换
 D3DXMATRIX matProj;
 D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/3,1.0f,0.5f,100.0f);
 m_pD3DDevice->SetTransform(D3DTS_PROJECTION,&matProj);

 

 m_pD3DDevice->SetStreamSource(0,m_pVB,0,sizeof(MYVERTEX));
 m_pD3DDevice->SetFVF(MYFVF);
 m_pD3DDevice->SetIndices(m_pIB);
 m_pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,8,0,12);

 

 m_pD3DDevice->EndScene();
 m_pD3DDevice->Present(NULL,NULL,NULL,NULL);

 return S_OK;
}

 

效果如图:

 

程序下载地址(EXE):

http://www.brsbox.com/filebox/down/fc/33f6eb2bf77b93da7fa80ecb51c3e9f9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值