我的目标是建立一个四面体来完成这种立体界面效果,并使它沿着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 );