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

Dave

Alter Hase

  • »Dave« ist der Autor dieses Themas

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

1

14.03.2004, 17:25

Abprallen

Hallo,

ich habe ein Problem bezüglich des Abprallens von Objekten.
Die Überprüfung ob eine Kollision vorliegt ist mit der TriBase-Engine ja relativ einfach.
Was mache ich jedoch wenn ein Kollision vorliegt?

Ich will einen Ball von einem Schläger abprallen lassen. Meine erste Idee war es mit den Vektoren der kollidierenden Dreiecken zu versuchen, jedoch klappt das nicht so wie ich mir das vorgestellt habe.

Wie realisiert man ein solches abprallen?
(Eigentlich wie in Braekout aus dem Buch, nur das der schläger eben nicht immer nur eine gerade fläche vorne hat und der Ball auch korrekt abprallen soll, wenn er von der Seite oder von hinten kommt)

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

2

14.03.2004, 18:24

Ich habe sowas noch nie selber gemacht aber ich schreibe jetzt mal wie ich das machen würde:

Der Ball fliegt ja mit einer bestimmtem Richtungsvektor auf den Schläger zu. Jetzt nimmst du den Normalenvektor des Dreiecks mit dem der Ball kollidiert ist. Und dann kannst du mit dem Einfallswinkel=Ausfallswinkel -Prinzip den Vektor des Ausfallwinkels berechnen.

Ich habe keine Ahnung ob das funktioniert und wie man das konkret umsetzten könnte aber ich denke es ist ein guter Ansatz.
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

3

14.03.2004, 20:11

Solltest die Objekte mit denen der Ball kollidiert aber aus sehr vielen Vertices zusammenbauen, sonst ist das sehr, sehr ungenau.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

14.03.2004, 21:26

Sonst gibts Ungenauigkeiten bei spezial Fällen (z.B. man trifft genau die Kante beim Quader). Dann kannste mit den Normalen keinen Ausfallwinkel mehr berechnen. Kann aber auch sein dass ich mich irre, mein Kopf funktioniert heute den ganzen Tag eh schon nicht wie gewollt, und die Funktion hab ich noch nie benutzt.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

14.03.2004, 22:35

Durch Verfeinerung des Meshes kannst Du das Problem nicht lösen. Es wird dadurch nur langsamer.
Wenn Du genau die Kante triffst, nimmst Du als Abprallnormalenvektor einfach den Mittelwert aus den Normalen der beiden Flächen, die zu der Kante gehören.

7

15.03.2004, 02:08

Beim berechnen der Normalenvektoren sollte man diese immer mit dessen Nachbarn verrechnen. Irgendwo hier hab ich das schon einmal erklärt.

Aber kurz ein Beispiel wie ich das mein:
Man habe einen normalen Würfel. Normalerweise steht ein Normalenvektor immer Senkrecht auf deim Dreieck. Sprich die Normalenvektoren stehen Senkrecht von den einzelnen Seiten des Würfsl ab.
Auf einer Ecke des Würfels liegen immer 6 Vertice aufeinander. Jede dieser Vertice hat einen Normalenvektor. Man Addiere diese auf, teile das ergebnis durch 6 und zum Schluss noch einmal Normalisieren. Sicherheishalber ;)
Nun stehen die Normalenvektoren in einem 45° Grad Winkel von jeder Seite ab.
Damit ist das ungenauigkeitsproblem teilweise gelöst. Diese Art der Berechnung der Normalenvektoren ist auch sehr Praktisch was die Lichtberechnung angeht. Es sorgt für weichere Kannten ;)

Der hier angesprochene Ansatz ist schon der richtig. Nur noch ein Schritt bevor man den Ausfallwinkel bestimmt. Der Ball schlägt ja nicht direkt auf einem Vertex auf, sondern irgendwo auf einem Dreieck. Man hat also drei Normalenvektoren. Je näher der Ball einem Normalenvektor ist, desto mehr einfluss muss er auf den entgültigen Normalenvektor haben. Du Interpolierst dann einfach zwischen den drei Normalenvekoteren und errechnest den Durchschnittswert, dessen normalisierter Vektor ist dein gegenstück zu deinem Richtungsvektor vom Ball.

Damit ist die Ungenauigkeit in etwa ausgebügelt und es wird gleich auch eine Runde fläche simuliert ;)
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Dave

Alter Hase

  • »Dave« ist der Autor dieses Themas

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

8

15.03.2004, 18:19

so ähnlich war mein ansatz auch :-D
jedoch habe ich probleme bei der umsetzung. wie bestimme ich denn den ausfall winkel? bzw. wie errechne ich dann mit dem ausfall winkel den neuen geschwindigkeitsvektor vom ball?

vielen dank an alle.

9

15.03.2004, 18:39

Du hast einen Geschwindigkeitsvektor? Der ist recht einfach zu berechnen.

Quellcode

1
2
3
4
vector3 normal;
float speed;

vector3 vSpeed = normal * speed;
Wenn der Ball bei jedem Aufprall langsamer werden soll (Was in wircklichkeit ja normal ist), musst du nur bei einer Feststellung den Faktor "speed" veringern. Z.B. immer um den Wert 0.005f. Dann wird der Ball irgendwann nicht mehr von einem Objekt abprallen und liegen bleiben. Wenn der Ball dann noch mit jeder bewegung langsamer werden soll ist das auch schnell gemacht.

1) Du brauchst einen Reibungsfaktor für den Ball selber (rfb)
2) Einen Reibungsfaktor für den Bode auf dem sich der Ball bewegt. (rff)

Quellcode

1
2
// Für jeden Frame
float speed = old_speed - ((rfb+rff) * old_speed);
Wenn beide Faktoren >= 0.5 sind hat man einen Sekundenkleber ;D
So jetzt wird der Ball mit jedem Frame langsamer werden. Denn jede Rollbewegung kostet schließlich Energie ;)
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Dave

Alter Hase

  • »Dave« ist der Autor dieses Themas

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

10

15.03.2004, 20:01

sry, missverständnis.

ich meinte eigentlich wie ich das korrekte abprallen realisiere.
mein ball besteht aus einem positions- und einem bewegungsvektor. wie komme ich dann mit dem normalvektor (von dem dreieck aus dass der ball trifft) auf den neuen bewegungsvektor? den positionsvektor würde ich so setzen, dass genau der fall der kollision vorliegt, also die position des dreiecks und dann um den radius des balles in richtung des normalvektors des dreiecks verschoben.

hoffe ich habe mich wenigstens halbwegs verständlich ausdrücken können :-D

Werbeanzeige