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

            搜索

            •  

            積分與排名

            • 積分 - 401320
            • 排名 - 59

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            物理模擬介紹

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

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

            內(nèi)容:

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

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

            模擬類
            * 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;                        // 更新位置
                                                   
                }

              
             模擬類怎樣運(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è)類,下面我們基于它們創(chuàng)建三個(gè)具體的模擬對(duì)象:

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

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

            在我們寫一個(gè)具體的模擬類之前,讓我們看看如何在程序中模擬一個(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)寫著兩個(gè)具體的模擬類:

            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);   
                }

              
             下面的類創(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)  編輯 收藏 引用 所屬分類: OPENGL
            99国产精品久久久久久久成人热| 久久久精品久久久久久 | 日韩精品久久久久久免费| 91精品国产乱码久久久久久| 久久精品a亚洲国产v高清不卡| 91精品国产综合久久香蕉| 一本色道久久综合狠狠躁| 久久99精品久久久久久久久久| 欧美性猛交xxxx免费看久久久| 99久久国产综合精品女同图片| 久久99精品久久久久久水蜜桃| 久久国产欧美日韩精品| 久久成人精品| 国产精品久久久久久久| 日韩人妻无码一区二区三区久久| 精品国产青草久久久久福利| 久久综合狠狠综合久久综合88 | 精品久久久久成人码免费动漫| 久久成人精品视频| 久久偷看各类wc女厕嘘嘘| 亚洲Av无码国产情品久久| 亚洲国产成人久久综合一| 久久99精品国产自在现线小黄鸭| 欧美精品九九99久久在观看| 99久久精品国产一区二区| 国产精品久久久福利| 99久久99久久精品国产片果冻| 亚洲人成无码久久电影网站| 久久伊人精品青青草原日本| 精品久久久久久无码人妻热| 亚洲一区中文字幕久久| 99久久国产综合精品成人影院| 日韩精品国产自在久久现线拍| 色综合久久无码中文字幕| 久久综合国产乱子伦精品免费| 国产产无码乱码精品久久鸭| 久久综合国产乱子伦精品免费| 久久99国产乱子伦精品免费| 国产精品99精品久久免费| 婷婷久久综合九色综合98| 品成人欧美大片久久国产欧美|