Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

GameProggD3D

Frischling

  • »GameProggD3D« ist der Autor dieses Themas

Beiträge: 67

Wohnort: Walding

Beruf: Schüler

  • Private Nachricht senden

1

17.03.2011, 21:11

[SFML] Auto-Spiel - Driften einbauen?

Hi,

Ich programmiere zurzeit ein Autospiel, bei dem man in der Vogelperspektive in 2D ein Autosprite mit den Pfeiltasten steuert. Die Richtung wird über eine Vektor gesteuert.
Bis jetzt hatt ich keine großen Probleme und habs geschafft, dass das Auto fährt, beschleunigt, links und rechts lenkt, dass es bremsen kann und durch Reibung langsamer wird. Auch Rückwärtsfahren ist eingebaut.
Ich hab es ein paar Leute ausprobieren lassen, und da hab ich den Vorschlag bekommen, ich sollte noch Driften einbauen. Nur leider hab ich nicht so viel Ahnung von echten Autos und weiß deshalb zwar aus zB Need for Speed, wie es ungefähr aussieht, aber hab leider keine Ahnung von der Physik/Mathematik des Driftens und wo man das programmiert.
Und im Internet find ich auch nichts, immer kommen nur so Seiten über Japanische Drift-Autos und nicht über das Programmieren.

Könnte mir das jemand erklären, der das weiß?
Programmiere Zombie-Spiel mit nem Freund

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

17.03.2011, 21:23

Prinzipiell funktioniert das so, dass du zwar das Auto eine Kurve machen lässt, aber es dann doch noch in der vorherigen Richtung bewegen lässt.

Da gibt es einen netten Artikel im Game Programming Gems 4 dazu.

GameProggD3D

Frischling

  • »GameProggD3D« ist der Autor dieses Themas

Beiträge: 67

Wohnort: Walding

Beruf: Schüler

  • Private Nachricht senden

3

18.03.2011, 10:00

Okay, das ist ja schon mal ein Anfang.

Aber ich hab noch eine weitere Frage:

Das Auto bewegt sich ja nicht die ganze Zeit in der vorherigen Richtung, sondern beschreibt ja auch eine Kurve (wenn man ständig driftet, ein Kreis).
  • Wie kann man die einbauen, und welche Form hat die Kurve?
  • Wenn es ein Kreis ist, keine Kurve, kann man das Auto nicht gleich von Anfang des Drifts an im Kreis fahren lassen. Es muss zuerst doch schräg zur Bahn kommen und sich so bewegen, wie Drakon gesagt hat. Wie kann man von dieser Bewegung flüssig zur Kreis/Kurvenbewegung kommen? ?(
  • Um wie viel muss ich die x und y-Werte des Richtungsvektors (sf::Vector2f) pro Frame/Sekunde ändern, damit das Auto entweder in nem Kreis oder in der oben erwähnten Kurve bewegt?
  • Außerdem: Lässt sich das irgendwie in einen Code implementieren, ohne jetzt sowas zu machen?:

    C-/C++-Quelltext

    1
    2
    
    if(drifting) [Für Driften ein wenig abgeänderter Fahrcode von FahreNormal];
    else [FahreNormal];
Wobei in FahreNormal dann alle Bewegungs und Richtungsfunktionen zum Lenken drin sind.
Ich bin mir auf dem Thema ziemlich unsicher :S (war ich aber, bis ich den Dreh raus hatte, bei den anderen Funktionen auch).
Hoffe, jemand weiß Antwort ^^ .
Programmiere Zombie-Spiel mit nem Freund

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

4

18.03.2011, 13:04

Also wie drakon schon gesagt hat: Gems 4 beschreibt das wirklich gut - ist auch eine schöne Abbildung bei ;).
Letztlich basiert dieses Drift-Verhalten darauf, dass du einen Geschwindigkeitsvektor hast und einen Beschleunigungsvektor. Der Beschleunigungsvektor richtet sich nach der Rotation des Wagens(zeigt also immer nach vorne. Der Geschwindigkeitsvektor tut das hingegen nicht, sondern hängt von der Beschleunigung ab und zeigt nicht zwangsläufig immer in die richtige Richtung. So kann man simulieren, dass sich das Fahrzeug zwar dreht, aber durch die hohe Geschwindigkeit mit der die Kurve angefahren wurde, eben noch weiter geradeaus gerutscht wird.
Ist nicht ganz einfach zu erklären, habe aber gerade auch nicht die Zeit Code und Formeln dafür auszutüfteln ;).

GameProggD3D

Frischling

  • »GameProggD3D« ist der Autor dieses Themas

Beiträge: 67

Wohnort: Walding

Beruf: Schüler

  • Private Nachricht senden

5

18.03.2011, 13:36

Geschwindigkeitsvektor hast und einen Beschleunigungsvektor
Mein einziger Vektor ist der Richtungsvektor, der in der Move()-Funktion das Auto um <Geschwindigkeit> pro sekunde in seine Richtung bewegt. Geschwindigkeit und Beschleunigung sind Variablen vom Typ float. Kann ich das trotzdem machen?
habe aber gerade auch nicht die Zeit Code und Formeln dafür auszutüfteln .
schade. ;)

PS: Was ist Game Programming Gems eigentlich? Ich habs bei amazon als Buch gefunden, aber muss man sich das echt kaufen?
Programmiere Zombie-Spiel mit nem Freund

6

18.03.2011, 14:31

Der eine Vektor, den du als Richtungsvektor für dein Auto hast, das ist praktisch der Beschleunigungsvektor den Fred angesprochen hat. Bei einer geradlinigen Bewegung (mit konstanter Geschwindigkeit) stimmt der Richtungs- bzw. Beschleunigungsvektor deines Autos mit dem Beschleunigungsvektor des letzten Frames überein. Es ändert sich nichts. Wenn du jetzt eine Kurve fährst, dann ändert sich zumindest die Richtung des Beschleunigungsvektors. Weil aber im Frame vorher dieser Vektor noch in eine etwas andere Richtung (nämlich weiter geradeaus) gezeigt hat, will sich dein Wagen nach den Gesetzen der Physik auch weiter in diese Richtung (geradeaus) bewegen. Die Trägheit der Masse. Also hast du zwei Vektoren: Der Beschleunigungsvektor, also die Richtung in die dein Auto durch Motorkraft beschleunigt, und der Richtungsvektor, in dessen Richtung auch die Trägheit der Masse wirkt, was also der Richtungsvektor aus dem letzten Frame ist.

Hoffe das hilft dir weiter...

Gruß
SaRu_

PS: Kannst dir von Game Programming Gems auch nur das relevante Kapitel als eBook kaufen. Aber kostenlos gibt es das, soweit ich weiß, nicht.

7

18.07.2011, 20:19

Das hört sich interessant an und hab mich mal daran gesetzt. Mal ehrlich. Ich faile :S
mein Autofährt normal links rechts (ohne Steering technik).

Meine Idee:

Beschleunigungsvector = Richtung*a
Objektposition setzen
Richtungsvectorlast = Beschleungugnsvector

Jetzt muss ich noch vergleichen ob die beiden Vektoren stimmen.
Nun wenn nicht sitmmt.. wie mach ich das? Nehmen wir an, es wurde rotiert. Etwas nach rechts. Also es wird jetzt nach rechts beschleunigt. Das wird ja schon mit "Objektposition setzen" getan.
Jetzt tu ich noch dazu rechnen das es auch die alte Richtung noch behält und die alte Richtung von Beschleunigung her immer langsamer wirdß?
Nur ich komme bei reihenfolge nicht klar

Ich zeig mal wie das bei mir aussieht

Quellcode

1
2
3
4
5
6
7
8
9
            Speed = 1
            Beschleunigungsvector = MainObject:forward()*Speed

            if(Beschleunigungsvector != Richtungsvectorlast) {
                Richtungsvectorlast -=  Richtungsvectorlast*0.001
            }

            holoPos(1, MainObject:pos() + Beschleunigungsvector + Richtungsvectorlast)
            holoAng(1, MainObject:toWorld(ang(0,(KeyE-KeyR)*3,0)))

Da muss ich doch irgendwie $Richtungsvectorlast irgendwo setzen nur ich find kein Platz. Weil so oder so beim nächsten durchlauf neues wert haben wird.
Nichts ist unmöglich.

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

8

19.07.2011, 00:03

Wie wärs die Vektoren einfach zu addieren, normalisieren und darduch die neue Position zu setzten. Dann richtet man das Autosprite nach dem aktuellen Beschleunigungsvektor aus.

MfG

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

9

19.07.2011, 00:05

Du solltest die Rotation des Autos von der Bewegung trennen.

Am besten machst du das ganze einfach mal für einen Ball. Wenn du jetzt einen Ball bewegst und der nach vorne rollt und dann nach links oder recht drückst rollt er ja nicht sofort nach links oder rechts, sondern macht einen Bogen. Das gleiche machst du für dein Auto.
Nun kannst du mit der Rotation des Autos an die Bewegungsrichtung anpassen. Dann hast du bereits ein Auto, welches immer brav auf der Spur bleibt.
Nun führst du einen Schwellenwert ein, ab welchem die Rotation des Autos höher ist als eigentlich die Bewegungsrichtung vorgibt. Und schon driftet das Auto.

Natürlich musst du ein wenig mit dem Schwellenwert und der Rotations Stärke spielen, aber prinzipiell sieht das schon recht gut aus.

Werbeanzeige