上一节,我们介绍了什么是矩阵,
矩阵在DirectXGraphics中的作用,
以及怎样用API生成不同的矩阵(缩放,移动,旋转)。
这一节,我们进一步介绍一下矩阵:
1>怎样生成绕任意轴旋转的矩阵。
2>矩阵的合成。
复习上一节,
D3DXMatrixRotationX()生成绕X轴旋转的矩阵
D3DXMatrixRotationY()生成绕Y轴旋转的矩阵
D3DXMatrixRotationZ()生成绕Z轴旋转的矩阵
嗯,绕任意轴旋转的矩阵生成,我们用D3DXMatrixAxis(D3DXMATRIX * pOut,D3DXVECTOR3 *Rot,FLOAT Angle)
参数比上面三个API多了一个参数,第一个输出参数,就是生成的矩阵,
第二个参数为任意轴,
第三参数是旋转的角度,这个角度是一个弧度,DirectXGraphics为我们提供了一个API把角度转换成弧度:D3DXToRadian()。
以下是示例代码片段:
//产生单位矩阵
D3DXMatrixIdentity(&m_world);
//设定旋转轴向量
D3DXVECTOR3 mRot(1.0f,1.0f,0.0f);
//以任意轴为中心的旋转矩阵
D3DXMatrixRotaionAxis(&m_world,
&mRot,
D3DXToRatian(60.0f)
);
//将矩阵设定到Rendering pipeline
pD3DDevice->SetTransform(D3DTS_WORLD,&m_world);
二,矩阵的合成。
以上,我们分开套用了移动,旋转,缩放的矩阵,而事实上我们可以把几个矩阵合成起来,一次套用到模型上。
在合成的时候要注意,因为坐标转换是以原点为中心来进行处理,因此必须按 缩放->旋转->移动 这个顺序,
不然会出现奇怪的结果。
DixectxGraphics提供了D3DXMatrixMultiply(D3DXMATRIX * pOut, CONST D3DXMATRIX *pM1,CONST D3DXMATRIX *pM2)的函数来合成矩阵,
其中第一个是输出参数,输出合成后的矩阵,
第二三个参数,分别要被合成的矩阵。
代码示例如下:
1 //声明合成时使用的矩阵
2 D3DXMATRIX mScale;//缩放矩阵
3 D3DXMATRIX mRot ;//旋转矩阵
4 D3DXMATRIX mMove ;//移动矩阵
5
6 //缩放
7 D3DXMatrixScaling(&mScale, 2.0f, 0.5f, 1.0f);
8
9 //旋转
10 D3DMatrixRotationY(&mRot, D3DXToRadian(45.0f));
11
12 //移动
13 D3DMatrixTranslation(&mMove,4.0f, 3.0f, 0.0f);
14
15 //生成单位矩阵
16 D3DXMatrixIdentity(&m_world);
17
18 //合成一: 缩放与旋转
19 D3DXMTRIX tempMult;
20 D3DXMatrixMultiply(&tempMult, &mScale, &mRot);
21
22 //合成二: 合成一与移动
23 D3DXMatrixMultiply(&m_world, &tempMult,&mMove);
24
25 //把移动设定到Rendering pipeline
26 pD3DDevice->SetTransform(D3DTS_WORD,&m_world);