ID3DXSprite :: Draw 实现平移旋转等方法

2014/10/10

(转载自:http://blog.csdn.net/rabbit729/article/details/7984803

接口原型描述如下:
HRESULT Draw(
  LPDIRECT3DTEXTURE9pTexture,
  CONST RECT *pSrcRect,
  CONST D3DXVECTOR3 *pCenter,
  CONST D3DXVECTOR3 *pPosition,
  D3DCOLORColor);
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.
下面给出在pCenter和pPosition为不同参数时的输出结果:
D3DXVECTOR3 vCenter = D3DXVECTOR3(0.f, 0.f, 0.f);
D3DXVECTOR3 vPosion = D3DXVECTOR3(0.f, 0.f, 0.f);
D3DXVECTOR3 vCenter = D3DXVECTOR3(64.f, 64.f, 0.f);
D3DXVECTOR3 vPosion = D3DXVECTOR3(0.f, 0.f, 0.f);
D3DXVECTOR3 vCenter = D3DXVECTOR3(64.f, 64.f, 0.f);
D3DXVECTOR3 vPosion = D3DXVECTOR3(400.f, 3000.f, 0.f);
通过上述三种情况可以看出,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);
 
通过上述例子可以看出,SetTransform设置的变换是以屏幕左上角为中心变换的。还需要注意的是在每次调用SetTransform时最好使用g_pSprite->GetTransform(&matOld);保存之前的变换,等Draw结束后再设置回来,以防止出现相互影响。
 
上述的讲解都是基于ID3DXSprite::Begin()未指定D3DXSPRITE_OBJECTSPACE标志的情况下,也就是以屏幕为坐标系的情况下,如果设置了D3DXSPRITE_OBJECTSPACE标志,上述描述不具备参考性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值