• <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游戲編程相關鏈接

            搜索

            最新評論

            99久久香蕉国产线看观香| 国产成人精品久久二区二区| 亚洲国产成人精品女人久久久 | 亚洲国产成人久久综合一 | 日本精品一区二区久久久| 久久香综合精品久久伊人| 亚洲成色www久久网站夜月| 人人狠狠综合88综合久久| 99久久精品国产综合一区| 香港aa三级久久三级老师2021国产三级精品三级在 | 久久久久久久尹人综合网亚洲 | 久久久久久久波多野结衣高潮| 久久久一本精品99久久精品66| 国产精品免费久久久久电影网| 中文字幕精品久久| 一本一道久久精品综合| 久久午夜无码鲁丝片| 人妻系列无码专区久久五月天| 久久精品国产久精国产| 婷婷伊人久久大香线蕉AV| 少妇久久久久久被弄到高潮| 国产精品美女久久久久网| 性色欲网站人妻丰满中文久久不卡| 久久国产高清一区二区三区| 久久99精品国产自在现线小黄鸭 | 久久精品无码专区免费青青| 国内精品久久久久影院亚洲| 国产成人香蕉久久久久| 国产精品视频久久| 久久天天躁狠狠躁夜夜网站| 久久久久久久久久久| 日本高清无卡码一区二区久久| 久久99精品国产| 精品久久久久久中文字幕| 久久久久久无码Av成人影院| 少妇久久久久久被弄高潮| 亚洲精品午夜国产VA久久成人| 欧美黑人激情性久久| 伊人久久一区二区三区无码| 亚洲国产香蕉人人爽成AV片久久| 亚洲欧美成人久久综合中文网|