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

Anonymous

unregistriert

11

23.03.2004, 17:57

Wait for my Games

Dies kommt vielleicht etwas spät, ich hatte jedoch vor kurzem nämlich auch das gleiche Problem. Durch nachdenken kommt man auf eine ziemlich einfache Lösung:
NeueRichtung=AlteRichtung-2*((AlteRichtung*Normale)*Normale).

Dave

Alter Hase

  • »Dave« ist der Autor dieses Themas

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

12

13.04.2004, 15:11

vieln dank. hab das mit deiner lösung mal ausprobiert. klappt von der richtung her wunderbar! allerdings komme ich durch nachdenken nicht so leicht drauf und kanns nicht nachvollziehen...

allerdings hab ich jetzt das problem, dass mein ball manchmal durch meinen schläger "hindurchrauscht". um dem vorzubeugen setze ich bei einer kollision die position des balles so, dass er genau die stelle tangiert, wo die kollision stattfindet.

Quellcode

1
m_vPosition = vKollPos + (vKollTriB * tbVector3(0.25f, 0.0f, 0.25f));

das klappt jedoch nicht so ganz. an der sich nicht bewegenden wand prallt er korrekt ab, allerdings gibt es einen "ruck" (der ball verändert sprunghaft seine position, jedoch nur ein kleines stück). bei den schlägern klappt es so auch fast. jedoch wenn der schläger sich schnell bewegt rauscht der ball ab und zu noch hindurch...

ich vermute, dass der "ruck" dadurch zustande kommt, dass der ball bei der kollision schon ein stück in die wand "eingedrungen" ist und es dadurch einen schnittkreis und keinen einzigen schnittpunklt gibt. die modelhitmodel funktion der tribase engine liefert jedoch nur einen schnittpunkt zurück. dies ist jedoch in dem fall nicht der korrekte.

ich habe mir dann überlegt, dass man nur wissen müsste, "wie weit der ball in die wand eingedrungen". dann müsste man sich doch die wahre kollsiionsposition ausrechnen können... da hörts bei mir aber auf.

hoffe mich hat jemand verstanden und kann mir helfen. bin am verzweifeln :help:


mfg
dave

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

13

13.04.2004, 15:58

Man könnte doch zu Beispiel zwischen der Position die der Ball vorher hatte und der die der Ball nachher hat eine Linie ziehen und mit tbLineHitsModel den Punkt bestimmen wo der Mittelpunkt des Balls (Die Linie) das Modell berührt. Dann gehst du auf dieser Linie noch um den Betrag des Radius des Balles von der Wand weg und hast so ungefähr den genauen Kollisionspunkt. (Es kann natürlich kleinere Fehler geben oder wenn man Pech hat berührt die Linie das Modell nicht mal aber der Ball schon, aber in den meisten Fällen sollte das stimmen).


Puh! Ich hoffe man versteht den Text. Hört sich beim zweiten mal durchlesen mächtig kompliziert an was ich da selbst geschrieben habe ;D
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.

Ghandi

Treue Seele

Beiträge: 218

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

14

14.04.2004, 11:19

Hab grad dasselbe Problem, aber die Formel "NeueRichtung=AlteRichtung-2*((AlteRichtung*Normale)*Normale)" von MCG funktioniert bei mir nich, bei mir entsteht der selbe Vektor wie vorher. Ich ging davon aus das "(Alte Richtung*Normale)" ein Skalarprodukt ist und daher "(AlteRichtung*Normale)*Normale" eine einfache Vektorverlängerung/-multiplikation. Das hatt nicht funktioniert.

Und wenn ich stattdessen die Punkte zwischen den Vektoren als Kreuzprodukte angesehen hab, hat es genausowenig funktion, der entstehende Vektor war genau derselbe wie der alte Vektor.
Alles ist gut so wie es ist, am besten ist jedoch das niemand dies akzeptiert.

error C2039: 'DerSinn' : ist kein Element von 'CLeben'

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

15

14.04.2004, 13:47

Ghandi, da ist bei Dir etwas übel schief gegangen.

Wenn NeueRichtung=AlteRichtung-2*((AlteRichtung*Normale)*Normale) gleich alte Richtung ist, d.h. 2*((AlteRichtung*Normale)*Normale) == 0, dann ist Normale oder AlteRichtung*Normale Null, was beides (bis auf einen einzigen Fall, nämlich AlteRichtung senkrecht zu Normale) Quatsch ist.

Dave

Alter Hase

  • »Dave« ist der Autor dieses Themas

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

16

14.04.2004, 14:09

@big_muff: so kompliziert isses gar nicht. hab dich ganz gut verstanden. big thx! die idee ist genial ;)

müsste ja schonmal für die meisten fälle zutreffen. wenn man bei dem frame wo der ball die wand berührt sich einfach die aktuelle posisiton merkt und dann den ball noch "manuell" ein bisschen "weiterfliegen" lässt, könnte man auch das problem umgehen, dass der ball die wand schneidet, aber nicht die verbindungslinie.
somit müsste man so gut wie immer die korrekte kollisionsstelle bekommen :-D

werde das mal gleich ausprobieren. thx @all

Dave

Alter Hase

  • »Dave« ist der Autor dieses Themas

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

17

14.04.2004, 14:09

weiß irgendjemand wie man auf die lösung von mcg kommt??

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

18

14.04.2004, 14:29

Auf MCG's Formel kommt man wie folgt:

Beim Stoss wirkt nur eine Kraft in Richtung der Normalen, d.h. die neue Geschwindigkeit ist die alte plus ein Vektor zunächst unbekannter Länge in Normalenrichtung.

Also: (n= Normale, muss normiert sein, x = unbekannter Skalar):

neu = alt + x * n (1)

Diese Gleichung besagt einfach, dass in jeder Richtung senkrecht zu n die Geschwindigkeit unverändert bleibt.

Um x zu bekommen, muss man die Richtung n betrachten. Da wir ohne Energieverlust rechnen, d.h. voll elastisch, ist die Komponente von alt bzw neu (abgesehen vom Vorzeichen) in Richtung n gleich gross:

n * neu = - n * alt

(1) einsetzen bringt
n * alt + x * n*n = - n * alt
d.h.
x * n*n = - 2* n * alt

Da n*n eins ist:

x = - 2* n * alt

Bitte macht Euch klar, welche Variablen Vektoren und was Skalare sind, sonst kann man die Gleichungen nicht wirklich verstehen.

Ghandi

Treue Seele

Beiträge: 218

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

19

14.04.2004, 16:02

Ok, bei mir funzts jetz auch, ich hatte vergessen die vektoren vorher zu normalisieren.
Alles ist gut so wie es ist, am besten ist jedoch das niemand dies akzeptiert.

error C2039: 'DerSinn' : ist kein Element von 'CLeben'

Werbeanzeige