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)),然后利用平移来修改位置。