资源预览内容
第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
亲,该文档总共8页全部预览完了,如果喜欢就下载吧!
资源描述
DirectX Tutorialswww.andypike.comBy Andy Pike第五章:矩阵变换Introduction (序)啊哈,新的一章又开始了!这一章我们要加深一下对矩阵的了解。正如以前提到过的,使用矩阵,你可以旋转、缩放或移动顶点(进而对整个对象也能做这些变换)。此章我们会看到怎样按照不同的方法来旋转五个立方体:绕x轴、绕y轴、绕z轴、绕自定义轴和绕所有轴。What are matrices and how do they work? (矩阵是什么和它们怎样工作)矩阵其实是一个高级的数学主题(参看线性代数),所以,在此我只能尽力地、简要地概括一下。矩阵就像是一个表格,有一定数目的行与列;每个格子中都一个数字或表达式。通过特定的矩阵,我们可以对3D对象中的顶点坐标进行运算,来实现类似移动、旋转、缩放这样的操作。在DirectX中,矩阵就是4X4的数表。下面的这幅图是一个矩阵的例子,这个矩阵能使一个对象(由它的所有顶点)缩放到原来的五倍。Fig 5.1 OK,矩阵是怎样改变顶点的位置的呢?要改变一个顶点的x,y与z值,你应该把它们与某个矩阵相乘。下面的图例演示了顶点是怎样与矩阵相乘的。Fig 5.2这其实是一种简单的计算,你只需要将x、y和z值分别与每列上的数相乘再相加,每列上得出的数都是新顶点的一个坐标值,这在上图中是显而易见的。你可能已经注意到我们上面的图例中在当前顶点(current vertex)的z值后面还有一个“1”,那是为了给矩阵的运算提供可行性和方便性的(最好参看一下相关的数学资料)。你需要同样数表来完成矩阵变换。所以,你只需操作矩阵就能完成这些类似旋转、缩放或移动的变幻。幸运的是,DirectX给我们提供了一些函数能方便地生成一些通常的矩阵。那末,怎样完成即缩放又旋转(复合变换)的变幻呢?嗯,首先,我们需要两个矩阵:一个用来旋转的一个用来缩放的;然后,我们把两个矩阵相乘,得出一个新的复合矩阵,即缩放又旋转的矩阵;然后利用这个新的矩阵来变幻顶点。应该注意的是,矩阵相乘并不是普通的乘法,而且,也不满足交换率:矩阵A X 矩阵B 和 矩阵B X 矩阵A是不相等的。下面的图表演示了怎样把两个矩阵相乘:Fig 5.3 要把两个矩阵相乘,你需要把第一个矩阵的每一行和第二个矩阵的每一列都相乘。在上面的例子中,我们把第一个矩阵的第一行的每个元素与第二个矩阵的第一列的对应元素相乘,然后把得出的四个结果相加,按此方法,我们得出了新矩阵的第一行的四个元素(Column1-4),其它元素的计算方法依此类推。这可能看起来有些复杂,不过,就像上面我提到的,DirectX提供了一些矩阵操作的函数,所以不要对此太担心。How do I use transformation matrices in DirectX? (在DirectX中怎样使用变换矩阵)在教程此章的例子中,我们有5个不同位置、做不同旋转的立方体。下面是我们的代码预排,让我们一步步地来:Step 1: Create objects (第一步,创建对象)第一件要做的事就是创建定义我们的五个立方体。我们像定义变量那样定义了五个立方体,而且修改了CGame的InitialiseGame来创建和设置它们,不过我们没有改变它们的尺寸。InitialiseGame模块现在是这样的:bool CGame:InitialiseGame() /Setup games objects here m_pCube1 = new CCuboid(m_pD3DDevice); m_pCube1-SetPosition(-27.0, 0.0, 0.0); m_pCube2 = new CCuboid(m_pD3DDevice); m_pCube2-SetPosition(-9.0, 0.0, 0.0); m_pCube3 = new CCuboid(m_pD3DDevice); m_pCube3-SetPosition(9.0, 0.0, 0.0); m_pCube4 = new CCuboid(m_pD3DDevice); m_pCube4-SetPosition(27.0, 0.0, 0.0); m_pCube5 = new CCuboid(m_pD3DDevice); m_pCube5-SetPosition(0.0, 15.0, 0.0); return true;下图演示了五个立方体的初始位置。我们通常可能喜欢在原点上创建它们,然后再调动它们。但是按照教程的意图,我们将像下图那样创建它们。Fig 5.4 Step 2: Create Transformation Matrices (第二步,创建变换矩阵)第二步是要创建变换矩阵。我们想要每个立方体做不同的旋转,就需要给每个立方体不同的变换矩阵。立方体1、2、3将分别绕x、y、z轴旋转;立方体4将按我们自定义的轴旋转;而立方体5将绕x、y、z轴旋转,并且会被放大。要创建绕x、y、z轴的旋转矩阵,我们将分别用到DX的DXD3DXMatrixRotationX、D3DXMatrixRotationY和D3DXMatrixRotationZ函数:第一个参数是指向D3DXMATRIX结构变量的指针,用于保存矩阵;第二个参数是要旋转的弧度。下面是来自我们的新的Render模块的片断:/Create the rotation transformation matrices around the x, y and z axisD3DXMatrixRotationX(&matRotationX, timeGetTime()/400.0f);D3DXMatrixRotationY(&matRotationY, timeGetTime()/400.0f); D3DXMatrixRotationZ(&matRotationZ, timeGetTime()/400.0f); 然后要做的就是创建我们自定义的旋转轴。这时我们需要用到DX的D3DXMatrixRotationAxis函数:第一个参数还是指向D3DXMATRIX结构变量的指针,用于保存矩阵;第二个参数是一个指向D3DXVECTOR3结构变量的指针,用于定义我们自己的轴。我们想要一个在x、y轴之间成45度角的轴,所以我们用了一个向量(1, 1, 0);第三个参数是要旋转的弧度。看下面的片断和图示:/Create the rotation transformation matrices around our user defined axisD3DXMatrixRotationAxis(&matRotationUser1, &D3DXVECTOR3(1.0f, 1.0f, 0.0f), timeGetTime()/400.0f);Fig 5.5我们还需要创建一些矩阵,例如缩放立方体5的矩阵。还有就是一些能将立方体移动到原点然后再移回来的矩阵(稍候解释)。下面是代码:/Create the translation (move) matricesD3DXMatrixTranslation(&matMoveRight27, 27.0, 0.0, 0.0);D3DXMatrixTranslation(&matMoveLeft27, -27.0, 0.0, 0.0);D3DXMatrixTranslation(&matMoveRight9, 9.0, 0.0, 0.0);D3DXMatrixTranslation(&matMoveLeft9, -9.0, 0.0, 0.0);D3DXMatrixTranslation(&matMoveDown15, 0.0, -15.0, 0.0);D3DXMatrixTranslation(&matMoveUp15, 0.0, 15.0, 0.0);/Create a scale transformationD3DXMatrixScaling(&matScaleUp1p5, 1.5, 1.5, 1.5);Step 3: Multiply Matrices (第三步,把矩阵相乘)现在,我们有了各种变幻矩阵。接下来我们需要为每个立方体创建一个复合的变幻矩阵,这需要DX 所提供的D3DXMatrixMultiply函数。立方体1简单,我们要让它绕x轴旋转,而它就在x轴上,这意味着我们不需要为它做矩阵相乘的运算,因为我们已经有了x轴的旋转矩阵。立方体2-5有些不同,因为它们不在我们想让它们旋转的轴上。所以,我们需要把它们移动到旋转轴(我们想要的,x、y或z)上,然后旋转他们,再把它们移回到原来的位置(下图5.7)。如果我们直接对他们做旋转操作而不移动,那他们将绕所给轴做摆动(下图5.6)。下面是图示:Fig 5.6Fig 5.7 我们有了立方体1的变幻矩阵,下面我们将创建立方体2-5的变幻矩阵。代码如下。要注意的是矩阵相乘的顺序,要不然会得出不同的结果。/Combine the matrices to form 4 transformation matricesD3DXMatrixMultiply(&matTransformation2, &matMoveRight9, &matRotationY);D3DXMatrixMultiply(&matTransformation2, &matTransformation2, &matMoveLeft9);D3DXMatrixMultiply(&matTransformation3, &matMoveLeft9, &matRotationZ);D3DXMatrixMultiply(&matTransformation3, &matTransformation3, &matMoveRight9);D3DXMatrixMultiply(&matTransformation4, &matMoveLeft27, &matRotationUser1);D3DXMatrixMultiply(&matTransformation4, &matTransformation4, &matMoveRight27);D3DXMatrixMultiply(&matTransformation5, &matMoveDown15, &matRotationY);D3DXMatrixMultiply(&matTransformation5, &matTransformation5, &matRotationX);D3DXMatrixMultiply(&matTransformation5, &matTransformation5, &matRotationZ);D3DXMatrixMultiply(&matTransformation5, &matTransformation5, &matMoveUp15);D3DXMatrixMultiply(&matTransformation5, &matTransformation5, &matScaleUp1p5); Step 4: Applying the Transformations (应用变换)嗯,现在我们每个立方体都有了自己的变换矩阵,我们需要为它们应用这些变换并且渲染他们。要应用一个变换矩阵,需要调用SetTran
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号