• <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++博客 :: 首頁(yè) :: 聯(lián)系 ::  :: 管理
              163 Posts :: 4 Stories :: 350 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(48)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            積分與排名

            • 積分 - 401318
            • 排名 - 59

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            物理模擬介紹

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

            在這篇教程里,你會(huì)創(chuàng)建一個(gè)非常簡(jiǎn)單的物理引擎,我們將創(chuàng)建以下類(lèi):

            內(nèi)容:

            位置類(lèi)
            * class Vector3D --->  用來(lái)記錄物體的三維坐標(biāo)的類(lèi)

            力和運(yùn)動(dòng)
            * class Mass --->  表示一個(gè)物體的物理屬性

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

            模擬勻速運(yùn)動(dòng)
            * class ConstantVelocity : public Simulation --->  模擬勻速運(yùn)動(dòng)

            模擬在力的作用下運(yùn)動(dòng)
            * class MotionUnderGravitation : public Simulation --->  模擬在引力的作用下運(yùn)動(dòng)
            * class MassConnectedWithSpring : public Simulation --->  模擬在彈簧的作用下運(yùn)動(dòng)

             
              

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

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

                ...

              
             下面的代碼給物體增加一個(gè)力,在初始時(shí)這個(gè)力為0
             
              

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

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

                ...

              
             下面的步驟完成一個(gè)模擬:

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

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

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

              
             模擬類(lèi)怎樣運(yùn)作:

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

            class Simulation
            {
            public:
                int numOfMasses;                                // 物體的個(gè)數(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個(gè)物體
                        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ù),在具體的應(yīng)用中設(shè)置各個(gè)施加給各個(gè)物體的力
                {
                                               
                }

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

                ...

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

                (class Simulation continued)

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

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

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

            在程序中控制一個(gè)模擬對(duì)象:

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

             
              

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

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

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

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

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

                timeElapsed += dt;                            // 更新流失的時(shí)間

                ...

              
             在下面的代碼中,我們定義一個(gè)處理間隔,沒(méi)隔這么長(zhǎng)時(shí)間,讓物理引擎模擬一次。 
              

                ...

                float maxPossible_dt = 0.1f;                    // 設(shè)置模擬間隔
                                               

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

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

              
             下面讓我們來(lái)寫(xiě)著兩個(gè)具體的模擬類(lèi):

            1. 具有恒定速度的物體
            * class ConstantVelocity : public Simulation ---> 模擬一個(gè)勻速運(yùn)動(dòng)的物體

             
              

            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);            // 向右運(yùn)動(dòng)
                }
            };

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

             
              

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

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

                ...

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

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

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

            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ù)設(shè)置當(dāng)前物體所受到的力: 
              

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

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

             
             
            posted on 2007-12-30 15:32 sdfasdf 閱讀(792) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): OPENGL
            久久夜色撩人精品国产小说| 色婷婷综合久久久久中文| 激情久久久久久久久久| 久久国产视频99电影| 四虎亚洲国产成人久久精品| 久久精品国产久精国产果冻传媒 | 久久天天婷婷五月俺也去| 性做久久久久久久| 久久久久国色AV免费观看| 色欲综合久久中文字幕网| 久久久91人妻无码精品蜜桃HD| 色欲综合久久中文字幕网| 精品视频久久久久| 国产亚洲精品自在久久| 亚洲色欲久久久久综合网| 人人狠狠综合久久亚洲婷婷| 欧美熟妇另类久久久久久不卡| 久久强奷乱码老熟女网站| 欧美综合天天夜夜久久| 色综合久久中文字幕无码| 中文字幕无码久久人妻| 久久国产高清一区二区三区| 久久久久中文字幕| 99国产精品久久| 久久天天躁狠狠躁夜夜躁2O2O | 久久影院亚洲一区| 青草影院天堂男人久久| 久久99热国产这有精品| 久久99精品久久久久久| 国产精品久久免费| 91久久婷婷国产综合精品青草| 嫩草伊人久久精品少妇AV| 亚洲国产精品18久久久久久| 久久人人爽人人爽人人片av麻烦| 久久天天躁狠狠躁夜夜av浪潮| 91精品国产91久久| 久久成人国产精品一区二区| 久久精品国产精品亚洲艾草网美妙| 999久久久国产精品| 国产精自产拍久久久久久蜜| 精品99久久aaa一级毛片|