使用D3DMobile组件在WM6系统中建立立体界面切换效果

我的目标是建立一个四面体来完成这种立体界面效果,并使它沿着Y轴做旋转.

完成这个效果,首先建立顶点数据结构:

struct TEXTTRUECOLUMNVERTEX
{
 D3DMXVECTOR3FXD position; 
 D3DMXVECTOR3FXD normal;   
 FIXED       tu, tv; 
};

 

这个结构是最常用的顶点数据结构,这是一个实数坐标结构,为了方便运算,使用实数运算,而放弃浮点运算.position是顶点的三维坐标,normal是顶点法线,就是与顶点切线成90度角的矢量线段,用于指示贴图,tu,tv是贴图坐标.

 

我的成员变量:

 LPDIRECT3DMOBILEDEVICE m_pDDMDevice;
 LPDIRECT3DMOBILEVERTEXBUFFER m_pVB;
 LPDIRECT3DMOBILEINDEXBUFFER m_pVBIndex;
 LPDIRECT3DMOBILE        m_pD3DM;
 LPDIRECT3DMOBILETEXTURE m_pTexture;
 HMODULE                 m_hRefDLL;
 UINT m_iTime;
 UINT m_dynNum;

 

实例化顶点接口

 if( FAILED( m_pDDMDevice->CreateVertexBuffer( 5*2*sizeof(TEXTTRUECOLUMNVERTEX),
  0, D3DMFVF_CUSTOMVERTEXCOLUMTEXTTRUE,
  pool, &m_pVB ) ) )
 {
  return E_FAIL;
 }

这个立体图形的顶点结构为:

//-----------------------------1--------------------------------

pVertices[0].position = D3DMXVECTOR3FXD( -1.0f, 1.0f, -1.0f );
 pVertices[0].normal   = D3DMXVECTOR3FXD( -1.0f, 0.0f, -1.0f );
 pVertices[0].tu       = D3DMXToFixed(0.0f);
 pVertices[0].tv       = D3DMXToFixed(0.0f);

 pVertices[1].position = D3DMXVECTOR3FXD( -1.0f, -1.0f, -1.0f );
 pVertices[1].normal   = D3DMXVECTOR3FXD( -1.0f, 0.0f, -1.0f );
 pVertices[1].tu       = D3DMXToFixed(0.0f);
 pVertices[1].tv       = D3DMXToFixed(1.0f);

 //--------------------------2------------------------------------------
 pVertices[2].position = D3DMXVECTOR3FXD( 1.0f, 1.0f, -1.0f );
 pVertices[2].normal   = D3DMXVECTOR3FXD( 1.0f, 0.0f, -1.0f  );
 pVertices[2].tu       = D3DMXToFixed(0.25f);
 pVertices[2].tv       = D3DMXToFixed(0.0f);

 pVertices[3].position = D3DMXVECTOR3FXD( 1.0f, -1.0f, -1.0f );
 pVertices[3].normal   = D3DMXVECTOR3FXD( 1.0f, 0.0f, -1.0f  );
 pVertices[3].tu       = D3DMXToFixed(0.25f);
 pVertices[3].tv       = D3DMXToFixed(1.0f);

 //--------------------------3------------------------------------------
 pVertices[4].position = D3DMXVECTOR3FXD( 1.0f, 1.0f, 1.0f  );
 pVertices[4].normal   = D3DMXVECTOR3FXD( 1.0f, 0.0f, 1.0f );
 pVertices[4].tu       = D3DMXToFixed(0.5f);
 pVertices[4].tv       = D3DMXToFixed(0.0f);

 pVertices[5].position = D3DMXVECTOR3FXD( 1.0f, -1.0f, 1.0f );
 pVertices[5].normal   = D3DMXVECTOR3FXD( 1.0f, 0.0f, 1.0f );
 pVertices[5].tu       = D3DMXToFixed(0.5f);
 pVertices[5].tv       = D3DMXToFixed(1.0f);

 //--------------------------4------------------------------------------
 pVertices[6].position = D3DMXVECTOR3FXD( -1.0f, 1.0f, 1.0f  );
 pVertices[6].normal   = D3DMXVECTOR3FXD( -1.0f, 0.0f, 1.0f  );
 pVertices[6].tu       = D3DMXToFixed(0.75f);
 pVertices[6].tv       = D3DMXToFixed(0.0f);

 pVertices[7].position = D3DMXVECTOR3FXD( -1.0f, -1.0f, 1.0f );
 pVertices[7].normal   = D3DMXVECTOR3FXD( -1.0f, 0.0f, 1.0f );
 pVertices[7].tu       = D3DMXToFixed(0.75f);
 pVertices[7].tv       = D3DMXToFixed(1.0f);

 //--------------------------5------------------------------------------
 pVertices[8].position = D3DMXVECTOR3FXD( -1.0f, 1.0f, -1.0f );
 pVertices[8].normal   = D3DMXVECTOR3FXD( -1.0f, 0.0f, -1.0f );
 pVertices[8].tu       = D3DMXToFixed(1.0f);
 pVertices[8].tv       = D3DMXToFixed(0.0f);

 pVertices[9].position = D3DMXVECTOR3FXD( -1.0f, -1.0f, -1.0f );
 pVertices[9].normal   = D3DMXVECTOR3FXD( -1.0f, 0.0f, -1.0f );
 pVertices[9].tu       = D3DMXToFixed(1.0f);
 pVertices[9].tv       = D3DMXToFixed(1.0f);

共十个顶点,有人会说是8个顶点啊!还有两个顶点用来做闭合操作,将这些顶点填入顶点指针,需要调用:

 

解出Y轴旋转矩阵,这是当实体做旋转时算出的旋转后的矩阵数据,可以做为动画部分

D3DMXMATRIXFXD matWorld;

D3DMXMatrixRotationYFxd( &matWorld, D3DMXToFixed(fAngle) );

m_pDDMDevice->SetTransform( D3DMTS_WORLD, (D3DMMATRIX*)&matWorld, D3DMFMT_D3DMVALUE_FIXED )

解出视角矩阵,这是摄像机位置设定后,实体在摄像机位置看到的位置矩阵,可以做为动画部分

D3DMXMATRIXFXD matView;

D3DMXMatrixLookAtLHFxd( &matView, &vEyePt, &vLookatPt, &vUpVec );
 m_pDDMDevice->SetTransform( D3DMTS_VIEW, (D3DMMATRIX*)&matView, D3DMFMT_D3DMVALUE_FIXED );

解出透视矩阵,这是立体化矩阵,根据取景框的设定,求出立体化矩阵

D3DMXMATRIXFXD matProj;
 D3DMXMatrixPerspectiveFovLHFxd( &matProj, D3DMXToFixed(D3DMX_PI/7.0f), D3DMXToFixed(1.0f),
  D3DMXToFixed(1.0f), D3DMXToFixed(100.0f) );
 m_pDDMDevice->SetTransform( D3DMTS_PROJECTION, (D3DMMATRIX*)&matProj, D3DMFMT_D3DMVALUE_FIXED );

现在我们操作贴图,实例化位图接口指针:

if( FAILED( rcnum=D3DMXCreateTextureFromResourceEx( m_pDDMDevice, GetModuleHandle(_T("Effect3d")),
  MAKEINTRESOURCE(IDB_MAINUI), D3DMX_DEFAULT, D3DMX_DEFAULT, 1, 0,
  D3DMFMT_UNKNOWN, texpool, D3DMX_FILTER_POINT, D3DMX_FILTER_POINT,
  0, NULL, NULL, &m_pTexture ) ) )
 {
  return E_FAIL;
 }

 

置入位图到device,并设定参数
m_pDDMDevice->SetTexture( 0, m_pTexture );
m_pDDMDevice->SetTextureStageState( 0, D3DMTSS_COLOROP,   D3DMTOP_MODULATE );
m_pDDMDevice->SetTextureStageState( 0, D3DMTSS_COLORARG1, D3DMTA_TEXTURE );
m_pDDMDevice->SetTextureStageState( 0, D3DMTSS_COLORARG2, D3DMTA_DIFFUSE );
m_pDDMDevice->SetTextureStageState( 0, D3DMTSS_ALPHAOP,   D3DMTOP_DISABLE );

在缓存中画图像:

// Render the vertex buffer contents
  m_pDDMDevice->SetStreamSource( 0, m_pVB, sizeof(TEXTTRUECOLUMNVERTEX) );
  m_pDDMDevice->DrawPrimitive( D3DMPT_TRIANGLESTRIP, 0, 2*5-2 );

输出到显示

 m_pDDMDevice->Present( NULL, NULL, NULL, NULL );

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值