ID3DXSprite::Draw()接口备忘

接口原型描述如下:
HRESULT Draw(
  LPDIRECT3DTEXTURE9 pTexture,
  CONST RECT * pSrcRect,
  CONST D3DXVECTOR3 * pCenter,
  CONST D3DXVECTOR3 * pPosition,
  D3DCOLOR Color
);
PTexture:需要往Backbuffer上面绘制的Texture;
pSrcRect:pTexture需要绘制的区域,如果为NULL,全部绘制;
pCenter:pTexture的中心,是以pTexture左上角为坐标原点;
pPosition:pTexture需要绘制的位置,以backbuffer左上角为中心;
Color:该值用来乘以pTexture的颜色分量,通常为0xffffffff,不影响pTexture的颜色;
 
下面介绍一下在ID3DXSprite::Begin()未指定D3DXSPRITE_OBJECTSPACE标志,也就是在屏幕坐标系下绘制的情况:
此处的精灵图片是一个128*128大小的图片,如下图,例子中给出的Backbuffer大小为800*600.
ID3DXSprite::Draw()接口备忘_第1张图片
下面给出在pCenter和pPosition为不同参数时的输出结果:
D3DXVECTOR3 vCenter = D3DXVECTOR3(0.f, 0.f, 0.f);
D3DXVECTOR3 vPosion = D3DXVECTOR3(0.f, 0.f, 0.f);
ID3DXSprite::Draw()接口备忘_第2张图片
D3DXVECTOR3 vCenter = D3DXVECTOR3(64.f, 64.f, 0.f);
D3DXVECTOR3 vPosion = D3DXVECTOR3(0.f, 0.f, 0.f);
ID3DXSprite::Draw()接口备忘_第3张图片
D3DXVECTOR3 vCenter = D3DXVECTOR3(64.f, 64.f, 0.f);
D3DXVECTOR3 vPosion = D3DXVECTOR3(400.f, 3000.f, 0.f);
ID3DXSprite::Draw()接口备忘_第4张图片
通过上述三种情况可以看出,pCenter是以图片自身左上角为原点的,并且pPosition指定了图片在backbuffer中的位置,也就是pCenter放置的位置。
下面介绍一下ID3DSSprite::SetTransform(),该接口指定了绘制时如何对PTexture做变换,注意变换的中心是以屏幕左上角为中心的。下面给出接个例子:
D3DXVECTOR3 vCenter = D3DXVECTOR3(64.f, 64.f, 0.f);
D3DXVECTOR3 vPosion = D3DXVECTOR3(400.f, 3000.f, 0.f);
 
//旋转矩阵
 D3DXMATRIX R;
 D3DXMatrixRotationZ(&R, 0.7f);
 g_pSprite->SetTransform(&R);
D3DXVECTOR3 vCenter = D3DXVECTOR3(64.f, 64.f, 0.f);
D3DXVECTOR3 vPosion = D3DXVECTOR3(400.f, 3000.f, 0.f);

//平移矩阵  D3DXMATRIX T, TInv;  D3DXMatrixTranslation(&T, -400.f, -300.f, 0.f);  D3DXMatrixInverse(&TInv, NULL, &T);

 //旋转矩阵  D3DXMATRIX R;  D3DXMatrixRotationZ(&R, 0.7f);

 //放缩矩阵  D3DXMATRIX S;  D3DXMatrixScaling(&S, 1.5f, 1.5f, 1.f);

 D3DXMATRIX Trans;  D3DXMatrixIdentity(&Trans);

 Trans = T * R * TInv;

g_pSprite->SetTransform(&Trans);
ID3DXSprite::Draw()接口备忘_第5张图片
 
通过上述例子可以看出,SetTransform设置的变换是以屏幕左上角为中心变换的。还需要注意的是在每次调用SetTransform时最好使用g_pSprite->GetTransform(&matOld);保存之前的变换,等Draw结束后再设置回来,以防止出现相互影响。
 
上述的讲解都是基于ID3DXSprite::Begin()未指定D3DXSPRITE_OBJECTSPACE标志的情况下,也就是以屏幕为坐标系的情况下,如果设置了D3DXSPRITE_OBJECTSPACE标志,上述描述不具备参考性。

你可能感兴趣的:(null)