Ich versuche ein einfaches 3D-Spiel zu erstellen und muss den Spieler innerhalb der Grenzen der Spielwelt einschränken. Wenn der Spieler die Seiten der Welt trifft, möchte ich, dass das Schiff des Spielers leicht abprallt.
Tatsächlich versuche ich, den Spieler in einer Kiste zu fangen und ihn daran zu hindern, durch die Seiten zu entkommen ...
Ich habe es geschafft, die Grenzen der Spielwelt als eine Sammlung von Flugzeugen mit Normalen und Entfernungen vom Ursprung zu definieren. Der Spieler hat eine sphärische Begrenzungskugel und durch das Folgen dieser Website http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php konnte ich Kollisionen erkennen.
Ich kann jetzt nicht genau herausfinden, was zu tun ist, wenn eine Kollision erkannt wird. Das Beste, was ich schaffen kann, ist, dass der Spieler im Flugzeug stecken bleibt, direkt durch das Flugzeug fliegt oder wiederholt mit einer sehr schnellen Geschwindigkeit davon abprallt.
Der gesunde Menschenverstand sagt mir, dass ich den vom Flugzeug reflektierten Winkel unter Verwendung seiner Normalen berechnen und auf die Geschwindigkeit des Spielers anwenden muss. Ich denke jedoch, ich muss zuerst sehen, ob der Spieler das Flugzeug durchlaufen hat, was das Bit ist, das ich nicht kann trainieren.
quelle
distance = speed * time
normalerweise mit einem extra kleinen Abstand, um Fehler zu vermeiden) und dann seine Geschwindigkeit auf das Kollisionsergebnis aktualisieren.F = ma oder a = F / m. Berechnen Sie den Kollisionspunkt zwischen Kugel und Ebene. Dies ist normalerweise der Kugelmittelpunkt - normaler * Radius. Wenn Sie mehr Genauigkeit wünschen, berechnen Sie, wie weit die Kugel in die Ebene eingedrungen ist, und passen Sie Ihre Berechnung an. Dies ist natürlich weitgehend optional, es sei denn, Sie möchten eine wirklich genaue Physik. Berechnen Sie nun die Relativgeschwindigkeit entlang der Normalen. Für eine statische Ebene ist dies: Vball Dot N. Dann multiplizieren Sie VballDotN mit -1 und multiplizieren Sie mit Masse. In der Physik würden Sie dies zu diesem Zeitpunkt auch mit dem Restitutionskoeffizienten (Bounce-Faktor) multiplizieren. Multiplizieren Sie diesen Skalar mit N und Sie haben Ihre Kraft.
Teilen Sie beim Einstellen von Vball die Kraft erneut durch die Masse und Sie haben die endgültige Beschleunigung. Addieren Sie diese einfach zur Geschwindigkeit und Sie haben Ihre endgültige Geschwindigkeit nach der Kollision.
Diese Methode entspricht den Formeln der Kollisionsreaktion. Wenn Sie noch mehr Genauigkeit wünschen, sollten Sie die Reibung berücksichtigen, die dazu führt, dass sich der Ball dreht, aber ich weiß nicht, ob Sie das in Ihrem Spiel wollen. In diesem Fall berechnen Sie die Tangentialkraft folgendermaßen:
Stellen Sie sicher, dass Sie Ft berechnen, bevor Sie lineare Effekte anwenden, da sonst die Reibung nicht genau ist.
quelle
vec3 F = -CollisionNormal * (1.0f+Ball.getRestitution())*vDotN;
?Ich würde vorschlagen, zuerst die Entfernung vom Flugzeug zu berechnen. und dann, wenn der Abstand <= zum Radius die Kollisionsreaktion ausführt.
Sie können dies dann ändern, um die Entfernung zu berechnen. Wenn die Entfernung kleiner als der Radius ist (was bedeutet, dass sich das Objekt überlappt), verschieben Sie die Position der Kugeln und führen Sie dann die Kollisionsreaktion aus.
quelle