Directx9学习(八)初识texture(3)

来源:互联网 发布:影子网络真的很恐怖吗 编辑:程序博客网 时间:2024/06/08 02:58

2017.08.31

今天了解一下对Sprite进行矩阵变换

对一个Sprite进行矩阵操作,可以对他一次性的进行平移,旋转,缩放,还是非常犀利的。

我们需要构造一个矩阵,然后设置这个矩阵,最后对Sprite做一个矩阵变换,就能得到想要的效果。

比较重要的变换函数:D3DXMatrixTransformation2D

D3DXMATRIX* WINAPI D3DXMatrixTransformation2D( D3DXMATRIX *pOut, CONST D3DXVECTOR2* pScalingCenter,         FLOAT ScalingRotation, CONST D3DXVECTOR2* pScaling,         CONST D3DXVECTOR2* pRotationCenter,         FLOAT Rotation,         CONST D3DXVECTOR2* pTranslation );



这个函数传递的参数:矩阵指针(会在这里给矩阵赋值),缩放中心点,旋转缩放值,缩放大小,中心点,旋转弧度,平移。

首先需要创建矩阵,这个矩阵由16个浮点数组成,排成4行4列,包含了对Sprite进行的变换

D3DXMATRIX matrix; //矩阵
这个矩阵会在后面写好平移旋转缩放后由上面的函数填充完成

然后是缩放和旋转中心,都是D3DXVECTOR2类型的变量,分别表示x和y上的缩放值和以哪个点位中心进行旋转,这个中心和缩放有关

D3DXVECTOR2 scale(1.0f, 1.0f); //缩放大小D3DXVECTOR2 center(0.0f, 0.0f); //旋转中心
先声明,后面再修改


然后是旋度数,d3d对于旋转角是用的弧度制表示,所以在定义旋转角度(我们习惯用角度degree)后再定义一个函数将角度转为弧度

float rotationDeg = 0.0f; //弧度const float pi = 3.14159;const float pi_under_180 = pi / 180.0f;//角度转弧度float Deg2Rad(float degree){return degree * pi_under_180;}


然后是平移,将图片沿着x和y平移多少个单位(相对于世界而不是自身),是D3DXVECTOR2类型

D3DXVECTOR2 trans(0.0f, 0.0f); //平移


接着就可以给矩阵赋值了

D3DXMatrixTransformation2D(&matrix, NULL, 0.0f, &scale, ¢er, rotationRad, &trans);
//第二个参数一般设置为空,它的效果可以由平移达到,第三个参数不知道什么效果,我试了好几个值都没有什么变化- -


最后利用

sprite->SetTransform(&matrix);
来进行最后的矩阵变换


最后在画的时候,Draw函数的第4个参数(位置参数)最好不要用(最好写成NULL),因为是用矩阵变换来处理

sprite->Draw(texture, NULL, NULL, NULL, D3DCOLOR_XRGB(255, 255, 255));


下面是几个对比

原图:


缩放到和窗口一样大

float scaleX = (float)SCREENW / (float)info.Width;float scaleY = (float)SCREENH / (float)info.Height;scale = D3DXVECTOR2(scaleX , scaleY ); //缩放大小



缩放2倍+平移100,100+旋转45度


基本的操作就是这样,然后我试了一下D3DXMatrixTransformation2D的第二个参数,也就是缩放中心点:

这是放大2倍以后的图像:


当我把第二个参数设置为 D3DXVECTOR2(100,100) 的时候(这里应该是一个地址):


然后把它设置成D3DXVECTOR2(0,0),然后设置平移变量trans = D3DXVECTOR2(-100,-100);

结果和上图一样



所以这第二个参数一般都置位NULL(或(0,0)),然后利用平移来修改位置。



原创粉丝点击