2012-03-29 8 views
1

重力の状態でサーフェス(トランポリン)に作用するボール(円の形のダイナミックボディ)を持っています。特定の衝突角度に対するボックス2dインパルスを計算する

ボールがトランポリン(ポイントAからBに描かれている)に当たると、ボールにインパルス(トランポリンの表面に垂直)を適用したいと思います。

enter image description here

問題は、今私が使用することである:

それは尊重しなければならないが、(表面上)まで(図中の赤方向)に垂直なボールを送信
b2Vec2 impulse = b2Vec2(0, [self fullMass]*[GameMaster sharedInstance].usrTrampolineForce); 

b2Vec2 impulsePoint = _body->GetWorldPoint(b2Vec2(0/PTM_RATIO, -1.0/PTM_RATIO)); 

_body->ApplyLinearImpulse(impulse, impulsePoint); 

特定の現実的な軌跡(黒で描かれている)。

現実的なジャンプをするためにインパルスを適用するにはどうすればよいですか?

つまり、私はボールの交差点のすべてのケースに興味があることに注意してください。例えば、ボールがトランポリン上に落ちる可能性があり、ボールは正しい軌道を有するはずである。

+0

を現実的な軌道は赤_is_。正常に反映され、IIRC。 – brice

+0

@brice私はポイントを作るために絵を描いています。コードを見ると、これが正しい場合は、ABエッジ(エッジとボール方向ベクトルの間の角度)に関係なく、ボールとABエッジの間のすべてのやりとりがボールを作ることになります飛び上がる、現実世界では間違っている。 – Alex

+0

すみません。これは固いサーフェスではありませんが、衝突したときに積極的にボールに衝撃を与えたいとします。 – brice

答えて

4

私はObjective-Cのを読んでいないが、問題は明らかであるように思わ:

あなたのインパルスb2Vec2(0, [self fullMass]*[GameMaster sharedInstance].usrTrampolineForce)は、実際に任意のx成分が含まれていません!

は、xとy成分(擬似コード)にあなたの衝動を分割:

Impulse_magnitude = Ball_mass * Trampoline_Force 
# theta is the angle between the horizontal and your impulse 
# this will depend on the angle of the trampoline. 
Impulse_x = Impulse_magnitude * Cos(theta) 
Impulse_y = Impulse_magnitude * Sin(theta) 
# Create your impulse vector 
Impulse_v = b2Vec(Impulse_x, Impulse_y) 
+0

ねえ、どうやってxのコンポーネントを見逃すことができましたか?これは、コードをコピー・ペーストすると起こります。ありがとうbrice! – Alex

+0

nice :) +1ありがとうございます! – TonyMkenu