• <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編程必備的數學知識(3)

            矩陣

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

            一個m×n的矩陣是由m行和n列的數字組成的矩陣列。行和列的數字就是這個矩陣的維數。我們通過寫在下方的數字識別矩陣清單,數字中的第一個表示行第二個表示列。例如下邊的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類發現有很多有用的運算符,比如對矩陣檢測相等,矩陣相加和矩陣相減,標量與矩陣相乘,類型轉換(casting),以及非常重要的兩個D3DXMATRIXs相乘。因為矩陣相乘是非常重要的,我們給出一段實例代碼:

            D3DXMATRIX A(…); // initialize A

            D3DXMATRIX B(…); // initialize B

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

             

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

            D3DXMATRIX M;

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

            D3DX庫也提供下列有用的函數:將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 = 輸出的轉置矩陣

             

            假如我們將不能求逆的矩陣用求逆函數,那么函數將會返回null.同樣的,這本書我們忽視第二個參數,并且總是把它設置為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 閱讀(2510) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            国产成人久久777777| 久久久免费精品re6| 久久人搡人人玩人妻精品首页| 精品久久久无码中文字幕天天| 久久天天躁狠狠躁夜夜av浪潮| 久久国产劲爆AV内射—百度| 66精品综合久久久久久久| 久久久久久久久久久| 99热成人精品免费久久| 伊人伊成久久人综合网777| 久久精品国产69国产精品亚洲| 亚洲人成网站999久久久综合| 97r久久精品国产99国产精| 久久中文字幕无码专区| 2020最新久久久视精品爱 | 久久亚洲国产最新网站| 久久精品九九亚洲精品天堂| 老男人久久青草av高清| 久久97久久97精品免视看| 97热久久免费频精品99| 人妻精品久久久久中文字幕一冢本| 久久精品人妻一区二区三区| 亚洲嫩草影院久久精品| 99精品久久精品| 国产精品久久一区二区三区| 久久精品亚洲日本波多野结衣 | 久久久精品一区二区三区| 亚洲精品高清国产一线久久| 久久国产精品二国产精品| 精品午夜久久福利大片| 97久久综合精品久久久综合| 精品久久久久久久久午夜福利| 99久久精品免费看国产一区二区三区 | 激情综合色综合久久综合| 亚洲精品高清久久| www亚洲欲色成人久久精品| 久久成人精品| 久久婷婷午色综合夜啪| 亚洲AV无码久久精品蜜桃| 久久w5ww成w人免费| 99精品伊人久久久大香线蕉|