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

trash52

Treue Seele

  • »trash52« ist der Autor dieses Themas

Beiträge: 86

Wohnort: Dresden

  • Private Nachricht senden

1

14.01.2009, 20:40

Kollisionsbehandlung

Ich hab meine 3D-Kollisionserkennung nun fertig gestellt, die Octrees funktionieren auch gut,

nun hab ich noch folgendes Problem:

gegeben:

Positon und Rotation von 2 Schiffen,

die Bewegung wird so realisiert:

GetkeyState('W') <0 springe um 300 * Zeit Einheiten in Richtung der relativen Z -Achese eines Schiffes

Nun hab ich über die Kollisionserkennung einen Schnittpunkt der beiden Schiffe gefunden.

Über den Impulserhaltungssatz:
m1*(v1-v1') = m2*(v2'-v2)
sollen die neuen Geschwindigkeiten berechnet werden.


Die Frage ist nun:

Unter gegebenen Bedingungen, wie berechnet man den neuen Kurs der beiden Schiffe?

(bisher hab ich zufallsvektoren genommen, was ja totaler murks ist)

2

14.01.2009, 21:09

Man verzeihe meine Paintzeichnung :D
Wenn man davon ausgeht, dass der Stoß vollkommen elastisch ist, dann zerlegt man die Geschwindigkeit in einen Teil, der in Richtung des Stoßpartners geht und in einen Teil, der senkrecht dazu verläuft.


(Link)


Allerdings ist die physikalische Sicht nicht immer eine für ein Spiel interessante.

trash52

Treue Seele

  • »trash52« ist der Autor dieses Themas

Beiträge: 86

Wohnort: Dresden

  • Private Nachricht senden

3

14.01.2009, 21:43

Danke dir für die Zeichnung die sagt mehr als 1000 Worte.


in 2d ist das gut zu lösen, fällt mir gerade auf,

man leg eine Geraden durch die Punkte rot und schwarz.

eine Paralelle wird durch den Kollisionspunkt der 2 Schiffe gelegt.

anschließend den anstieg umkehren und je eine Gerade durch die Punkte rot und schwarz legen und anschließend mit der Parallelen schneiden lassen, so erhält man 2

weitere Punkte, und hat damit die Vektoren in komponenten aufgeteilt.

gut das hab ich jetzt verstanden.



Nur wie macht man das in 3D-Raum?

(Link)

4

14.01.2009, 22:21

Genauso. Du verbindest die Punkte im Raum.

Bildest den jeweils Geschwindigkeitsvektor auf diese Verbindung ab.
Bildest den jeweils Geschwindigkeitsvektor zusätzlich auf der senkrechten zu dieser Verbindung ab. Die senkrechte muss allerdings in der Ebene liegen, die durch die Verbindung und dem Geschwindigkeitsvektor gebildet werden (Allerdings müssen beide senkrechten nicht zwangsläufig in der gleichen Ebene liegen).

Dann bildest du jeweils aus dem auf die Verbindungslinie abgebildeten Geschwindigkeitsvektor des anderen und dem auf die Senkrechte abgebildeten Geschwindigkeitsvektor des eigenen Schiffes durch Addition die neue Geschwindigkeit.

(Ich hoffe ich laber grad keinen Müll^^)

[Edit:] 404 Beiträge![/Edit]

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

5

14.01.2009, 22:26

Sei N die Kollisionsnormale (von Schiff A aus), und v1 und v2 die jeweiligen Geschwindigkeitsvektoren.

Nun musst du einfach die v an N spiegeln, dazu projezieren, abziehen und negieren:

vN = (v1*N) * N;
vT = v1 - vN;
v1_neu = vT - vN

Das selber für das andere Schiff...
Falls du einen Reibungsverlust einbauen willst, einfach die vN mit einem Wert zwischen 0.f und 1.f skalieren...

f element aus [0, 1]
v1_neu = vT - vN * f
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

trash52

Treue Seele

  • »trash52« ist der Autor dieses Themas

Beiträge: 86

Wohnort: Dresden

  • Private Nachricht senden

6

14.01.2009, 23:06

Also vielen Dank an Euch.

:D :D

Manchmal denkt man in eine andere Richtung und sucht dort verzweifelt nach einer Lösung, da ist das schön, wenn man auf einen anderen Gedanken gebracht wird.

Nun läßt sich das Problem ja lösen.

Mann muss nur erst mal darauf kommen, dass man den Vektor, der die Flugrichtung bestimmt nur an einer Ebene spieglen muss.
Da denkt man manchmal viel zu kompliziert.

LG Trash52

Werbeanzeige