• <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>

            天行健 君子當自強而不息

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

            矩陣

            在這一部分我們關注的焦點是數(shù)學中的矩陣。它們在3D圖形學中的應用將在下一部分講解。

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

            我們使用加粗的大寫字母表示矩陣。有時一個矩陣只包含一行或者一列。我們用行矩陣和列矩陣這個特殊的名稱來稱呼。例如下邊就是行和列矩陣:

             

            當使用行或列矩陣時,我們只用一個下標,有時我們還用字母表示。

             

             

             

             

            D3DX 矩陣

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

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

            n       矩陣-矩陣乘法。即,假如4×4的矩陣T,和4×4的矩陣R,那么積TRRT可計算并且兩者返回的結果都是一個4×4的矩陣。注意因為矩陣乘法不滿足交換律所以TRRT不一定相等。

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

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

            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類發(fā)現(xiàn)有很多有用的運算符,比如對矩陣檢測相等,矩陣相加和矩陣相減,標量與矩陣相乘,類型轉換(casting),以及非常重要的兩個D3DXMATRIXs相乘。因為矩陣相乘是非常重要的,我們給出一段實例代碼:

            D3DXMATRIX A(…); // initialize A

            D3DXMATRIX B(…); // initialize B

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

             

            D3DXMATRIX類另一個重要的運算符是小括號,它允許我們非常方便的為矩陣成員賦值。注意當使用小括號時我們的下標就象C語言數(shù)組下標一樣是從0開始的。例如,為一個矩陣的ij = 11 賦值,我們寫成:

            D3DXMATRIX M;

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

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

            D3DXMATRIX *D3DXMatrixIdentity(

                          D3DXMATRIX *pout // 將矩陣轉換為單位矩陣

            );

            D3DXMATRIX M;

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

             

            D3DXMATRIX *D3DXMatrixTranspose(

                   D3DXMATRIX *pOut, // 輸出的轉置矩陣

                   CONST D3DXMATRIX *pM // 原矩陣

            );

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

            D3DXMATRIX B;

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

             

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

            D3DXMATRIX *D3DXMatrixInverse(

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

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

                   CONST D3DXMATRIX *pM // 原矩陣

            );

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

            D3DXMATRIX B;

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


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

            公告

            導航

            統(tǒng)計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            亚洲国产日韩综合久久精品| 久久96国产精品久久久| 无码人妻久久一区二区三区蜜桃 | 一本色道久久88加勒比—综合| 久久精品成人免费看| 久久久久97国产精华液好用吗| 99久久精品国产一区二区| 久久精品国产秦先生| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 伊人久久大香线蕉成人| 蜜臀久久99精品久久久久久小说 | 久久九九兔免费精品6| 久久99精品久久久久久秒播| 久久综合给合久久狠狠狠97色 | 亚洲精品国精品久久99热| 久久青青草原亚洲av无码app| 久久久久亚洲精品天堂久久久久久 | 久久精品国产亚洲AV不卡| 久久久噜噜噜久久中文字幕色伊伊 | 91精品婷婷国产综合久久| 亚洲精品乱码久久久久久自慰| 欧美日韩中文字幕久久久不卡| 99国产欧美久久久精品蜜芽| 亚洲中文字幕无码久久综合网| 欧美亚洲国产精品久久| 久久精品亚洲精品国产欧美| 国内精品久久九九国产精品| 久久精品国产亚洲av高清漫画| 久久久久99这里有精品10| 午夜视频久久久久一区| 三级片免费观看久久| 欧美久久一级内射wwwwww.| 99久久精品免费观看国产| 青青草原综合久久大伊人精品| 99久久免费国产特黄| 久久美女网站免费| 久久99精品国产99久久6男男| 996久久国产精品线观看| 久久精品亚洲中文字幕无码麻豆| 久久综合给合久久狠狠狠97色| 久久精品水蜜桃av综合天堂|