Problem mit der Kollisionserkennung von einem sich schnell bewegenden ball mit einem Schläger gesteuert durch Maus
In der Einheit, ich habe einen Schläger soll um einen ball zu schlagen, und der Schläger wird direkt gesteuert durch die Maus, ich.e die Fledermaus wird mit der Maus verschoben mit der Maus Achsen und der Verwendung zu verwandeln.translate () - Funktion, bewegen Sie den Schläger.
Erwartete ich, dass Unity3d Physik nicht richtig übersetzen Sie die Schläger-Bewegung direkt die Maus und die Auswirkungen der ball entsprechend, und hätte ich etwas zu schreiben Brauch, und es stellte sich heraus, um wahr zu sein.
Aber der ball Kollision wird nicht richtig erkannt, wenn der Schläger bewegt. Wenn es immer noch ist, ist alles in Ordnung, und der ball verhält, wie ich möchte.
Nun ich ging so weit wie das schreiben eines benutzerdefinierten Physik script (ich nutze C# - scripting), in dem ich befestigt 4 raycasts der Länge 0.6 F auf den ball, und nachdem ich einige der komplexe Vektor-Berechnungen, die Berechnung der Geschwindigkeit des Balles nach dem Auftreffen auf den Schläger, und wenden Sie es direkt auf die Geschwindigkeit der ball mit Festkörper.Geschwindigkeit = calculateVelocity(). Jetzt ist es wieder gut, wenn der Schläger nicht bewegt, aber nicht wenn ich mich bewege den Schläger. Die genaue (Symptome) problem ist:
Verwendung der integrierten Physik-und Kollisions-Erkennung: Wenn der Schläger bewegt sich der ball manchmal pass quer durch den Schläger, und manchmal, verlangsamt es (zu unglaublichen Ebenen).
Mit meinem Skript zum berechnen der Geschwindigkeit: das problem ist Das gleiche, aber es lässt mich erkennen, was falsch ist, wenn ich drucken Sie die normale des collider (die Schläger). Manchmal geben die Recht normal, und irgendwann gibt das negativ des normalen-Vektor, was bedeutet, dass es geradeaus durch die Obere Oberfläche und die Erkennung der Treffer mit der Unterseite des collider (Schläger).
Die Dinge, die ich versucht habe:
-
Erhöhung der Größe des collider (es funktioniert mit der breiteren box collider auf dem Schläger, aber dann offensichtlich den ball aus einiger Entfernung, Weg von den Schläger, und mein eigenes script hier funktioniert, Standard-Physik seltsame Ergebnisse, wenn Schläger bewegt wird), kurz gesagt ich bekomme nicht die Realität, die ich will.
-
Verringerung der festen timestamp zu 0,001 deutlich verbessert, aber immer noch sehr sehr weit entfernt von dem Ergebnis, das ich will, und der ball ist wieder ganz oft die Kommissionierung der falschen Seite den ball.
-
Ändern Kollisionserkennung zu kontinuierlichen dynamischen. Die nicht Dinge verbessern entweder.
Und zusätzlich auf die falsche Seite ausgesucht, bei der Kollision, ein weiteres problem, das ich beobachtet habe ist, dass nach dem abprallen der Schläger, der ball bewegt sich aber der Schläger schneller bewegt, es stattdessen, sich in einem kompletten Bogen oder Linie, irgendwie erscheint vor dem ball, was in zwei Treffern. Es ist eine Vermutung basierend auf dem, was sichtbar ist.
Es ist auch klar, dass die "Bewegung" Aspekt der Schläger ist nicht das vorlesen durch die Unity3d built-in Physik, was ein seltsames Verhalten, wenn Schläger bewegt sich mit der Maus trifft den ball.
Bin ich stecken geblieben, ich habe keine Ahnung, wo sich zu bewegen von hier aus. Bitte sagen Sie mir, was ich falsch mache.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie andere haben darauf hingewiesen, das problem ist, dass der ball geht von einer Seite der pad in einem Bild und auf der anderen Seite in die nächste. Sich schnell bewegende Objekte neigen dazu, das zu tun, wenn die Barrieren sind zu schmal.
Es gibt drei sehr einfache Lösungen für dieses problem:
Einstellung einer Höchstgeschwindigkeit für das verschieben von Objekten ist etwas, das muss immer gemacht werden. Sie können nicht das Risiko ein, dass ein wichtiges Objekt die Höhe Schießen, während das Spiel und lassen alles in einen unkontrollierten Zustand.
Was ich denke passiert, ist, dass jedes Intervall, das passiert den ball/Schläger bewegt werden und dann überprüft eine Kollision. Das Problem ist, dass der ball/Schläger bewegen zu weit in ein einzelnes Intervall und miss die Kollision.
Also, was Sie tun müssen, ist in Ihrem FixedUpdate () - Methode des ball GameObject ist, werfen Sie einen Strahl von der aktuellen ball Position, um den vorherigen ball Lage. Wenn es etwas gibt, zwischen diesen beiden Punkten aufweisen sollte, getroffen wurde (also der Schläger) den ball bewegen, zurück zu den gemeldeten Treffer-Punkt auf dem Strahl. Dies löst Ihre bestehende collision-detection Zeug.
Den Grund der Erhöhung der Größe der collider funktioniert so gut, weil der ball ist nicht das überspringen der lager-collider. Dies hat die Nachteile, die Sie in Ihrer Frage erwähnt. Die ray-casting vermeidet dieses Problem und ermöglicht den ball/Schläger zu bewegen, so schnell oder langsam wie Sie benötigen.
Dies ist keine vollständige Antwort, aber ich erinnere mich an den Umgang mit einem problem, wie dies vor vielen Jahren auf langsameren Maschinen.
War das problem mit sprite-basierende Kollisionserkennung; sich auf Pixel, die für den sprite und Hindernis gerendert, an den gleichen Koordinaten. Wenn die frame rate ist so niedrig, dass sich das sprite bewegt sich mehr als die Hindernis-Größe in einem Rahmen, werden Sie in Situationen, in denen es (zum Beispiel) Links von dem Hindernis in einen frame und rechts das Hindernis in das nächste Bild, ohne jemals besetzen die gleichen Pixel.
In diesem Fall sprite-basierte Kollisionen nicht funktioniert, Sie müssen base-Kollisionen auf Vektoren. Anstelle der überprüfung jedes sprite-pixel für Kollisionen, erfassen Sie die position und die konvexe Hülle der sprite. Nach jedem frame, berechnen Sie einen Vektor von der alten position an die neue position und schneiden Sie es mit der konvexen Hülle jedes Hindernis.
Gibt es mehrere Verknüpfungen, die Sie machen können, wie der Vergleich nur gegen die bounding-Boxen im ersten und die Berechnung der Rumpf nur dann, wenn der Vektor schneidet eine bounding-box, aber das ist die Grundidee. Viel Glück.
Ich habe auf einer 3d-pong-Spiel als gut, und haben, laufen Sie in exakt die gleichen Probleme. Ich werde versuchen, vergrößert alles wie Sie Jungs haben. Als für das Paddel hinzufügen von Geschwindigkeit und spin auf den ball, ich war verblüfft über diese, bis ich merkte, dass die änderung der position der Paddel ändert nicht seine Geschwindigkeit. Wenn das Paddel wurde bei einer Geschwindigkeit von null, bevor es verschoben wurde, wird es auf null gesetzt, wenn die Physik-engine sieht es nächsten frame. Un-überprüfung ist kenimatic und Steuern das Paddel direkt über den velocity-Eigenschaft das problem behoben. Es verursacht die Paddel, um jitter, wenn die Wände schlagen, aber ich fest, dass durch das entfernen der Wände von der Paddel-Ebene und der Umgang mit Grenzen manuell in LateUpdate. Auch, wenn Sie aktualisieren Sie die Geschwindigkeit, erste store der neuen gewünschten Geschwindigkeit, in der Aktualisierung, so dass die Kontrollen reibungslos funktioniert, dann übernehmen Sie die änderungen in FixedUpdate.