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

1

21.04.2007, 19:59

Ball von Ecke abprallen lassen

Hi alle zusammen,
ich sitze gerade an meinem ersten Spiel, ein kleiner Breakaout clone, um mich ein bisschen mit der Logik eines Spiels vertraut zu machen. Alles ganz billig und schlicht. Hauptsächlich aber um mich in Vektorrechnung einzuarbeiten.
Mein Spiel besteht derzeit aus einem Ball und einem rechteckigen Schläger.
Nun möchte ich die Kollisionserkennung für die äusseren Ecken des Schlägers machen und hänge dort total.

Dort wo die Ecke den Ball berührt leg ich eine Tangente an, indem ich einen "Radiusvektor" auf den Berührpunkt zeigen lasse. Die Tangente ist dann der Vektor, der senkrecht auf dem Radius steht.
Und genau ab hier hängts jetzt. Ich hab mir das so überlegt das ich die Richtung des Bewegungsvektors bezüglich der Tangente ermittle (also praktisch die Tangente als x-Achse ansehe) und dann den y-Wert der Bewegung umkehre und entsprechend ändere. Ich müsste dann noch alles wieder in globale Punkte umrechnen!?

Könnte das so gehen oder ist das quatsch??? und wenns geht, wie?
Ich glaube mir fehlts einfach noch am Verständniss für Vektoren :(

Firefly

Alter Hase

Beiträge: 484

Wohnort: Irgendwoundnirgendwo

  • Private Nachricht senden

2

21.04.2007, 20:36

nun du führst einfach einen Bewegungsvektor ein und kehrst die entsprechende Vektorkomponente um...

3

23.04.2007, 17:26

Ok hat sich erledigt!
Habs mit ner Formel gemacht die ich hier im Forum in einem anderen Beitrag gefunden hab gefunden habe. Und zwar:

Zitat von »"David Scherfgen"«

Dir = Richtung des einfallenden Strahls
Dir' = Richtung des reflektierten Strahls
N = Normalenvektor beim Schnittpunkt

Dir' = Dir - 2 * Dir·N * N

oder anders geschrieben:

Dir' = Dir - (2 * dot(Dir, N) * N)




Kann mir jemand die Formel anschaulich erklären? Hab nämlich stundenlang versucht das Problem selber zu lösen, (Durch Geometrie, Winkel und do weiter) und würde jetzt gerne kapieren worauf diese Formel beruht.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

23.04.2007, 17:32

Solltest dir vllt mal ein paar Grundlagen der linearen Algebra ansehen! :-O Bzw, wo hängts denn bei dir?
@D13_Dreinig

5

24.04.2007, 08:25

Na ich weis was ein Skalarprodukt ist, wie man den Winkel zwischen 2 Vektoren bestimmt, usw.

Aber ich weis nicht, wie man einen Vektor in einem bestimten Winkel zu einem anderen bestimmt! Das hab ich ja für mein Problem gebraucht. Deswgen hätte ich gern gewusst, was es mit dieser Formel auf sich hat. Hab sie nämlich nirgends gefunden, ausser hier im Forum.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

24.04.2007, 08:56

die formel tut folgendes:

man nehme die projektion von eingangsvektor auf den normalvektor n:

n * dot(n, Dir)

so. das nimmst du 2 mal und ziehst es dann vom eingangsvektor ab (oder ziehst den eingangsvektor davon ab, je nachdem in welche richtung der schaut).
alle vektoren müssen normalisiert sein damit das funzt (also n und Dir, das was rauskommt, also Dir', ist dann natürlich normalisiert).
zeichne dir auf was ich grad gesagt hab und du wirst es verstehen ;)

7

24.04.2007, 09:03

Ok, danke für die schnelle Antwort. :D
Werds mir gleich mal anschauen.

Ne Frage hätte ich da noch:
Wenn ich einen Vektor a gegeben habe und ich einen anderen Vektor b im Winkel von z.B 58 Grad zu a haben möchte, wie mache ich das?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

24.04.2007, 09:12

weil mir grad fad war hab ichs mal aufgezeichnet:


(Link)


der fette punkt ist das punktprodukt

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

24.04.2007, 09:26

hm, spontan fällt mir nur das ein (vorausgesetzt n und a sind normalisiert):

b = (n * cos(58°)) + nrm((a × n) × n) * sin(58°)

wobei × das kreuzprodukt ist und nrm normalisieren bedeutet.

wenn du z.b. den sin des winkels zwischen n und a (sagen wir sin(alpha)) kennst, kannst du das normalisieren durch eine division ersetzen:

b = (n * cos(58°)) + nrm((a × n) × n) * sin(58°) / sin(alpha)

ich könnt mir vorstellen, dass ein gescheiter mathematiker sich was einfacheres ausgedacht hat...

was genau willst du damit machen. wenn es z.b. um brechung geht, dann gibt es da durchaus einfacheres (da das verhältnis der zwei sin bekannt ist etc.)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

24.04.2007, 09:52

Hm, einfach Vektor n auf der Ebene welche von a und n aufgespannt wird um 58° rotieren und auf die Länge von Vektor a skalieren! :-)
@D13_Dreinig

Werbeanzeige