2017-02-28 49 views
3

我正在寫一個小遊戲,上面是一些滑動物體的視圖,比如冰壺或沙狐球。 (我碰巧在物理上使用PyMunk,但是因爲這個問題一般是關於物理模擬的,所以不要擔心語言的細節問題。) 在我開始調整我的小sim的所有值之前, '對,我想我最好檢查一下,確保我至少能夠模擬正確的速度曲線。然而,找到明確的答案已經變得比預期的難得多。什麼類型的速度隨時間變化曲線模擬物體在水平面上停止滑動?

模型A

要模擬的對象滑動停止,pymunk允許程序員設置space.damping的方式,其工作原理是這樣(從API參考引用):「0.9手段的值,它每個身體每秒會失去10%的速度。「

這是有道理的,但似乎會產生與此基本形狀的速度 - 時間曲線(不去管確切的數字):

 |* 
    v |  
    e | 
    l | *    
    o | 
    c | * 
    i | * 
    t |  *****  
    y |   **************** 
    ---------------------------*---- 
      time 

換句話說,加速度隨着時間的推移而降低。 (有些人可能更喜歡說「減速」或「內在加速度」減小,但在最純粹的物理意義上,速度的任何變化都是'加速度',而在上面的圖表中速度的變化隨時間變小。)因爲這樣一條曲線將接近但從未穿過0,採用一個臨界值,在該臨界值之下,身體的速度被迫爲0.Pymunk也提供了截止點的設置:space.idle_speed_threshold

這似乎很簡單,但當我在我的小模擬中嘗試過時,結果相當不令人滿意。所以,我開始考慮下面的模型B.

B型

關於它的直覺思維,好像加速度會隨時間而增加,使得這樣的曲線:

 |******** 
    v |  ****** 
    e |    **** 
    l |     *** 
    o |      *** 
    c |      ** 
    i |       ** 
    t |       * 
    y |        * 
    -------------------------------- 
      time 

如果我想跨級表推一本書它似乎首先保持了它的大部分速度,但隨後很快就停止了(可能是因爲摩擦會導致減速速度的增加?儘管這裏的「爲什麼」並不重要)。 如果僅僅因爲沒有內置的方法,這在pymunk中實現起來有點難,但可以完成。 這並不是說我不信任花栗鼠/ pymunk開發者,但我不確定他們是否意味着阻尼來模擬我試圖模擬的東西。

所以,我的問題不是如何在代碼中實現這些曲線中的任何一個,而是 - 哪種類型的曲線準確地建模一個對象在水平面上停止滑動?

你可能會想「爲什麼這個人在編程網站上問一個物理問題?」,但是在查看過去四個小時的物理網站並且無處可去之後,我的希望是,因爲物理建模足夠普遍在編程這些日子裏,SO社區中的某個人可能對此有所瞭解,他們可以隨時分享。

我知道這種討論對SO:how to calculate a negative acceleration? 其中兩種類型的曲線是建議,但同時提問者得到了他的問題回答(有人幫他實現模型-B型曲線),社區沒有達成一個關於哪個更「物理上準確」的共識。 (我還借了提問者的ASCII藝術的圖表之一 - 謝謝。)

我也知道從pymunk陳列櫃卡羅姆板模擬這個例子: https://github.com/samiranrl/Carrom_rl 這也採用了內置阻尼(上面的模型A)。它似乎爲他們的目的正常工作。但可能是我們的人類觀察者不會注意到模型A是不正確的,因爲這些模型片段很長時間沒有運動。模型A在我的模擬中嘗試過時看起來不對,但後來我嘗試了更長時間的慢鏡頭,所以也許它在那裏更加引人注目。或者,對我而言,「看起來」是正確的(模型B)並不是正確的。任何想法都表示讚賞。謝謝!

回答

2

簡短的答案是減速是恆定的。

將冰球保持在表面的力恆定(因爲質量恆定,重力恆定)。這意味着摩擦力是恆定的,因此減速也是恆定的。

的C代碼演示瞭如何用約束輕鬆,正確地做到這一點的例子:https://github.com/slembcke/Chipmunk2D/blob/master/demo/Tank.c

+0

謝謝!我並沒有預料到預期的實施將會受到限制,所以我會仔細研究tank.c,以瞭解你是如何在那裏做到的。感謝您的幫助和鏈接。 –

2

@ slebcke的答案是正確的,我只是想闡述一下實際的物理一點。

一個簡單的摩擦模型就是說,摩擦力是與物體「按壓」在表面上的數量成比例的關係。也就是說,物體被壓下越困難,它感覺到的摩擦就越大。用手指在桌子上玩,你會體驗到同樣的事情。

那麼,我們該如何計算呢?我不知道你對vectors有多熟悉,所以我會盡量保持形式主義。我將假設我們正在查看的對象僅受重力的影響。

的對象是從牛頓定律(負的,因爲它會「向下」)

F_object = -m*g 

這意味着法向力(該表的對象獲得的力)的向下的力現在

F_normal = -F_object = m*g 

,我以前說過的摩擦是

F_friction = k*F_normal 

其中k是介於0和1之間的某個常數(0→沒有摩擦,1→最大摩擦)。由於F_normal在我們的情況下只取決於質量,它是恆定的,所以摩擦力也是恆定的。最後,只需在的相反方向上應用此力,並且您有一個簡單的摩擦工作模型!


所以,我的問題不是如何實現這些或者曲線的代碼,而是 - 這類型的曲線準確地模擬對象滑動停止在一個水平面上?

這個問題本身可能有點偏離主題,但答案(對於這個模型)因此是速度的線性下降(所以既不是你的模型A也不是B)。也就是說,恆定的減速度 - >恆定的減速度 - >速度的線性下降。然而,從公式

s = v*t = (v_0 + a*t)*t = v_0*t + a*t^2 

我們看到斷裂距離以二次方增加。

+0

謝謝!我缺乏S.O. '聲譽'指出你的回答是有幫助的,但確實有幫助。特別是,當設計允許用戶選擇他們如何聽到他們發射滑動物體的代碼時,關於制動距離以二次方增加的最終觀察將是至關重要的。 –