• <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 閱讀(2508) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            久久成人小视频| 久久精品女人天堂AV麻| 久久久无码精品亚洲日韩蜜臀浪潮| 亚洲精品乱码久久久久久蜜桃不卡| 久久精品国产亚洲AV影院| 久久精品国产亚洲av麻豆色欲| 热99re久久国超精品首页| 99久久国产宗和精品1上映 | 国产香蕉久久精品综合网| 午夜欧美精品久久久久久久| 青青草国产精品久久久久| 久久精品国产亚洲av麻豆图片 | 中文字幕亚洲综合久久菠萝蜜| 久久人人妻人人爽人人爽| 久久久久国产一级毛片高清板| 欧美丰满熟妇BBB久久久| 久久久国产精品| 久久中文娱乐网| 久久成人精品视频| 久久精品国产第一区二区三区| 亚洲国产小视频精品久久久三级| 久久91精品久久91综合| 久久精品国产亚洲av日韩| 国内精品久久久久影院老司 | 日本福利片国产午夜久久| 亚洲愉拍99热成人精品热久久| 亚洲国产精品一区二区三区久久 | 久久精品国产免费观看| 日韩中文久久| 亚洲国产日韩欧美久久| 欧美亚洲日本久久精品| 久久无码人妻精品一区二区三区| 99久久久久| 久久香蕉国产线看观看猫咪?v| 久久精品国产精品亚洲| 久久高潮一级毛片免费| 欧美日韩中文字幕久久久不卡| 日本精品一区二区久久久| 怡红院日本一道日本久久| 中文精品久久久久国产网址| 99久久精品费精品国产|