2012-01-15 68 views
9

我正在製作一款遊戲,玩家用手指拖動船隻。我使用Box2D作爲遊戲的物理方面。特別是,我使用b2MouseJoint將觸摸事件附加到船上,讓觸摸事件拖動船隻。模擬Box2D中的防水功能

但是有一個問題,船在被拖動時的移動方式並不現實,它可以簡單地拖到任何方向,在現實世界中,船隻只能沿着它的長度移動,並且會有防水性,這使得很難改變船的運動方向。因此,我需要一種模擬防水的方法來使船的運動逼真。

是否可以在Box2D中模擬它?線性阻尼和角阻尼簡單地使船難以移動,但我只是希望船在一個方向上很容易移動,它應該只能抵抗改變方向。

P.S.我不認爲我需要發佈我的代碼這個問題,但是讓我知道如果你想看到代碼摘錄。

+2

您是否嘗試過使用[drag equation](http://en.wikipedia.org/wiki/Drag_equation)?橫截面積術語* A *將根據船相對於其速度的方向而改變,這應該做你想做的事。你總是可以用一些便宜的啓發式來估計* A *。 – Rahul 2012-01-15 04:14:25

+0

@Rahul,謝謝你的提示。我已經通過一些近似技術將阻力方程式添加到代碼中(例如使用速度與船的角度來提供參考區域),我可以看到最新代碼中模擬的一些防水性,但是當似乎有一些瘋狂的運動時船與世界邊界相撞。我想在這裏尋求進一步幫助之前弄清楚什麼是錯誤的。再次感謝提示。 – Lukman 2012-01-20 04:05:44

+0

一個厚臉皮的解決方法可能是創建大量小質量的非常小的圓體,以填充船周圍的空間。我還沒有在物理或處理能力方面測試過這種可行性(但是),這就是爲什麼我沒有把它作爲正確答案提交。 – Andrey 2012-02-14 12:01:16

回答

1

我有一個建議可能是微不足道的,但需要大量的粒子,因此也許有一些額外的處理能力。你可能會創建許多有碰撞的小圓圈,但不能畫出它們。所以你會得到水的模擬效果,但不是水。圓圈的大小將決定你需要填充屏幕的數量以及你的性能。我知道它有點破解,但它可能值得一試。你會發現一個圓圈大小的快樂媒介,它們都具有良好的性能和動態性。

糟糕,它似乎有人已經提出這個...對不起。

+0

不幸的是,IMO,這些粒子會干擾世界上存在的其他物理對象,所以我寧願不使用這種黑客技術。 (還是)感謝你的建議。 – Lukman 2012-02-17 10:51:31

+0

@Fred我最終玩弄了它,這是一個巨大的問題,要麼保持平衡 - 要麼是圈子太大,阻礙所有*運動,要麼整個事情對我的處理器來說太重了。請注意,我正在JS端口上嘗試它,我認爲它通常會慢一點。 – Andrey 2012-02-19 10:16:30

2

這實際上不是一件小事,所以一個'完整'的答案有點希望。 Here是box2d中的一輛汽車示例的鏈接。查看那位先生的demoreel(卷軸中的第三個演示是最相關的),並在他的源代碼中採用一個雄性。他的模擬比你需要完成的更先進一些,所以如果你能理解它的工作原理,那麼創建一個更簡單的版本就沒有問題。

在dougk16的box2d擴展中有很多代碼(可以理解),因此可能很難弄清楚他的汽車是如何工作的。所以這裏有一個簡單的起點:你想模擬一個可以前後移動的物體,也可以轉動。所以這是一種力量,從你的船體當前面向前方或後方延伸,並且一個力矩將使身體向左或向右轉動。這應該是你需要的東西,以獲得非常酷的東西。下面是一些僞代碼,這將是一個合理的地方開始:

if(needs_to_turn) 
{ 
    // turn_direction will either be -1 (left) or 1 (right), boat_torque can be a constant to start with, but should probably be controlled by the user 
    body.ApplyTorque(turn_direction * boat_torque); 
} 

if(needs_to_move) 
{ 
    // facing_vector should be a vector pointing in the direction the boat is facing, the boat_force could be a constant, but again should be controlled by the user 
    body.ApplyForce(facing_vector * boat_force); 
} 

我將結束我的答案與另一個link,此時相關教程。它不像dougk16的動作腳本那麼酷,但它對你來說可能更有用,因爲它是以教程格式。