狂想的天空

狂想,只要你想!

C++博客 首页 新随笔 联系 聚合 管理
  21 Posts :: 0 Stories :: 2 Comments :: 0 Trackbacks
上一节,我们介绍了什么是矩阵,
矩阵在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.0f0.5f1.0f);
 8 
 9 //旋转
10 D3DMatrixRotationY(&mRot, D3DXToRadian(45.0f));
11 
12 //移动
13 D3DMatrixTranslation(&mMove,4.0f3.0f0.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);





posted on 2008-12-20 17:42 狂之想 阅读(470) 评论(0)  编辑 收藏 引用 所属分类: 2D,3D

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


//