nehe opengl第四十課:繩子的模擬
繩子的模擬:
怎樣模擬一根繩子呢,把它想象成乙個個緊密排列的點,怎麼樣有了思路了吧,在這一課你你將學會怎樣建模,簡單吧,你能模擬更多。
繩索模擬
在這個教程裡我們將模擬一段繩索,我們是在39課的基礎上進行的。
在物理模擬中,我們必須設定各個物理量,就像它們在自然界中的行為一樣。模擬中的運動並不一定和自然界相同,我們使用的運動模型,必須和我們需要模擬的目的有關,目的決定了它的精確度。要知道我們的目標不
是模擬原子和分子,也不是模擬成千上萬的粒子系。首先我們需要確定我們模擬的目標,才能建立我們的物理模型。它和下面內容相關:
1. 運動的數學表示
2. 執行模擬的計算機的速度
1. 運動的數學表示:
這個問題決定了我們使用何種數學方程來模擬運動,使用經典力學還是量子力學。
2. 執行模擬的計算機的速度:
計算機的速度決定了我們可以模擬的精度。
設計繩索的物理模型:
我們在經典力學和高於500mhz的計算機上模擬這個問題。首先我們需要設定需要的精度,我們使用一系列互相用彈簧連線的質點來模擬繩索,精度決定了我們用多少個點來模擬,當然越多越精確。在下面我決定用50或
100個點來模擬繩子一段3或4m長的繩子,換句話說,我們的模擬精度就是3到8厘公尺。
設計運動模型:
在繩子中,施加給各個質點的力來自於自身的質量和相連的內力(參見大學裡的普通力學)。如下我們用"o"表示質點,「—」表示連線質點的彈簧。
o----o----o----o
1 2 3 4
彈簧的力學公式如下:
力 = -k * x
k: 彈性係數
x: 相距平衡位置的位移
上面的公式說明,如果相鄰點的距離為平衡距離,那麼它們不受到任何力的作用。如果我們設定平衡位置為5cm,那麼100個點的繩子長5m。如果相連質點之間的位置小於5cm,它們受到排斥力。
上面的公式只是乙個基礎,現在我們可以加上摩擦力,如果沒有這項,那麼繩子將永遠動下去。
彈簧類:
這個類包含相連線的兩個物體,它們之間具有作用力。
class spring
void solve() // 計算各個物體的受力
springs = new spring*[numofmasses - 1];
for (a = 0; a < numofmasses - 1; ++a) //建立各個質點之間的模擬彈簧}
計算施加給各個質點的力
void solve() // 計算施加給各個質點的力
if (masses[a]->pos.y < groundheight) // 計算地面對質點的作用
masses[0]->pos = ropeconnectionpos; // 更新繩子的連線點和速度
masses[0]->vel = ropeconnectionvel; }
void setropeconnectionvel(vector3d ropeconnectionvel)
有了上面的類,我們可以很方便的模擬繩子,**如下:
ropesimulation* ropesimulation =
new ropesimulation(
80, // 80 質點
0.05f, // 每個質點50g
10000.0f, // 彈性係數
0.05f, // 質點之間的距離
0.2f, // 彈簧的內摩擦力
vector3d(0, -9.81f, 0), // 萬有引力
0.02f, // 空氣摩擦力
100.0f, // 地面反作用係數
0.2f, // 地面摩擦係數
2.0f, // 地面緩衝係數
-1.5f); // 地面高度
下面的**在程式中執行繩子的模擬
float dt = milliseconds / 1000.0f; // 經過的秒數
float maxpossible_dt = 0.002f; // 模擬間隔
int numofiterations = (int)(dt / maxpossible_dt) + 1; // 模擬次數
if (numofiterations != 0)
dt = dt / numofiterations;
NeHe OpenGL第四十一課 體積霧氣
nehe opengl第四十一課 體積霧氣 體積霧氣 把霧座標繫結到頂點,你可以在霧中漫遊,體驗一下吧。這一課我們將介紹體積霧,為了執行這個程式,你的顯示卡必須支援擴充套件 gl ext fot coord include include include include include nehegl...
NeHe OpenGL第四十五課 頂點快取
nehe opengl第四十五課 頂點快取 頂點快取 你想更快地繪製麼?直接操作顯示卡吧,這可是當前的圖形技術,不要猶豫,我帶你入門。接下來,你自己向前走吧。速度是3d程式中最重要的指標,你必須限制繪製的多邊形的個數,或者提高顯示卡繪製多邊形的效率。顯示卡最近增加了乙個新的擴充套件,叫做頂點快取vs...
NeHe OpenGL第四十六課 全屏反走樣
nehe opengl第四十六課 全屏反走樣 全屏反走樣 下面我們來介紹如何使用多重取樣,不向其他的擴充套件,我們在使用多重取樣時,必須在視窗建立時告訴它使用多重取樣,典型的步驟如下 1 建立乙個視窗 2 查詢是否支援多重取樣 3 如果支援刪除當前的視窗,使用支援多重取樣的格式建立視窗 4 如果我們...