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

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

常用鏈接

留言簿(48)

我參與的團隊

搜索

  •  

積分與排名

  • 積分 - 402367
  • 排名 - 59

最新評論

閱讀排行榜

評論排行榜



在這個教程里我們將模擬一段繩索,我們是在39課的基礎(chǔ)上進行的。

在物理模擬中,我們必須設(shè)置各個物理量,就像它們在自然界中的行為一樣。模擬中的運動并不一定和自然界相同,我們使用的運動模型,必須和我們需要模擬的目的有關(guān),目的決定了它的精確度。要知道我們的目標(biāo)不是模擬原子和分子,也不是模擬成千上萬的粒子系。首先我們需要確定我們模擬的目標(biāo),才能創(chuàng)建我們的物理模型。它和下面內(nèi)容相關(guān):

1. 運動的數(shù)學(xué)表示
2. 執(zhí)行模擬的計算機的速度

1. 運動的數(shù)學(xué)表示:

這個問題決定了我們使用何種數(shù)學(xué)方程來模擬運動,使用經(jīng)典力學(xué)還是量子力學(xué)。

2. 執(zhí)行模擬的計算機的速度:

計算機的速度決定了我們可以模擬的精度。

設(shè)計繩索的物理模型:

我們在經(jīng)典力學(xué)和高于500Mhz的計算機上模擬這個問題。首先我們需要設(shè)定需要的精度,我們使用一系列互相用彈簧連接的質(zhì)點來模擬繩索,精度決定了我們用多少個點來模擬,當(dāng)然越多越精確。在下面我決定用50或100個點來模擬繩子一段3或4m長的繩子,換句話說,我們的模擬精度就是3到8厘米。

設(shè)計運動模型:

在繩子中,施加給各個質(zhì)點的力來自于自身的質(zhì)量和相連的內(nèi)力(參見大學(xué)里的普通力學(xué))。如下我們用"O"表示質(zhì)點,“—”表示連接質(zhì)點的彈簧。
O----O----O----O
1 2 3 4

彈簧的力學(xué)公式如下:

力 = -k * x
k: 彈性系數(shù)
x: 相距平衡位置的位移

上面的公式說明,如果相鄰點的距離為平衡距離,那么它們不受到任何力的作用。如果我們設(shè)置平衡位置為5cm,那么100個點的繩子長5m。如果相連質(zhì)點之間的位置小于5cm,它們受到排斥力。

上面的公式只是一個基礎(chǔ),現(xiàn)在我們可以加上摩擦力,如果沒有這項,那么繩子將永遠(yuǎn)動下去。

彈簧類:

這個類包含相連接的兩個物體,它們之間具有作用力。



class Spring
{
public:
Mass* mass1; // 質(zhì)點1
Mass* mass2; // 質(zhì)點2

float springConstant; // 彈性系數(shù)
float springLength; //彈簧長度
float frictionConstant; //摩擦系數(shù)

Spring(Mass* mass1, Mass* mass2,
// 構(gòu)造函數(shù)
float springConstant, float springLength, float frictionConstant)
{
this->springConstant = springConstant;
this->springLength = springLength;
this->frictionConstant = frictionConstant;

this->mass1 = mass1;
this->mass2 = mass2;
}

void solve() // 計算各個物體的受力
{
Vector3D springVector = mass1->pos - mass2->pos;

float r = springVector.length(); // 計算兩個物體之間的距離

Vector3D force;

if (r != 0) // 計算力
force += -(springVector / r) * (r - springLength) * springConstant;
...

force += -(mass1->vel - mass2->vel) * frictionConstant; // 加上摩擦力
mass1->applyForce(force); // 給物體1施加力
mass2->applyForce(-force); // 給物體2施加力
}

下面我們把繩子釘在墻上,所以我們的模擬就多了一個萬有引力,空氣摩擦力。萬有引力的公式如下:

力 = (重力加速度) * 質(zhì)量

萬有引力會作用在每一個質(zhì)點上,地面也會給每個物體一個作用力。在我們的模型中將考慮繩子和地面之間的接觸,地面給繩子向上的力,并提供摩擦力。

設(shè)置模擬的初始值

現(xiàn)在我們已經(jīng)設(shè)置好模擬環(huán)境了,長度單位是m,時間單位是秒,質(zhì)量單位是kg。

為了設(shè)置初始值,我們必須提供供模擬開始的參數(shù)。我們定義一下參數(shù):

1. 重力加速度: 9.81 m/s/s 垂直向下
2. 質(zhì)點個數(shù): 80
3. 相連質(zhì)點的距離: 5 cm (0.05 meters)
4. 質(zhì)量: 50 克(0.05 kg)
5. 繩子開始處于垂直狀態(tài)

下面計算繩子受到的力

f = (繩子質(zhì)量) * (重力加速度) = (4 kg) * (9.81) ~= 40 N

彈簧必須平衡這個力 40 N,它伸長1cm,計算彈性系數(shù):

合力= -k * x = -k * 0.01 m

合力應(yīng)該為0 :

40 N + (-k * 0.01 meters) = 0

彈性系數(shù) k 為:

k = 4000 N / m

設(shè)置彈簧的摩擦系數(shù):

springFrictionConstant = 0.2 N/(m/s)

下面我們看看這個繩索類:

1. virtual void init() ---> 重置力

2. virtual void solve() ---> 計算各個質(zhì)點的力

3. virtual void simulate(float dt) ---> 模擬一次

4. virtual void operate(float dt) ---> 執(zhí)行一次操作

繩索類如下所示 :


class RopeSimulation : public Simulation //繩索類
{
public:
Spring** springs; // 彈簧類結(jié)構(gòu)的數(shù)組的指針

Vector3D gravitation; // 萬有引力

Vector3D ropeConnectionPos; // 繩索的連接點

Vector3D ropeConnectionVel; //連接點的速度,我們使用這個移動繩子

float groundRepulsionConstant; //地面的反作用力

float groundFrictionConstant; //地面的摩擦系數(shù)

float groundAbsorptionConstant; //地面的緩沖力

float groundHeight; //地面高度

float airFrictionConstant; //空氣的摩擦系數(shù)

下面是它的構(gòu)造函數(shù)


RopeSimulation(
int numOfMasses,
float m,
float springConstant,
float springLength,
float springFrictionConstant,
Vector3D gravitation,
float airFrictionConstant,
float groundRepulsionConstant,
float groundFrictionConstant,
float groundAbsorptionConstant,
float groundHeight
) : Simulation(numOfMasses, m)
{
this->gravitation = gravitation;

this->airFrictionConstant = airFrictionConstant;

this->groundFrictionConstant = groundFrictionConstant;
this->groundRepulsionConstant = groundRepulsionConstant;
this->groundAbsorptionConstant = groundAbsorptionConstant;
this->groundHeight = groundHeight;

for (int a = 0; a < numOfMasses; ++a) // 設(shè)置質(zhì)點位置
{
masses[a]->pos.x = a * springLength;
masses[a]->pos.y = 0;
masses[a]->pos.z = 0;
}

springs = new Spring*[numOfMasses - 1];

for (a = 0; a < numOfMasses - 1; ++a) //創(chuàng)建各個質(zhì)點之間的模擬彈簧
{
springs[a] = new Spring(masses[a], masses[a + 1],
springConstant, springLength, springFrictionConstant);
}
}


計算施加給各個質(zhì)點的力


void solve() // 計算施加給各個質(zhì)點的力
{
for (int a = 0; a < numOfMasses - 1; ++a) // 彈簧施加給各個物體的力
{
springs[a]->solve();
}

for (a = 0; a < numOfMasses; ++a) // 計算各個物體受到的其它的力
{
masses[a]->applyForce(gravitation * masses[a]->m); // 萬有引力
// 空氣的摩擦力
masses[a]->applyForce(-masses[a]->vel * airFrictionConstant);

if (masses[a]->pos.y < groundHeight) // 計算地面對質(zhì)點的作用
{
Vector3D v;

v = masses[a]->vel; // 返回速度
v.y = 0; // y方向的速度為0

// 計算地面給質(zhì)點的力
masses[a]->applyForce(-v * groundFrictionConstant);

v = masses[a]->vel;
v.x = 0;
v.z = 0;

if (v.y < 0) // 計算地面的緩沖力

masses[a]->applyForce(-v * groundAbsorptionConstant);

// 計算地面的反作用力
Vector3D force = Vector3D(0, groundRepulsionConstant, 0) *
(groundHeight - masses[a]->pos.y);

masses[a]->applyForce(force); // 施加地面對質(zhì)點的力
}
}
}


下面的代碼完成整個模擬過程


void simulate(float dt) // 模擬一次
{
Simulation::simulate(dt); // 調(diào)用基類的模擬函數(shù)

ropeConnectionPos += ropeConnectionVel * dt; // 計算繩子的連接點

if (ropeConnectionPos.y < groundHeight)
{
ropeConnectionPos.y = groundHeight;
ropeConnectionVel.y = 0;
}

masses[0]->pos = ropeConnectionPos; // 更新繩子的連接點和速度
masses[0]->vel = ropeConnectionVel;
}

void setRopeConnectionVel(Vector3D ropeConnectionVel)
{
this->ropeConnectionVel = ropeConnectionVel;
}


有了上面的類,我們可以很方便的模擬繩子,代碼如下:


RopeSimulation* ropeSimulation =
new RopeSimulation(
80, // 80 質(zhì)點
0.05f, // 每個質(zhì)點50g
10000.0f, // 彈性系數(shù)
0.05f, // 質(zhì)點之間的距離
0.2f, // 彈簧的內(nèi)摩擦力
Vector3D(0, -9.81f, 0), // 萬有引力
0.02f, // 空氣摩擦力
100.0f, // 地面反作用系數(shù)
0.2f, // 地面摩擦系數(shù)
2.0f, // 地面緩沖系數(shù)
-1.5f); // 地面高度


下面的代碼在程序中執(zhí)行繩子的模擬


float dt = milliseconds / 1000.0f; // 經(jīng)過的秒數(shù)

float maxPossible_dt = 0.002f; // 模擬間隔

int numOfIterations = (int)(dt / maxPossible_dt) + 1; // 模擬次數(shù)
if (numOfIterations != 0)
dt = dt / numOfIterations;

for (int a = 0; a < numOfIterations; ++a) // 執(zhí)行模擬
ropeSimulation->operate(dt);


 

我相信這一個教會了你很多,從最開始的模型的建立,到完成最后的代碼。有了這個基礎(chǔ),相信你會創(chuàng)造出很多更有意思的代碼!


posted on 2007-12-30 15:34 sdfasdf 閱讀(899) 評論(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| 欧美精品二区三区四区免费看视频| 欧美一级欧美一级在线播放| 亚洲欧洲一区二区三区| 欧美高清在线一区| 免费h精品视频在线播放| 免费人成网站在线观看欧美高清 | 日韩视频不卡中文| 欧美福利一区二区| 国产精品成人一区二区三区夜夜夜 | 欧美a级片网| 欧美国产日韩视频| 亚洲婷婷免费| 噜噜噜久久亚洲精品国产品小说| 欧美成人亚洲成人日韩成人| 欧美理论在线| 国产综合久久久久久鬼色| 亚洲三级毛片| 欧美一站二站| 亚洲国产美女| 午夜国产精品视频| 欧美—级a级欧美特级ar全黄| 亚洲第一福利社区| 中国日韩欧美久久久久久久久| 久久久久久97三级| 国产精品毛片大码女人| 在线日韩视频| 另类尿喷潮videofree| 亚洲午夜国产成人av电影男同| 免费中文日韩| 在线免费一区三区| 欧美xx69| 欧美福利视频一区| 一区二区三区在线高清| 久久精品盗摄| 欧美一区二区视频在线| 国产欧美日韩三级| 久久国产精品久久精品国产| 午夜精品久久久久久99热| 国产精品久久久久7777婷婷| 亚洲欧美国产精品桃花| 亚洲永久免费精品| 国产小视频国产精品| 久久综合九色综合网站| 欧美va天堂| 欧美一级大片在线观看| 欧美一区二区播放| 亚洲人成在线观看网站高清| 亚洲精品免费一二三区| 国产精品久在线观看| 老司机精品视频网站| 欧美激情中文字幕一区二区| 亚洲一区尤物| 久久婷婷人人澡人人喊人人爽| 99视频热这里只有精品免费| 亚洲免费伊人电影在线观看av| 国产精品一区二区久久国产| 亚洲人成在线观看网站高清| 日韩视频免费在线观看| 国产日韩精品一区观看| 欧美激情一区二区三区在线 | 亚洲国产精品成人精品| 国产精品毛片a∨一区二区三区| 欧美国产激情| 狠狠综合久久av一区二区小说| 亚洲日本中文字幕| 亚洲大胆在线| 欧美在线播放高清精品| 在线综合亚洲| 欧美黑人一区二区三区| 久久久久免费观看| 国产精品久久网| 在线亚洲成人| 一区二区三区回区在观看免费视频| 久久一区二区三区四区| 亚洲影视九九影院在线观看| 欧美α欧美αv大片| 欧美黄色小视频| 在线免费精品视频| 免费av成人在线| 免费在线观看日韩欧美| 亚洲人屁股眼子交8| 男同欧美伦乱| 亚洲国产精品国自产拍av秋霞| 亚洲国产精品v| 欧美精品一区二| 99国产精品久久久久久久| 亚洲一级黄色片| 国产精品一区二区久久久| 亚洲一区中文| 欧美激情四色 | 亚洲图片欧洲图片av| 亚洲欧美日韩精品在线| 国产亚洲激情在线| 欧美大片免费观看| 亚洲欧美日韩精品久久奇米色影视| 久久久欧美一区二区| 正在播放欧美一区| 国产一区二区三区黄视频| 你懂的国产精品永久在线| 亚洲视频精品在线| 亚洲精品免费在线| 欧美华人在线视频| 欧美一区二区三区在线免费观看| 亚洲国产精品高清久久久| 国产揄拍国内精品对白| 欧美日韩系列| 欧美日本一区| 欧美视频不卡中文| 欧美激情视频给我| 免费在线成人av| 久久婷婷久久| 免费日韩精品中文字幕视频在线| 久久精品一区二区国产| 欧美一区二区三区喷汁尤物| 亚洲视频免费观看| 亚洲一区二区三区三| 中文高清一区| 午夜视频一区二区| 亚洲综合色视频| 欧美一级一区| 欧美有码在线观看视频| 小黄鸭精品密入口导航| 亚洲欧美日韩另类精品一区二区三区| aⅴ色国产欧美| 国产精品99久久久久久人| 中文欧美字幕免费| 欧美亚洲视频在线观看| 新67194成人永久网站| 亚洲影院免费| 欧美国内亚洲| 亚洲欧洲av一区二区| 欧美国产第一页| 久久深夜福利免费观看| 狠狠入ady亚洲精品| 久久久999国产| 久久综合伊人| 日韩一级在线| 久久国内精品视频| 女女同性精品视频| 亚洲夜晚福利在线观看| 久久先锋资源| 国内精品久久国产| 亚洲欧美日韩在线观看a三区| 欧美大片免费看| 久久久久国色av免费观看性色| 国产美女高潮久久白浆| 夜夜嗨av色一区二区不卡| 久久一区国产| 久久国产精品99国产| 国产综合色产在线精品| 美女视频黄免费的久久| 欧美在线观看一区| 国产在线精品成人一区二区三区| 欧美一区二区视频在线| 这里只有精品在线播放| 9色porny自拍视频一区二区| 欧美精品自拍| 99精品久久久| 9久re热视频在线精品| 国产麻豆91精品| 久久久久高清| 欧美人成免费网站| 久久疯狂做爰流白浆xx| 欧美成人久久| 另类专区欧美制服同性| 欧美日韩精品一区二区天天拍小说| 午夜宅男久久久| 欧美日韩国产综合视频在线观看中文 | 久久精品二区亚洲w码| 亚洲乱码国产乱码精品精98午夜| 亚洲女同精品视频| 日韩视频一区二区| 久久久99国产精品免费| 欧美亚洲一区二区三区| 国产精品久久久久久久9999| 亚洲国产精品精华液网站| 国产一区自拍视频| 亚洲精品影院| 一本久道久久综合中文字幕| 久久这里只有精品视频首页| 午夜一区不卡| 国产精品日本精品| 亚洲在线观看免费视频| 一本久道久久综合中文字幕| 欧美韩国一区| 日韩一区二区免费看| 亚洲自拍啪啪| 日韩天堂在线观看| 亚洲人成亚洲人成在线观看| 欧美1区免费| 一区二区三区视频在线观看| 性久久久久久久| 亚洲二区在线| 国产精品v亚洲精品v日韩精品| 亚洲一区二区三区在线播放| 免费视频一区二区三区在线观看| 日韩午夜电影在线观看|