Frage

Ich möchte einen Ball in einem Winkel abzulenken, je nachdem, wo es ein Paddel trifft. Gerade jetzt, ich bin zu ändern nur das y-Koordinate, die in einer uninteressanten Ablenkung führt. Es wird Winkel aber unabhängig von Trefferlageneinstelleinheit gegen das Paddel. Ich würde etwas mehr Spaß mögen. Geschwindigkeit, Impuls, Masse und andere Faktoren, brauchen nicht berücksichtigt zu werden. Gerade Winkel auf Auftreffstelle des Paddels abhängig. Ich habe diese keine Zahl gelesen Fehler (NAN) tun Kollisionserkennung in einem iphone app aber es scheint zu kompliziert für das, was ich suche. Gibt es einen einfacheren Weg, um die Durchbiegung zu berechnen?

Die Objekte sind zwei UIImageViews.

War es hilfreich?

Lösung

Nun, nichts realistisch, aber man könnte etwas tun, so dass der abgehende Winkel nur davon ab, wo auf dem Paddel ist er trifft.

Ich habe nie ein iPhone oder Objective-C-Codierung durchgeführt, so werde ich nur etwas in pseudo / C-Code aufzuschreiben.

Zuerst würde ich die Geschwindigkeit berechnen, die die Länge des Geschwindigkeitsvektors, oder:

double speed = sqrt(velX * velX + velY * velY); // trigonometry, a^2 + o^2 = h^2

Dann wollen wir den neuen Winkel berechnen, basierend auf, wo wir das Paddel getroffen. Ich gehe davon aus, dass Sie die X Kollision in IMPACTX speichern und die Länge des Paddels in paddleLength. Auf diese Weise können wir einen Outbound-Winkel berechnen. Lassen Sie uns zunächst herausfinden, wie die Reichweite zu berechnen, so dass wir einen Wert zwischen -1 und 1 erhalten.

double proportionOfPaddle = impactX / (double) paddleLength; // between 0 and 1
double impactRange = proportionOfPaddle * 2 - 1; // adjust to -1 and 1

Nehmen wir an, wir wollen nicht auf die Seite den Ball vollständig abzulenken, oder 90 Grad, da das ziemlich hart sein würde, von sich zu erholen. Da ich die impactRange als neuer VELY verwenden werde, ich werde es verkleinerte -0,9 bis 0,9 zu sagen.

impactRange = impactRange * 0.9;

Jetzt müssen wir die velX berechnen, so dass die Geschwindigkeit konstant ist.

double newVelX = impactRange;
double newVelY = sqrt(speed * speed - newVelX * newVelX); // trigonometry again

Nun kehren Sie die newVelX und newVelY und Sie haben einen Einfluss und geschwindigkeitsabhängigen Sprungkraft.

Viel Glück!

(Könnte sehr gut Bugs in hier, und ich könnte die X oder Y habe invertiert, aber ich hoffe, dass Sie die allgemeine Idee).

EDIT . Hinzufügen von ein paar Gedanken über die IMPACTX bekommen

Nehmen wir an, Sie ball.center.x haben und die paddle.center.x (nicht wissen, was Sie es nennen, aber lassen wir das paddle.center.x nehmen wird uns die Mitte des Paddels) wir sollten Lage sein, die impactRange aus, dass zu berechnen.

Wir müssen auch den Kugelradius (Ich werde als der Durchmesser annehmen ball.width) und das Paddel Größe (paddle.width?).

int ballPaddleDiff = paddle.center.x - ball.center.x;
int totalRange = paddle.width + ball.width;

Der kleinste Wert für ballPaddleDiff wäre, wenn der Ball gerade ist die Seite des Paddels zu berühren. Das ballPaddleDiff würde dann paddle.width / 2 + ball.width / 2 sein. So ist die neuen impactRange wären daher

double impactRange = ballPaddleDiff / (double) totalRange / 2;

Sie sollten wahrscheinlich die impactRange überprüfen, so dass es tatsächlich zwischen -1 und 1, so dass der Ball nicht weg nicht schießt in die Sterne oder so etwas.

Andere Tipps

Sie müssen nicht unbedingt realistisch wollen, möchten Sie Spaß. Das ist nicht immer ein und dasselbe. Wenn Sie realistisch wollte, nicht Geschwindigkeit werfen kann, Impuls, Masse usw. In einem normalen Spiel der Tischtennis, wo der Punkt es den Schläger spielt eigentlich keine Rolle, Theres kein Sweet Spot wie auf einem Tennisschläger .

Entwickeln eine mathematische Funktion, die einen Ausgangsvektor zurück, oder eine Geschwindigkeit und einen Einheitsvektor, die den Ausgangswinkel und die Geschwindigkeit des Balls, givin einen Eingangswinkel, Geschwindigkeit, Stoßpunkt auf dem Paddel, und die Geschwindigkeit des Paddels .

Wir erwarten bereits, dass der Ausgangswinkel = -1 * Eingangswinkel. Ausgabegeschwindigkeit würde auch * die Eingangsgeschwindigkeit -1 zu erwarten. Also, wenn Sie es bis mischen möchten, stellen Sie diese. Sie könnten den Ausgangswinkel proportional zu dem Abstand von der Mitte des Paddels erhöhen. Sie können auch den Winkel oder die Geschwindigkeit proportional zur Geschwindigkeit des Paddels, wenn seine Treffer erhöhen.

Es gibt viele Möglichkeiten, wie Sie das tun könnte, so kann ich Ihnen genau sagen, was nicht wirklich funktionieren würden Sie verwenden, Sie gehen zu müssen, dass mit Tests, um herauszufinden und zu spielen. Wenn Sie noch mehr Informationen benötigen mehr Einzelheiten zu Ihrer Frage hinzufügen.

Der folgende Code (C ++, aber leicht genug, um ObjC zu konvertieren), nimmt ein eingehendes 2D-Vektor und reflektiert es basierend auf einer Fläche normal (das Gesicht Ihres Tennisschlägers).

Sie könnten einig zufälligen ‚Spaßfaktor‘ hinzufügen, indem Randomisierung ein Offset, dass Sie entweder auf ‚Skalar‘ gelten würden -. Geschwindigkeit zu ändern, oder auf die Oberfläche normal, den Reflexionswinkel zu ändern

Ich verwende in meinem iPhone-Projekt, und es funktioniert gut:)

void vec2ReflectScalar(vec2& vResult, const vec2& v1, const vec2& normal, float scalar)
{
    vec2  _2ndotvn;
    float dotVal = vec2DotProduct(v1, normal); 

    vec2Scale(_2ndotvn, normal, scalar * 2.f * dotVal);
    vec2Subtract(vResult, v1, _2ndotvn); 
}

void vec2Reflect(vec2& vResult, const vec2& v1, const vec2& normal)
{
    vec2ReflectScalar(vResult, v1, normal, 1.f);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top