• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天行健 君子當(dāng)自強(qiáng)而不息

            D3D編程必備的數(shù)學(xué)知識(shí)(3)

            矩陣

            在這一部分我們關(guān)注的焦點(diǎn)是數(shù)學(xué)中的矩陣。它們?cè)?D圖形學(xué)中的應(yīng)用將在下一部分講解。

            一個(gè)m×n的矩陣是由m行和n列的數(shù)字組成的矩陣列。行和列的數(shù)字就是這個(gè)矩陣的維數(shù)。我們通過(guò)寫(xiě)在下方的數(shù)字識(shí)別矩陣清單,數(shù)字中的第一個(gè)表示行第二個(gè)表示列。例如下邊的M是3×3矩陣,B是2×4矩陣, C是3×2矩陣。

            我們使用加粗的大寫(xiě)字母表示矩陣。有時(shí)一個(gè)矩陣只包含一行或者一列。我們用行矩陣和列矩陣這個(gè)特殊的名稱(chēng)來(lái)稱(chēng)呼。例如下邊就是行和列矩陣:

             

            當(dāng)使用行或列矩陣時(shí),我們只用一個(gè)下標(biāo),有時(shí)我們還用字母表示。

             

             

             

             

            D3DX 矩陣

            當(dāng)設(shè)計(jì)Direct3D應(yīng)用程序時(shí),使用4×4矩陣和1×4行矩陣(向量)是有代表性的。注意使用這兩種矩陣意味著可以進(jìn)行下列定義的矩陣乘法。

            n       向量-矩陣乘法。即,假如1×4的單行矩陣V,和4×4的矩陣T,那么積VT可計(jì)算并且返回的結(jié)果是一個(gè)1×4的單行矩陣(向量)。

            n       矩陣-矩陣乘法。即,假如4×4的矩陣T,和4×4的矩陣R,那么積TRRT可計(jì)算并且兩者返回的結(jié)果都是一個(gè)4×4的矩陣。注意因?yàn)榫仃嚦朔ú粷M(mǎn)足交換律所以TRRT不一定相等。

            在D3DX中表示1×4的行矩陣(向量),我們用D3DXVECTOR3和D3DXVECTOR4向量類(lèi)。當(dāng)然D3DXVECTOR3只有3個(gè)成員,不是4個(gè)。然而,第4個(gè)成員缺省是1或0(在下一部分有更多信息)。

            在D3DX中表示4×4的矩陣,我們用D3DXMATRIX類(lèi),定義如下:

            typedef struct D3DXMATRIX : public D3DMATRIX
            {
            public:
            D3DXMATRIX() {};
            D3DXMATRIX(CONST FLOAT*);
            D3DXMATRIX(CONST D3DMATRIX&);
            D3DXMATRIX(FLOAT _11, FLOAT _12, FLOAT _13, FLOAT _14,
            FLOAT _21, FLOAT _22, FLOAT _23, FLOAT _24,
            FLOAT _31, FLOAT _32, FLOAT _33, FLOAT _34,
            FLOAT _41, FLOAT _42, FLOAT _43, FLOAT _44);
            // access grants
            FLOAT& operator () (UINT Row, UINT Col);
            FLOAT operator () (UINT Row, UINT Col) const;

            // casting operators
            operator FLOAT* ();
            operator CONST FLOAT* () const;

            // assignment operators
            D3DXMATRIX& operator *= (CONST D3DXMATRIX&);
            D3DXMATRIX& operator += (CONST D3DXMATRIX&);
            D3DXMATRIX& operator -= (CONST D3DXMATRIX&);
            D3DXMATRIX& operator *= (FLOAT);
            D3DXMATRIX& operator /= (FLOAT);

            // unary operators
            D3DXMATRIX operator + () const;
            D3DXMATRIX operator - () const;

            // binary operators
            D3DXMATRIX operator * (CONST D3DXMATRIX&) const;
            D3DXMATRIX operator + (CONST D3DXMATRIX&) const;
            D3DXMATRIX operator - (CONST D3DXMATRIX&) const;
            D3DXMATRIX operator * (FLOAT) const;
            D3DXMATRIX operator / (FLOAT) const;

            friend D3DXMATRIX operator * (FLOAT, CONST D3DXMATRIX&);

            BOOL operator == (CONST D3DXMATRIX&) const;
            BOOL operator != (CONST D3DXMATRIX&) const;

            } D3DXMATRIX, *LPD3DXMATRIX;

            The D3DXMATRIX class inherits its data entries from the simpler D3DMATRIX structure, which is defined as:

            typedef struct _D3DMATRIX {
            union {
            struct {
            float _11, _12, _13, _14;
            float _21, _22, _23, _24;
            float _31, _32, _33, _34;
            float _41, _42, _43, _44;
            };
            float m[4][4];
            };
            } D3DMATRIX;

            觀察D3DXMATRIX類(lèi)發(fā)現(xiàn)有很多有用的運(yùn)算符,比如對(duì)矩陣檢測(cè)相等,矩陣相加和矩陣相減,標(biāo)量與矩陣相乘,類(lèi)型轉(zhuǎn)換(casting),以及非常重要的兩個(gè)D3DXMATRIXs相乘。因?yàn)榫仃囅喑耸欠浅V匾模覀兘o出一段實(shí)例代碼:

            D3DXMATRIX A(…); // initialize A

            D3DXMATRIX B(…); // initialize B

            D3DXMATRIX C = A * B; // C = AB

             

            D3DXMATRIX類(lèi)另一個(gè)重要的運(yùn)算符是小括號(hào),它允許我們非常方便的為矩陣成員賦值。注意當(dāng)使用小括號(hào)時(shí)我們的下標(biāo)就象C語(yǔ)言數(shù)組下標(biāo)一樣是從0開(kāi)始的。例如,為一個(gè)矩陣的ij = 11 賦值,我們寫(xiě)成:

            D3DXMATRIX M;

            M(0, 0) = 5.0f; // Set entry ij = 11 to 5.0f.

            D3DX庫(kù)也提供下列有用的函數(shù):將D3DXMATRIX轉(zhuǎn)化為單位矩陣,轉(zhuǎn)置D3DXMATRIX矩陣以及求逆矩陣。

            D3DXMATRIX *D3DXMatrixIdentity(

                          D3DXMATRIX *pout // 將矩陣轉(zhuǎn)換為單位矩陣

            );

            D3DXMATRIX M;

            D3DXMatrixIdentity( &M ); // M = 單位矩陣

             

            D3DXMATRIX *D3DXMatrixTranspose(

                   D3DXMATRIX *pOut, // 輸出的轉(zhuǎn)置矩陣

                   CONST D3DXMATRIX *pM // 原矩陣

            );

            D3DXMATRIX A(...); // 初始化矩陣A

            D3DXMATRIX B;

            D3DXMatrixTranspose( &B, &A ); // B = 輸出的轉(zhuǎn)置矩陣

             

            假如我們將不能求逆的矩陣用求逆函數(shù),那么函數(shù)將會(huì)返回null.同樣的,這本書(shū)我們忽視第二個(gè)參數(shù),并且總是把它設(shè)置為0。

            D3DXMATRIX *D3DXMatrixInverse(

                   D3DXMATRIX *pOut, // 輸出的逆矩陣

                   FLOAT *pDeterminant, // 除非是必需的,一般設(shè)為0

                   CONST D3DXMATRIX *pM // 原矩陣

            );

            D3DXMATRIX A(...); // 初始化矩陣

            D3DXMATRIX B;

            D3DXMatrixInverse( &B, 0, &A ); // B = A的逆矩陣


            posted on 2008-03-12 12:18 lovedday 閱讀(2510) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            公告

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            隨筆分類(lèi)(178)

            3D游戲編程相關(guān)鏈接

            搜索

            最新評(píng)論

            久久综合狠狠色综合伊人| 精品国产青草久久久久福利 | 久久99精品国产99久久6男男| 麻豆一区二区99久久久久| 久久99精品久久久久久噜噜| 国产一区二区精品久久岳| 国产精品激情综合久久| 99久久国产亚洲综合精品| 国产精品久久久天天影视| 精品久久久久久久久久中文字幕 | 久久精品国产乱子伦| 久久超乳爆乳中文字幕| 久久综合亚洲色HEZYO社区| 亚洲国产精品狼友中文久久久| 99久久精品毛片免费播放| 国产一区二区精品久久凹凸| 亚洲精品蜜桃久久久久久| 久久性生大片免费观看性| 久久久久久精品免费免费自慰| 久久综合视频网站| 久久综合视频网| 伊人久久大香线蕉亚洲五月天| 久久99精品久久久久久齐齐| 中文国产成人精品久久不卡| 久久99亚洲综合精品首页| 久久国产香蕉视频| 97久久香蕉国产线看观看| 人人狠狠综合久久88成人| 99久久777色| 人妻少妇久久中文字幕| 久久久国产精品网站| 精品无码久久久久久久久久| 久久久久国产| 热re99久久6国产精品免费| 久久久久久九九99精品| 色欲av伊人久久大香线蕉影院| 色狠狠久久AV五月综合| 久久偷看各类wc女厕嘘嘘| 一级做a爰片久久毛片16| 久久精品国产福利国产秒| 久久免费视频一区|