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

              C++博客 :: 首頁 :: 聯(lián)系 ::  :: 管理
              163 Posts :: 4 Stories :: 350 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(48)

            我參與的團隊

            搜索

            •  

            積分與排名

            • 積分 - 400065
            • 排名 - 59

            最新評論

            閱讀排行榜

            評論排行榜

            物理模擬介紹

            如果你很熟悉物理規(guī)律,并且想實現(xiàn)它,這篇文章很適合你。

            在這篇教程里,你會創(chuàng)建一個非常簡單的物理引擎,我們將創(chuàng)建以下類:

            內(nèi)容:

            位置類
            * class Vector3D --->  用來記錄物體的三維坐標的類

            力和運動
            * class Mass --->  表示一個物體的物理屬性

            模擬類
            * class Simulation --->  模擬物理規(guī)律

            模擬勻速運動
            * class ConstantVelocity : public Simulation --->  模擬勻速運動

            模擬在力的作用下運動
            * class MotionUnderGravitation : public Simulation --->  模擬在引力的作用下運動
            * class MassConnectedWithSpring : public Simulation --->  模擬在彈簧的作用下運動

             
              

            class Mass
            {
            public:
                float m;                                    // 質(zhì)量
                Vector3D pos;                                // 位置
                Vector3D vel;                                // 速度
                Vector3D force;                                // 力

                Mass(float m)                                // 構(gòu)造函數(shù)
                {
                    this->m = m;
                }

                ...

              
             下面的代碼給物體增加一個力,在初始時這個力為0
             
              

                void applyForce(Vector3D force)
                {
                    this->force += force;                        // 增加一個力
                }

                void init()                                // 初始時設為0
                {
                    force.x = 0;
                    force.y = 0;
                    force.z = 0;
                }

                ...

              
             下面的步驟完成一個模擬:

            1.設置力
            2.應用外力
            3.根據(jù)力的時間,計算物體的位置和速度
             
              

                void simulate(float dt)
                {
                    vel += (force / m) * dt;                    // 更新速度
                                           

                    pos += vel * dt;                        // 更新位置
                                                   
                }

              
             模擬類怎樣運作:

            在一個物理模擬中,我們按以下規(guī)律進行模擬,設置力,更新物體的位置和速度,按時間一次又一次的進行模擬。下面是它的實現(xiàn)代碼: 
              

            class Simulation
            {
            public:
                int numOfMasses;                                // 物體的個數(shù)
                Mass** masses;                                // 指向物體結(jié)構(gòu)的指針

                Simulation(int numOfMasses, float m)                        // 構(gòu)造函數(shù)
                {
                    this->numOfMasses = numOfMasses;

                    masses = new Mass*[numOfMasses];               

                    for (int a = 0; a < numOfMasses; ++a)               
                        masses[a] = new Mass(m);           
                }

                virtual void release()                            // 釋放所有的物體
                {
                    for (int a = 0; a < numOfMasses; ++a)               
                    {
                        delete(masses[a]);
                        masses[a] = NULL;
                    }

                    delete(masses);
                    masses = NULL;
                }

                Mass* getMass(int index)
                {
                    if (index < 0 || index >= numOfMasses)                // 返回第i個物體
                        return NULL;                       

                    return masses[index];                       
                }

            ...

                (class Simulation continued)

                virtual void init()                            // 初始化所有的物體
                {
                    for (int a = 0; a < numOfMasses; ++a)               
                        masses[a]->init();                   
                }

                virtual void solve()                            //虛函數(shù),在具體的應用中設置各個施加給各個物體的力
                {
                                               
                }

                virtual void simulate(float dt)                        //讓所有的物體模擬一步
                {
                    for (int a = 0; a < numOfMasses; ++a)               
                        masses[a]->simulate(dt);               
                }

                ...

              
             整個模擬的部分被封裝到下面的函數(shù)中 
              

                (class Simulation continued)

                virtual void operate(float dt)                        //  完整的模擬過程
                {
                    init();                                // 設置力為0
                    solve();                                // 應用力
                    simulate(dt);                            // 模擬
                }
            };

              
             現(xiàn)在我們已經(jīng)有了一個簡單的物理模擬引擎了,它包含有物體和模擬兩個類,下面我們基于它們創(chuàng)建三個具體的模擬對象:

            1. 具有恒定速度的物體
            2. 具有恒定加速度的物體
            3. 具有與距離成反比的力的物體

            在程序中控制一個模擬對象:

            在我們寫一個具體的模擬類之前,讓我們看看如何在程序中模擬一個對象,在這個教程里,模擬引擎和操作模擬的程序在兩個文件里,在程序中我們使用如下的函數(shù),操作模擬:

             
              

            void Update (DWORD milliseconds)                        // 執(zhí)行模擬

              
             這個函數(shù)在每一幀的開始更新,參數(shù)為相隔的時間。 
              

            void Update (DWORD milliseconds)
            {
                ...
                ...
                ...

                float dt = milliseconds / 1000.0f;                    // 轉(zhuǎn)化為秒

                dt /= slowMotionRatio;                        // 除以模擬系數(shù)

                timeElapsed += dt;                            // 更新流失的時間

                ...

              
             在下面的代碼中,我們定義一個處理間隔,沒隔這么長時間,讓物理引擎模擬一次。 
              

                ...

                float maxPossible_dt = 0.1f;                    // 設置模擬間隔
                                               

                  int numOfIterations = (int)(dt / maxPossible_dt) + 1;            //計算在流失的時間里模擬的次數(shù)
                if (numOfIterations != 0)                   
                    dt = dt / numOfIterations;                   

                for (int a = 0; a < numOfIterations; ++a)                // 模擬它們   
                {
                    constantVelocity->operate(dt);                   
                    motionUnderGravitation->operate(dt);               
                    massConnectedWithSpring->operate(dt);               
                }
            }

              
             下面讓我們來寫著兩個具體的模擬類:

            1. 具有恒定速度的物體
            * class ConstantVelocity : public Simulation ---> 模擬一個勻速運動的物體

             
              

            class ConstantVelocity : public Simulation
            {
            public:
                ConstantVelocity() : Simulation(1, 1.0f)                 
                {
                    masses[0]->pos = Vector3D(0.0f, 0.0f, 0.0f);            // 初始位置為0
                    masses[0]->vel = Vector3D(1.0f, 0.0f, 0.0f);            // 向右運動
                }
            };

              
             下面我們來創(chuàng)建一個具有恒定加速的物體:

             
              

            class MotionUnderGravitation : public Simulation
            {
                Vector3D gravitation;                            // 加速度

                MotionUnderGravitation(Vector3D gravitation) : Simulation(1, 1.0f)        //  構(gòu)造函數(shù)
                {                                   
                    this->gravitation = gravitation;                    // 設置加速度
                    masses[0]->pos = Vector3D(-10.0f, 0.0f, 0.0f);            // 設置位置為左邊-10處
                    masses[0]->vel = Vector3D(10.0f, 15.0f, 0.0f);            // 設置速度為右上
                }

                ...

              
             下面的函數(shù)設置施加給物體的力 
              

                virtual void solve()                            // 設置當前的力
                {
                    for (int a = 0; a < numOfMasses; ++a)               
                        masses[a]->applyForce(gravitation * masses[a]->m);   
                }

              
             下面的類創(chuàng)建一個受到與距離成正比的力的物體: 
              

            class MassConnectedWithSpring : public Simulation
            {
            public:
                float springConstant;                            // 彈性系數(shù)
                Vector3D connectionPos;                            // 連接方向

                MassConnectedWithSpring(float springConstant) : Simulation(1, 1.0f)        // 構(gòu)造函數(shù)
                {
                    this->springConstant = springConstant;               

                    connectionPos = Vector3D(0.0f, -5.0f, 0.0f);       

                    masses[0]->pos = connectionPos + Vector3D(10.0f, 0.0f, 0.0f);   
                    masses[0]->vel = Vector3D(0.0f, 0.0f, 0.0f);       
                }

                ...

              
             下面的函數(shù)設置當前物體所受到的力: 
              

            virtual void solve()                                // 設置當前的力
            {
                for (int a = 0; a < numOfMasses; ++a)                   
                {
                    Vector3D springVector = masses[a]->pos - connectionPos;       
                    masses[a]->applyForce(-springVector * springConstant);       
                }
            }

              
             好了上面就是一個簡單的物理模擬,希望你能喜歡:)

             
             
            posted on 2007-12-30 15:32 sdfasdf 閱讀(785) 評論(0)  編輯 收藏 引用 所屬分類: OPENGL
            久久精品国产亚洲5555| 日韩久久久久久中文人妻| 91精品国产综合久久四虎久久无码一级| 精品国产乱码久久久久久郑州公司 | 亚洲中文字幕无码久久综合网| 99久久国产宗和精品1上映| 俺来也俺去啦久久综合网| 久久精品亚洲精品国产欧美| av色综合久久天堂av色综合在| 久久精品一区二区| 综合人妻久久一区二区精品| 久久精品国产99国产精品| 国产综合久久久久| 欧美激情一区二区久久久| 久久国产影院| 伊人久久大香线蕉影院95| 亚洲综合伊人久久大杳蕉| 久久亚洲国产成人精品无码区| 精品无码久久久久国产| 久久精品国产亚洲AV久| 欧美久久久久久午夜精品| 伊人久久大香线焦综合四虎| 久久久国产精品亚洲一区| 久久精品国产男包| 亚洲国产成人久久综合野外| 理论片午午伦夜理片久久 | 久久久精品午夜免费不卡| 国产aⅴ激情无码久久| 99久久这里只精品国产免费| 久久久免费观成人影院| 精品水蜜桃久久久久久久| 国产高清美女一级a毛片久久w| 91精品国产综合久久精品| 久久久久久亚洲AV无码专区| 久久久无码一区二区三区| 久久久一本精品99久久精品66| 欧美黑人又粗又大久久久| 久久A级毛片免费观看| 狠狠色丁香婷综合久久| 久久国产成人亚洲精品影院| 免费一级做a爰片久久毛片潮|