An Wand entlanggleiten



  • Hallo,

    ich habe ein Programm geschrieben, mit dem ich mich in einer 3D-Welt bewegen kann und vor Wänden stehen bleibe (wenn eine Kollision erfolgen würde). Nun möchte ich aber an der Wand entlangrutschen, wenn ich schräg gegen die Wand laufe. Wie könnte ich das anstellen?

    mfg Rab-Bit



  • Hi,

    wenn der Richtungsvektor nicht parallel zum Normalenvektor der Wand verläuft (sonst rennt man genau frontal gegen die Wand) dann "biege" deinen Richtungsvektor für die Bewegung einfach so um, dass er parallel zur Wand verläuft.

    Ciao,
    Stefan



  • Danke für deine Antwort. Aber wie kann ich den Richtungsvektor denn entsprechend umbiegen?



  • Ich deute dir nur mal gorb die Richtung an 😃

    Such dir mal ein Tutorial, das zeigt, wie man einen Vektor auf einen anderen projeziert (Skalarprodukt)

    Projeziere den Richtungsvektor auf den zum Normalvektor senkrecht stehenden Vektor - der projeziert Vektor entspricht dem "umgebogenen" Vektor



  • Auch immer wieder gern genommen 🙂

    http://www.peroxide.dk/download/tutorials/tut10/pxdtut10.html

    Was besseres gibts zum Thema imho nicht.


  • Mod

    eine sehr einfache mothode ist, wenn du in die wand reingelaufen bist, schieb den spieler in richtung normale der wand bis er sie gerade nur beruehrt.



  • rapso schrieb:

    eine sehr einfache mothode ist, wenn du in die wand reingelaufen bist, schieb den spieler in richtung normale der wand bis er sie gerade nur beruehrt.

    Ist das Ecken-sicher? 😛

    Wenn ich jetzt jede Wand/Boden/Decke durch eine Ebene beschrieben habe, muss ich doch alle potenziellen Widerstände testen. Ich hatte das zu q3bsp mal implementiert, aber irgendwie konnte ich mich manchmal in ner Ecke aus der Karte mogeln... War wahrscheinlich mein Fehler...



  • Danke für die Antworten. Ich habe nur nachgefragt, weil ich mich mit Vektoren noch nicht so gut auskenne. Habe es nach einigem Rumprobieren dann aber schon so gelöst gehabt:
    Ich bilde das Kreuzprodukt aus Richtung der Y-Achse (0 1 0) und dem Richtungsvektor der Wand. So gleite ich aber immer nur in einer Richtung (nach links) an der Wand entlang. Also bilde ich das Skalarprodukt meiner ursprünglichen Bewegung und der neu errechneten. Ist das Ergebnis größer als 0, so muss ich in die andere Richtung gleiten, also das Kreuzprodukt andersrum bilden.

    Das Tutorial werde ich mir aber auch noch mal anschauen.

    mfg Rab-Bit


  • Mod

    xindon schrieb:

    rapso schrieb:

    eine sehr einfache mothode ist, wenn du in die wand reingelaufen bist, schieb den spieler in richtung normale der wand bis er sie gerade nur beruehrt.

    Ist das Ecken-sicher?

    relativ sicher, auch an spitz zulaufenden kannten, falls der spieler dann von beiden waenden abwechseln zurueckgestossen wird.

    einziges problem exisitert, wenn sich zwei waende eng gegenueber stehen und derspieler in soeine spalte laeuft. da muss man schon viele specialfaelle beachten damit es sauber laeuft. aber oft ist es so, dass jedes system fehler hat und dann das spiel dazu angepasst werden muss. (z.b. eben noch solche sonderfaelle machen)



  • könnte es nicht passieren, dass ein Spieler sich dann durch "geschicktes in die Wand laufen" schneller bewegen kann als vorgesehen?


  • Mod

    laut pytagoras nicht

    je nach penetrationswinkel betraegt der maximale bewegungsvector etwas zwischen 0 und |Dir|

    falls er genau entgegen der normal in die wand penetriert, schiebt ihn die normal genau an den ausgangspunkt zurueck. wenn er im minimalen winkel penetriert, also fast senkrecht zur normalen, sodass er also seinen vollen weg ausnutzt und auch noch zurueckgeschoben wird, ist er nicht weiter als ihn sein normaler bewegungsvector gebracht haette.

    der beweungsvector ist quasi die hypotenuse, die normale ist die gegenkathete und von der letzten position zur aktuellen ist die ankathete 🙂



  • Nur mal so als Überlegung, stimmt folgende Formel:
    b\vec b Alter Bewegungsvektor
    nw\vec n_wNormale der Wand
    nb\vec n_bNormale des Bodens
    h=n_w×n_b\vec h = \vec n\_w \times \vec n\_b
    s=(hb)hh2\vec s = \frac{(\vec h \cdot \vec b) \cdot \vec h}{\vec h^2}(erster Punkt Skalarprodukt, zweites Skalarmultiplikation, Quadrat Skalarprodukt mit sich selbst = Quadrat der Länge)
    Vektor s wäre dann die neue Bewegungsrichtung. Eventuell müsste man sie noch umdrehen. Hätte man letzte Formel nicht noch vereinfachen können? Nach meinen händischen Rechnungen kommt zumindest das richtige raus (ohne Umdrehen) und weil mich Vektorrechnung fasziniert wollte ich das mal selbst ausprobieren.


Anmelden zum Antworten