2016-11-02 77 views
2

我爲了模擬一下「流體機構」使用Phaser.js和P2物理學。您可以在this示例中看到創建了一種流體(約翰沃森的學分)。唯一可能的交互是鼠標移動。做多部分「流體體」作爲一個單一的機構

我已經注意到一些有趣的特性,可能會幫助我得到什麼我假裝這是恢復原狀,重力阻尼。所有這些都包含在示例中。

// Add a force that slows down the droplet over time 
    droplet.body.damping = 0.3; 

// Add bounciness and gravity 
    this.game.physics.p2.restitution = 0.8; 
    this.game.physics.p2.gravity.y = 250; 

一些研究和反射我的結論是,所述主體我尋求必須比實例體這意味着更多的聯合在此之後,在一定限度內,與所述主體(中心的中心的方向上的力+ - 應該適用於所有造成身體的「小身體」。我想即使我用光標移動整個身體,它也會一起移動。總體效應我想是一個樁型體形式(對上部和更多的質量上的底部部分的質量小): basic illustration

爲身體失去質量應該施加到的外力的唯一方式超越抵抗力量保持身體團結的身體。

即使researcing相當長一段時間,我似乎在這個問題上非常失落後...

  • 我應該從字面上選擇P2力(我相信存在)?
  • 我應該使用彈簧來連接所有的小天體? (springs
  • 我怎麼會總是得到「身體的中心」?

謝謝。

回答

1

聲明:我沒有使用Phaser.js,所以我不能幫你的框架。然而,我會盡力分享我對這個問題的一些看法,並希望它能幫助你。

我最近寫了關於可塑性(這可能是你的興趣)this的答案,但你想要的是略有不同。


仿真

首先,讓我們來討論一些關於你的表現進行仿真。你寫的「流體機構」,但是從我的代碼示例中看到的是什麼液體 - 這是一個純粹的粒子模擬與「騙」的物理特性,來自於(1)顆粒的自動阻尼和(2)的restitution在正常說話裝置與所述物體的碰撞如何彈性是(例如,在這種情況下,0.8值意味着動能的20%損失與每一次碰撞)。所以基本上,我們有一個有很多阻尼的粒子模擬。

這產生的東西看起來像'流體'真的很酷,但我的猜測是,這也是由於渲染(例如,將粒子顯示爲小磁盤而不是模糊的東西,它會看起來很多更像你期望的)。

您的問題

如果我真的選擇P2力(我相信存在)?

我其實不確定這是什麼意思,但我猜它是Phaser相關的。

我應該用彈簧來連接所有的小物體嗎? (彈簧)

號如果使用彈性勢能來計算,你會得到一個彈性體從可塑性這是你在找什麼不同的力量。你使用的其他功能將完全決定你的模擬行爲,所以這個想法會有很多的實驗。

如果x_cm是位置(矢量),以質量中心,和x[i]是粒子i的位置,則一個示例可以是:

F(i) = F_constant*(x_cm - x[i]) 

純線性函數。 F_constant是一些(恆定)係數。遠處的粒子將比附近的粒子受到更大的力。然後,您將計算所有粒子的這個力,並相應地應用它。

我將如何獲得「身體中心」?

身體的質量中心是直接計算。在僞代碼,它看起來是這樣的:

var x_cm 
var total_mass = 0 
for each particle p: 
    total_mass += p.mass() 
    x_cm += p.mass()*p.position() 
x_cm /= total_mass 

公式是難以很好地顯示在這裏,但它只是作爲wikipedia相同。


另一種可能性

這個答案已經很長,而只是一個整理思路。從我的角度來看,這聽起來像是你想要類似於沙子的東西(即它是一個類似於你所展示的粒子模擬,但它也堆積如山)。模擬沙子的常見方法是通過上面的精確模擬,但是摩擦力會添加到顆粒上。如果這可能與Phaser有關,我不知道,但我希望這很容易做到。


編輯:有一個錯字在最後一句。使用Phaser模擬沙子,通過在示例模擬中增加摩擦,應該很容易。

+0

嘿。自從你回答以來已經有一段時間了。這是一個很好的答案順便說一句。到現在爲止,我沒有機會問我想要什麼。那麼我理解你的邏輯(我不贊成物理,但我想我知道了)。我遇到的困難之一是將其轉化爲代碼......這與問題本身並無太大關係,但既然您的回答非常好,我認爲您可能會將我帶到某個地方。你如何操作編程中的物理力量......我猜想有人已經完成了這項工作,我會與之互動?我不確定我是否足夠清晰 – DigitalEvolution

+1

@Tojó查看鏈接中的'GameState.prototype.update'功能。你看到他們改變了'droplet.body.velocity'。從力量到速度,記住'F = m * a'和'a = v *Δt' - >'v = F /(m *Δt)'。也就是說,如果計算出某個力F,則可以通過將力與粒子質量相除以及自上次更新以來的時間來找到相應的速度變化。 – pingul

相關問題