2012-05-03 40 views
1

我有一個移動平臺(運動型車身),它從最初的位置上升。如何防止在Box2D中移動運動平臺和動態物體之間的抖動?

b2BodyDef platformDef; 
platformDef.type = b2_kinematicBody; 
platformDef.linearVelocity = b2Vec2(0.f, 0.5f); 

現在我已經一球(動態體)的播放器控件,它可以在上述平臺上的乘坐上去,從它的位置。這裏的球的數據:

b2BodyDef ballDef; 
ballDef.type = b2_dynamicBody; 
ballDef.fixedRotation = true; 
b2Body *ball = b2dWorld.CreateBody(&ballDef); 
b2FixtureDef fixDef; 
fixDef.shape = &shapeCircle; // a simple b2CircleShape with radius 0.6m 
fixDef.density = 1.f; 
fixDef.friction = 0.2f; 
fixDef.restitution = 0.3f; 
ball->CreateFixture(&fixDef); 

現在球正確地移動移動平臺之上,而有球的身體的整個行程,即它不斷地與上它的移動平臺碰撞的輕微抖動。我試圖將球的賠償率設置爲0,但無濟於事。

如果需要詳細信息,則系統的像素與儀表比率爲0.02。

+0

你是在談論一個明顯可見的抖動,或者說你會得到很多BeginContact/EndContact回調?如果是後者,那麼對此可能沒有什麼可以做的。如果您需要知道球在平臺上的時間,您可能需要將另一個稍微大一點的夾具放在球體上作爲傳感器,以檢測它是否在平臺上。如果你在談論明顯的抖動,我會有點驚訝。我做了基本相同的事情,但沒有發現抖動(請參閱最右邊的平臺頂部的球:http://www.youtube.com/watch?v = vXovY2KTing) – iforce2d

+0

@ iforce2d:好的,我正在考慮第一即明顯明顯的抖動:(是的,我也很驚訝,你是否爲重力矢量設置了一個較低的值,並且該平臺是一個運動體? – legends2k

+0

是的,具有正常重力的運動學。請按照說明中的鏈接進行操作。您的物品是否真的很小?告訴我們,如果沒有一些實際尺寸,PTM也無濟於事:) – iforce2d

回答

1

我相信最好的解決方案將是兩個機構之間的兩個焊接接頭之一。

如果身體在平臺上「靜止」(而不是左右移動),則在球在平臺上時在球和平臺之間創建焊接接頭。

如果球可以從一側移動到另一側,則在兩者之間創建一個棱形關節,關節的方向與平臺平行。

我已經使用了類似的技術來讓蜘蛛在小行星周圍散步(here)。

的真實想法奪去這是有在物理引擎,你可以用它來真正提升總是不能在模擬遊戲的幕後經驗的工具。使用情況的邏輯來改變動態。

在這種情況下,打開或關閉平臺意味着您必須連接或斷開某些其他機制以提供更好的體驗。

引擎可以處理它。在上面的例子中,在小行星的邊界船體上的每個頂點上改變用於在身體周圍走動的關節。