2012-03-29 8 views
1

Ich habe eine Kugel (ein dynamischer Körper in der Form eines Kreises), die auf einer Oberfläche (Trampolin) unter den Bedingungen einer Schwerkraft wirkt.berechnen box2d Impuls für einen bestimmten Aufprallwinkel

Wenn der Ball auf das Trampolin (im Bild von Punkt A nach B) fällt, möchte ich einen Impuls (normal zur Trampolinoberfläche) auf den Ball ausüben.

enter image description here

Das Problem besteht darin, dass im Augenblick i verwenden:

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); 

welche die Kugel senkrecht (auf der Oberfläche) nach oben (der roten Richtung in der Zeichnung) sendet, obwohl es eine achten soll bestimmte realistische Flugbahn (gezeichnet mit Schwarz).

Wie kann ich den Impuls anwenden, um einen realistischen Sprung zu haben?

, d.h. Beachten Sie, dass ich mich für alle Fälle der Ballkreuzung interessiere. zum Beispiel könnte der Ball auf das Trampolin fallen und der Ball sollte immer noch eine korrekte Flugbahn haben.

+0

Die realistische Flugbahn _is_ rot. Reflexion über das Normale ist richtig, IIRC. – brice

+0

@brice Ich habe das Bild gezeichnet, um einen Punkt zu machen. Betrachtet man den Code, kann man feststellen, dass, wenn dies der richtige Fall ist, das bedeutet, dass unabhängig von der AB-Kante (dem Winkel zwischen der Kante und dem Ballrichtungsvektor) jede Interaktion zwischen dem Ball und der AB-Kante den Ball ergeben würde springe hoch, was in der realen Welt nicht stimmt. – Alex

+0

Ich habe dich. Es ist keine feste Oberfläche, aber Sie möchten dem Ball einen aktiven Impuls geben, wenn Sie eine Kollision haben. – brice

Antwort

4

ich nicht lesen, Objective-C, aber das Problem scheint klar zu sein:

Ihr Impuls b2Vec2(0, [self fullMass]*[GameMaster sharedInstance].usrTrampolineForce) gehört eigentlich nicht jede x-Komponente!

Split Ihren Impuls in x und y-Komponenten (Pseudo-Code):

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

Verdammt, wie könnte ich die x-Komponente verpasst haben ?! Das passiert beim Kopieren und Einfügen von Code. Danke Brice! – Alex

+0

nett :) +1 Danke @Brice! – TonyMkenu

Verwandte Themen