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

  C++博客 :: 首頁 :: 聯系 ::  :: 管理
  163 Posts :: 4 Stories :: 350 Comments :: 0 Trackbacks

常用鏈接

留言簿(48)

我參與的團隊

搜索

  •  

積分與排名

  • 積分 - 402367
  • 排名 - 59

最新評論

閱讀排行榜

評論排行榜

物理模擬介紹

如果你很熟悉物理規律,并且想實現它,這篇文章很適合你。

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

內容:

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

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

模擬類
* class Simulation --->  模擬物理規律

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

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

 
  

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

    Mass(float m)                                // 構造函數
    {
        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.根據力的時間,計算物體的位置和速度
 
  

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

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

  
 模擬類怎樣運作:

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

class Simulation
{
public:
    int numOfMasses;                                // 物體的個數
    Mass** masses;                                // 指向物體結構的指針

    Simulation(int numOfMasses, float m)                        // 構造函數
    {
        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()                            //虛函數,在具體的應用中設置各個施加給各個物體的力
    {
                                   
    }

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

    ...

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

    (class Simulation continued)

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

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

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

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

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

 
  

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

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

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

    float dt = milliseconds / 1000.0f;                    // 轉化為秒

    dt /= slowMotionRatio;                        // 除以模擬系數

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

    ...

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

    ...

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

      int numOfIterations = (int)(dt / maxPossible_dt) + 1;            //計算在流失的時間里模擬的次數
    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);            // 向右運動
    }
};

  
 下面我們來創建一個具有恒定加速的物體:

 
  

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

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

    ...

  
 下面的函數設置施加給物體的力 
  

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

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

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

    MassConnectedWithSpring(float springConstant) : Simulation(1, 1.0f)        // 構造函數
    {
        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);       
    }

    ...

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

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 閱讀(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>
            亚洲国产高清一区二区三区| 免费中文字幕日韩欧美| 国产午夜精品视频| 国产亚洲欧美一区二区| 在线日韩av片| 99成人在线| 亚洲午夜视频| 欧美在线二区| 久久综合久久综合久久综合| 欧美日韩国产成人在线免费| 亚洲高清不卡av| 欧美黄色免费| 亚洲精品欧美日韩| 中文av字幕一区| 久久久精品网| 欧美日韩午夜视频在线观看| 国产私拍一区| 日韩午夜在线视频| 久久精品一区二区三区四区 | 亚洲视频播放| 久久久亚洲精品一区二区三区| 欧美福利视频一区| 亚洲在线观看视频网站| 久热精品视频在线| 国产精品乱码一区二区三区| 亚洲精品国精品久久99热| 欧美一二三视频| 亚洲黄色有码视频| 久久av二区| 欧美午夜久久| 亚洲精品免费一区二区三区| 久久久www成人免费精品| 亚洲精品视频在线观看免费| 久久综合伊人| 国产一区二区三区免费不卡 | 羞羞色国产精品| 欧美成人黄色小视频| 国产日本亚洲高清| 亚洲一区二区三区免费在线观看 | 亚洲欧美日韩国产中文| 欧美激情精品久久久久久大尺度| 国自产拍偷拍福利精品免费一| 亚洲视频网在线直播| 亚洲电影中文字幕| 久久综合色一综合色88| 尤物在线观看一区| 久久九九热免费视频| 亚洲影视在线播放| 欧美天天综合网| 一级日韩一区在线观看| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美暴力喷水在线| 欧美一区二区高清| 国产精品一区二区三区四区| 亚洲午夜在线观看| 99精品热视频只有精品10| 欧美成人亚洲成人| 99re6这里只有精品视频在线观看| 欧美成人午夜77777| 久久蜜臀精品av| 亚洲高清视频的网址| 免费看亚洲片| 欧美成人一区二区| 亚洲免费高清| 亚洲免费不卡| 国产精品久久久久久久浪潮网站| 亚洲欧美激情一区| 亚洲欧美在线一区| 一区福利视频| 91久久线看在观草草青青| 欧美激情在线播放| 亚洲伊人色欲综合网| 亚洲综合三区| 一区二区三区无毛| 亚洲激情成人| 国产日韩成人精品| 欧美国产1区2区| 欧美日韩国产一中文字不卡| 性欧美激情精品| 欧美一区二区日韩一区二区| 一区精品在线| 在线天堂一区av电影| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲第一精品夜夜躁人人躁| 亚洲国产精品一区二区尤物区 | 日韩视频―中文字幕| 国产精品美女一区二区| 久久久夜精品| 欧美电影电视剧在线观看| 亚洲自拍偷拍一区| 久久久欧美一区二区| 一本一本大道香蕉久在线精品| 亚洲午夜视频在线观看| 亚洲国产精彩中文乱码av在线播放| 亚洲欧洲综合另类| 国产欧美欧洲在线观看| 亚洲第一区在线| 国产乱码精品一区二区三区忘忧草| 欧美亚洲专区| 亚洲欧美日韩精品一区二区 | 久久久久免费视频| 黄色亚洲在线| 一本大道久久a久久综合婷婷| 国产亚洲美州欧州综合国| 亚洲精品一区二区三区福利| 国产亚洲a∨片在线观看| 亚洲美女毛片| 亚洲第一毛片| 欧美中在线观看| 亚洲伊人久久综合| 欧美黄色网络| 欧美大色视频| 黑人一区二区| 欧美一级视频一区二区| 亚洲一区二区在| 欧美激情一级片一区二区| 鲁大师成人一区二区三区| 国产精品久久久久三级| 亚洲国产高清在线| 亚洲第一中文字幕在线观看| 午夜日韩视频| 性久久久久久| 国产精品美女xx| 99精品欧美| 中文在线不卡视频| 欧美日产国产成人免费图片| 欧美国产日韩亚洲一区| 亚洲国产精品电影| 麻豆成人综合网| 亚洲大片免费看| 亚洲国产成人精品女人久久久| 久久av一区| 久久久噜噜噜久久| 国产亚洲午夜高清国产拍精品| 亚洲欧美成人在线| 久久不射中文字幕| 国产一级一区二区| 欧美在线播放| 女仆av观看一区| 91久久国产综合久久| 欧美国产日韩精品| 亚洲美女精品成人在线视频| 亚洲图片欧洲图片av| 国产精品多人| 香蕉免费一区二区三区在线观看| 久久国内精品自在自线400部| 国产在线欧美日韩| 久久午夜视频| 亚洲伦理网站| 久久aⅴ国产欧美74aaa| 精品福利av| 欧美福利一区二区三区| 一区二区三区国产在线观看| 欧美亚洲日本一区| 极品少妇一区二区三区精品视频| 久久深夜福利| 亚洲精品小视频| 午夜日韩福利| 黄色日韩网站视频| 欧美区视频在线观看| 亚洲欧美日本国产专区一区| 麻豆91精品91久久久的内涵| 亚洲精品影院| 国产美女一区二区| 另类亚洲自拍| 夜夜狂射影院欧美极品| 久久久久久久91| 亚洲精品乱码久久久久| 国产精品欧美日韩一区| 亚洲作爱视频| 国产精品视频免费一区| 亚洲午夜激情免费视频| 免费观看成人| 午夜欧美大片免费观看| 91久久夜色精品国产九色| 国产精品日韩久久久| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美影片第一页| 亚洲免费成人av| 免费在线亚洲欧美| 欧美一区二区成人| 一区二区成人精品| 在线日本欧美| 国产一区二区三区的电影| 欧美日一区二区三区在线观看国产免| 欧美中文在线视频| 亚洲欧美日本在线| 亚洲日韩欧美视频| 免费日韩成人| 久久久之久亚州精品露出| 亚洲欧美一区二区视频| 亚洲免费成人av| 91久久国产综合久久| 一区二区视频在线观看| 国产深夜精品| 国产精品一区免费观看| 国产精品99一区二区| 欧美日韩一本到| 欧美精品二区三区四区免费看视频| 久久视频一区二区|