青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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

常用鏈接

留言簿(48)

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

搜索

  •  

積分與排名

  • 積分 - 402386
  • 排名 - 59

最新評論

閱讀排行榜

評論排行榜

物理模擬介紹

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

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

內(nèi)容:

位置類
* class Vector3D --->  用來記錄物體的三維坐標(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)                        //  完整的模擬過程
    {
        init();                                // 設(shè)置力為0
        solve();                                // 應(yīng)用力
        simulate(dt);                            // 模擬
    }
};

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

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

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

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

 
  

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

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

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

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

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

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

    ...

  
 在下面的代碼中,我們定義一個(gè)處理間隔,沒隔這么長時(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);               
    }
}

  
 下面讓我們來寫著兩個(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)
    }
};

  
 下面我們來創(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è)簡單的物理模擬,希望你能喜歡:)

 
 
posted on 2007-12-30 15:32 sdfasdf 閱讀(796) 評論(0)  編輯 收藏 引用 所屬分類: OPENGL
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲黄色有码视频| 一区二区不卡在线视频 午夜欧美不卡在| 亚洲天堂黄色| 国产精品视频免费观看www| 性欧美超级视频| 一区二区三区四区五区在线| 久久综合精品国产一区二区三区| 国产精品99久久久久久久久久久久 | 亚洲电影免费| 久久综合网络一区二区| 猫咪成人在线观看| 欧美激情在线播放| 欧美国产日本在线| 亚洲精选视频免费看| 中文国产一区| 欧美一区激情视频在线观看| 久久久久看片| 国产精品视频999| 亚洲精品1区2区| 午夜亚洲影视| 亚洲精品国产日韩| 久久国产精品网站| 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 9l视频自拍蝌蚪9l视频成人| 亚洲欧美日韩精品久久亚洲区| 一区二区三区欧美在线| 欧美日韩视频在线一区二区观看视频 | 国产精品久久久久久久久久直播| 国产精品亚洲不卡a| 日韩视频中文字幕| 久久激五月天综合精品| 日韩视频免费观看高清在线视频 | 久久视频免费观看| 9久re热视频在线精品| 久久综合导航| 国产精品推荐精品| 在线亚洲+欧美+日本专区| 蜜桃伊人久久| 久久久久久亚洲精品中文字幕| 国产精品资源| 久久精品理论片| 亚洲五月六月| 国产欧美一区二区精品婷婷 | 欧美性猛交xxxx免费看久久久| 亚洲高清免费视频| 91久久精品网| 国产精品视频一区二区三区| 亚洲综合久久久久| 久久精品一区二区| 亚洲精品乱码久久久久久按摩观| 亚洲精华国产欧美| 国产精品女人久久久久久| 久久精品水蜜桃av综合天堂| 开心色5月久久精品| 欧美激情一区二区三级高清视频| 亚洲三级视频| 久久精品卡一| 亚洲综合丁香| 欧美人与性动交cc0o| 午夜精品视频在线| 欧美久久久久中文字幕| 久久久久欧美精品| 国产精品久久久久免费a∨大胸| 久久九九免费| 国产精品日韩欧美| 99国产精品自拍| 亚洲精品日本| 蜜臀av一级做a爰片久久| 久久黄金**| 国产精品永久入口久久久| 亚洲国产精品成人综合| 永久久久久久| 欧美无砖砖区免费| 美日韩在线观看| 欧美天天在线| 在线观看视频欧美| 欧美亚洲日本国产| 午夜国产欧美理论在线播放| 欧美视频一区二区三区在线观看| 国产精品99一区二区| 国产精品久久久久毛片软件| 尤物yw午夜国产精品视频| 欧美国产精品久久| 欧美成人一区在线| 国产精品无人区| 亚洲免费在线看| 欧美天堂亚洲电影院在线观看 | 亚洲高清在线观看一区| 国产三级欧美三级| 久久久99国产精品免费| 亚洲高清电影| 亚洲无毛电影| 免费日韩精品中文字幕视频在线| 黄色影院成人| 欧美精品videossex性护士| 日韩午夜在线电影| 久久人人爽人人| 亚洲午夜久久久久久久久电影院| 国产美女精品| 欧美精品在线视频观看| 欧美一区二区三区在线观看视频| 欧美激情欧美狂野欧美精品| 亚洲欧美日韩一区在线观看| 在线观看亚洲专区| 国产精品手机在线| 欧美色播在线播放| 欧美风情在线| 裸体女人亚洲精品一区| 欧美一区午夜视频在线观看| 一区二区三区欧美视频| 亚洲黑丝在线| 日韩视频一区二区三区在线播放| 久久激情一区| 免费欧美高清视频| 欧美风情在线观看| 亚洲国产成人在线视频| 亚洲国内精品| 在线视频日韩| 午夜视频在线观看一区| 午夜精品久久久久99热蜜桃导演| 在线一区二区三区四区| 99热精品在线| 欧美综合激情网| 媚黑女一区二区| 欧美日韩国产综合网| 国产精品久久久久久久久久妞妞 | 国产女主播一区二区三区| 欧美性猛交99久久久久99按摩 | 欧美成人精品| 欧美日韩大片| 国内视频一区| 亚洲欧美日本视频在线观看| 久久精品亚洲一区二区| 亚洲高清网站| 欧美亚洲综合网| 欧美日韩第一区日日骚| 国产婷婷97碰碰久久人人蜜臀| 尤妮丝一区二区裸体视频| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 亚洲视频中文| 免费视频一区| 亚洲综合不卡| 欧美日韩另类丝袜其他| 一区福利视频| 欧美一区三区二区在线观看| 亚洲国产激情| 免费视频亚洲| 91久久国产综合久久| 久久中文字幕一区| 欧美亚洲一区二区三区| 国产精品人人做人人爽人人添| 亚洲精品色图| 亚洲区国产区| 欧美三级欧美一级| 一区二区三区视频观看| 亚洲免费黄色| 欧美婷婷在线| 欧美777四色影视在线| 在线欧美电影| 亚洲人成免费| 国产精品美女久久久久aⅴ国产馆| 一本色道88久久加勒比精品| 亚洲全黄一级网站| 国产精品大片wwwwww| 久久成人免费电影| 久久久99免费视频| 一区二区三区精品视频| 一区二区三区四区五区视频 | 亚洲欧美国产另类| 国产日产欧产精品推荐色 | 99国产精品国产精品久久| 国产精品欧美日韩一区| 女人香蕉久久**毛片精品| 欧美日韩在线观看一区二区| 久久精品一本久久99精品| 欧美伦理91i| 欧美激情精品久久久久久久变态| 欧美日韩国产免费观看| 久久婷婷国产综合精品青草 | 午夜精品福利视频| 亚洲精品影视在线观看| 欧美有码在线观看视频| 亚洲资源在线观看| 久久综合激情| 久久综合九色综合久99| 国产欧美一区二区精品忘忧草| 亚洲国产精品一区二区第四页av| 国产视频亚洲精品| 午夜精品视频在线| 亚洲天天影视| 国产女主播视频一区二区| 亚洲一本大道在线| 欧美一区二区三区四区在线| 国产精品久久久久久久久免费樱桃| 欧美国产日韩xxxxx| 亚洲美女一区| 欧美手机在线视频| 亚洲一区二区三区在线| 国产精品99一区| 亚洲欧美一区二区精品久久久|