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

            天行健 君子當自強而不息

            DirectX 9的一些數學計算函數:向量篇

            首先來看看向量,向量的坐標表示對于DirectX游戲開發來說是必須的,在世界坐標系或投影坐標系下的三角形面的法線,光線的方向和觀察者的方向等都是通過向量的坐標形式來準確給出的。

            DirectX的頭文件D3DX9Math.h給出了兩個結構體來支持向量的計算:

            typedef struct _D3DVECTOR {
                
            float x;
                
            float y;
                
            float z;
            } D3DVECTOR;

            typedef 
            struct D3DXVECTOR3 : public D3DVECTOR
            {
            public:
                D3DXVECTOR3() {};
                D3DXVECTOR3( CONST FLOAT 
            * );
                D3DXVECTOR3( CONST D3DVECTOR
            & );
                D3DXVECTOR3( CONST D3DXFLOAT16 
            * );
                D3DXVECTOR3( FLOAT x, FLOAT y, FLOAT z );

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

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

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

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

                friend D3DXVECTOR3 
            operator * ( FLOAT, CONST struct D3DXVECTOR3& );

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

            } D3DXVECTOR3, 
            *LPD3DXVECTOR3;

            以下整理出DirextX 9的一些向量函數,由于本人也只是初學DirectX 9,所以文章中可能蘊含著一些錯誤,也可能不完整,敬請指出,以后會陸續補充。

            要正確運行以下的示例程序,需要在工程中包含d3dx9.lib,或者在main函數前加入

            #pragma comment(lib, "d3dx9.lib")

            以指示編譯器鏈接d3dx9.lib。



            向量相加: 重載的運算符 +
            向量相減: 重載的運算符-

            函數原型:

            D3DXVECTOR3 operator + ( CONST D3DXVECTOR3& ) const;
            D3DXVECTOR3 operator - ( CONST D3DXVECTOR3& ) const;

            代碼示例:

            #include <stdio.h>
            #include 
            <D3DX9Math.h>

            #pragma warning(disable : 
            4305)

            int main()
            {
                
            // calculate for 2 dimension vector 
                D3DXVECTOR2 A2(6.03.0);
                D3DXVECTOR2 B2(
            4.02.0);

                D3DXVECTOR2 C2 
            = A2 + B2;
                
                printf(
            "\nC2 = (%.2f, %.2f) + (%.2f, %.2f) = (%.2f, %.2f)\n", A2.x, A2.y, B2.x, B2.y, C2.x, C2.y);

                
            // calculate for 3 dimension vector
                D3DXVECTOR3 A3(5.02.610);
                D3DXVECTOR3 B3(
            2.03.43.0);

                D3DXVECTOR3 C3 
            = A3 + B3;

                printf(
            "\nC3 = (%.2f, %.2f, %.2f) + (%.2f, %.2f, %.2f) = (%.2f, %.2f, %.2f)\n"
                    A3.x, A3.y, A3.z, B3.x, B3.y, B3.z, C3.x, C3.y, C3.z);

                D3DXVECTOR3 D3 
            = A3 - B3;

                printf(
            "\nD3 = (%.2f, %.2f, %.2f) - (%.2f, %.2f, %.2f) = (%.2f, %.2f, %.2f)\n"
                    A3.x, A3.y, A3.z, B3.x, B3.y, B3.z, D3.x, D3.y, D3.z);

                
            return 0;
            }


            輸出:

            C2 = (6.00, 3.00) + (4.00, 2.00) = (10.00, 5.00)

            C3 = (5.00, 2.60, 10.00) + (2.00, 3.40, 3.00) = (7.00, 6.00, 13.00)

            D3 = (5.00, 2.60, 10.00) - (2.00, 3.40, 3.00) = (3.00, -0.80, 7.00)

            向量的標量乘法: 重載的運算符 *

            函數原型:

            friend D3DXVECTOR3 operator * ( FLOAT, CONST struct D3DXVECTOR3& );

            代碼示例:

            #include <stdio.h>
            #include 
            <D3DX9Math.h>

            #pragma warning(disable : 
            4305)

            int main()
            {
                
            // calculate for 2 dimension multiply
                D3DXVECTOR2 A(6.03.0);
                
            float m = 5.0;

                D3DXVECTOR2 B 
            = m * A;

                printf(
            "\nB = %.2f * (%.2f, %.2f) = (%.2f, %.2f)\n", m, A.x, A.y, B.x, B.y);

                
            // calculate for 3 dimension multiply
                D3DXVECTOR3 C(1.02.03.0);
                D3DXVECTOR3 D 
            = m * C;

                printf(
            "\nD = %.2f * (%.2f, %.2f, %.2f) = (%.2f, %.2f, %.2f)\n\n"
                    m, C.x, C.y, C.z, D.x, D.y, D.z);

                
            return 0;
            }

            輸出:

            B = 5.00 * (6.00, 3.00) = (30.00, 15.00)

            D = 5.00 * (1.00, 2.00, 3.00) = (5.00, 10.00, 15.00)

            向量長度的計算: D3DXVec3Length

            函數原型:

            FLOAT D3DXVec3Length  ( CONST D3DXVECTOR3 *pV );

            代碼示例:

            #include <stdio.h>
            #include 
            <D3DX9Math.h>

            #pragma warning(disable : 
            4305)

            int main()
            {
                
            // calculate vector length for 2 dimension
                D3DXVECTOR2 A(3.05.0);
                
            float A_len = D3DXVec2Length(&A);
                printf(
            "\nvector A(%.2f, %.2f) length = %f\n", A.x, A.y, A_len);

                
            // calculate vector length for 3 dimension
                D3DXVECTOR3 B(23.03.8-12.3);
                
            float B_len = D3DXVec3Length(&B);
                printf(
            "\nvector B(%.2f, %.2f, %.2f) length = %f\n", B.x, B.y, B.z, B_len);

                
            return 0;
            }

            輸出:

            vector A(3.00, 5.00) length = 5.830952

            vector B(23.00, 3.80, -12.30) length = 26.357731

            向量的單位化: D3DXVec2Normalize, D3DXVec3Normalize

            函數原型:
            D3DXVECTOR2* WINAPI D3DXVec2Normalize( D3DXVECTOR2 *pOut, CONST D3DXVECTOR2 *pV );
            D3DXVECTOR3* WINAPI D3DXVec3Normalize( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV );

            代碼示例:

            #include <stdio.h>
            #include 
            <D3DX9Math.h>

            #pragma warning(disable : 
            4305)

            int main()
            {
                
            // vector normalize for 2D dimension
                D3DXVECTOR2 A(3.06.0);
                D3DXVECTOR2 A_normal;

                D3DXVec2Normalize(
            &A_normal, &A);
                printf(
            "vector A(%.2f, %.2f) normal = (%f, %f)\n\n", A.x, A.y, A_normal.x, A_normal.y);

                
            // vector normalize for 3D dimension
                D3DXVECTOR3 B(2.510.08.0);
                D3DXVECTOR3 B_normal;

                D3DXVec3Normalize(
            &B_normal, &B);
                printf(
            "vector B(%.2f, %.2f, %.2f) normal = (%f, %f, %f)\n\n", B.x, B.y, B.z, B_normal.x, B_normal.y, B_normal.z);    

                
            return 0;
            }

            輸出:

            vector A(3.00, 6.00) normal = (0.447214, 0.894427)

            vector B(2.50, 10.00, 8.00) normal = (0.191600, 0.766402, 0.613121)

            向量的點積: D3DXVec3Dot

            函數原型:

            FLOAT D3DXVec3Dot ( CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 );

            代碼示例:

            #include <stdio.h>
            #include 
            <D3DX9Math.h>

            #pragma warning(disable : 
            4305)

            int main()
            {
                D3DXVECTOR3 u(
            2.03.04.0);
                D3DXVECTOR3 v(
            11.05.07.0);

                
            float dot_value = D3DXVec3Dot(&u, &v);

                
            if(dot_value < 0)
                    printf(
            "The angle between u and v is > 90");
                
            else if(dot_value == 0)
                    printf(
            "The angle between u and v is = 90");
                
            else
                    printf(
            "The angle between u and v is < 90");

                printf(
            "\n\n");

                
            return 0;
            }

            輸出:

            The angle between u and v is < 90

            向量的叉積:D3DXVec3Cross

            函數原型:

             D3DXVECTOR3* D3DXVec3Cross
                ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 );

            代碼示例:

            #include <stdio.h>
            #include 
            <D3DX9Math.h>

            #pragma warning(disable : 
            4305)

            int main()
            {
                D3DXVECTOR3 i(
            1.00.00.0);
                D3DXVECTOR3 j(
            0.01.00.0);
                D3DXVECTOR3 k(
            0.00.01.0);

                D3DXVECTOR3 cross_vector;

                D3DXVec3Cross(
            &cross_vector, &i, &j);
                printf(
            "ixj = (%f, %f, %f)\n\n", cross_vector.x, cross_vector.y, cross_vector.z);

                D3DXVec3Cross(
            &cross_vector, &j, &k);
                printf(
            "jxk = (%f, %f, %f)\n\n", cross_vector.x, cross_vector.y, cross_vector.z);

                D3DXVec3Cross(
            &cross_vector, &k, &i);
                printf(
            "kxi = (%f, %f, %f)\n\n", cross_vector.x, cross_vector.y, cross_vector.z);

                
            return 0;
            }

            輸出:

            ixj = (0.000000, 0.000000, 1.000000)

            jxk = (1.000000, 0.000000, 0.000000)

            kxi = (0.000000, 1.000000, 0.000000)

            posted on 2007-04-27 18:53 lovedday 閱讀(1779) 評論(0)  編輯 收藏 引用 所屬分類: ■ DirectX 9 Program

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            2021国产精品午夜久久| 一本色道久久88精品综合 | 久久久一本精品99久久精品66| 国产色综合久久无码有码| 亚洲日本va午夜中文字幕久久| 久久精品国产精品亚洲下载| 久久国产精品波多野结衣AV | 久久人人爽人人精品视频| 久久久久无码精品国产不卡| 久久99精品久久久久久hb无码| 中文字幕亚洲综合久久| 久久99国产精品久久99小说| 久久er国产精品免费观看2| 无码人妻少妇久久中文字幕| 亚洲精品乱码久久久久久| 国产福利电影一区二区三区久久久久成人精品综合 | 国产香蕉久久精品综合网| 久久精品国产精品亚洲毛片| 一本一本久久A久久综合精品| 久久国产美女免费观看精品| 天天综合久久久网| 中文精品99久久国产 | 久久国产免费直播| 青青草原综合久久大伊人| 亚洲中文久久精品无码| 久久久亚洲AV波多野结衣| 色88久久久久高潮综合影院| 久久亚洲欧美国产精品| 精品久久一区二区三区| 婷婷五月深深久久精品| 亚洲欧洲精品成人久久曰影片| 久久午夜福利电影| 久久久噜噜噜www成人网| 久久亚洲欧美日本精品| 很黄很污的网站久久mimi色| 久久伊人精品青青草原高清| 狠狠色伊人久久精品综合网| 久久高清一级毛片| 狠狠精品久久久无码中文字幕| 99久久国产综合精品女同图片| 亚洲熟妇无码另类久久久|