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

xiaoxiao2021-02-28  66

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

转载请注明原文地址: https://www.6miu.com/read-25740.html

最新回复(0)