您的位置:首页 > 其它

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

2009-07-31 00:13 483 查看
我的目标是建立一个四面体来完成这种立体界面效果,并使它沿着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 );
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: