Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 17, 2025 14:12

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Bälle "auseinandersetzen"
BeitragVerfasst: Di Dez 27, 2005 18:21 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 16:51
Beiträge: 8
Hi,
und doch schon eine Frage *fg*

Ich habe ein Array einer Klasse, jede Instanz stellt einen Ball dar (mit Quadrics).
Wenn diese nun kollidieren, stoßen sie ab. Da sie sich dann z.T. aber überschneiden,
kommt es manchmal zu einer "Paarbildung", sprich sie verhaken sich.

Ich muss also die Positionen "auseinandersetzn" bei einer Kollsion, dass sie sich nicht überschneiden -
doch wie soll ich das bewerkstelligen?

Meine bisherigen Überlegungen:
-------------------------------------

Ich habe die neuen Bewegungsvektoren. Diese stehen in einem bestimmten
Verhältnis zueinander, dass ich mit einbeziehen muss für das Setzen der neuen Koord.

Die neuen Koord. müssen so sein, dass die Länge des Vektors Mittelpunkt1 - Mittelpunkt2 (sprich Distanz)
gleich der Summe beider Radien ist.

Ab dann hänge ich allerdings. Gegeben sind also Mittelpunktskoordinaten, Radien, Bewegungsvektoren (sowohl vor als auch nach der
Kollision).

Könnte mir da jemand weiterhelfen?

air


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 28, 2005 01:25 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Öhm...Kugel-Kugel-Kollision? Wenn du feststellst, dass sie sich schneiden, dann berechnest du den Abprallvektor und bewegst sie an diesem entlang. Öhm...versteh gerade nicht das Problem. :(

Aber mal was anderes. Wenn du vor hast auch noch komplexere Physik zu nutzen (vielleicht auch in Späteren Projekten) dann kann es nicht Schaden mal einen Blick auf NEWTON zu werfen. Das is ne PhysikEngine. Sascha Willems könnte dir da sicherlich was dazu erzählen, aber zuerst solltest du mal auf seiner HP die Beispiele angucken. (DelphiGL.de)

Dann hat auch noch jemand hier mal ne PhysikEngine gebaut. Ich glaub GEO. Muste mal bei den Projekten gucken. Eventuell kann der dir weiter helfen.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Dez 28, 2005 12:41 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 16:51
Beiträge: 8
Nein, Physik kommt keine mehr dazu ;)

Also es ist so:
Die Berechnung der neuen Vektoren funktioniert und die Bälle bewegen sich auch diesem Vektor entsprechend.
Aber sagen wir, vor der Kollision sind die Kugeln noch 2 Einheiten entfernt, sie bewegen sich aber mit einer Geschw. von jeweils 4 Einheiten pro Zeit aufeinander. Problem:
Bei der Kollisionserkennung sind sie bereits 8 Einheiten "ineinander", ist der neue Vektor nun aber nur 3 Vektoren pro Zeit für jeden, so sind sie bei der nächsten Kollisionserkennung immernoch ineinander -> Sie "paaren" sich zu einem Kugelpaar, das sich nicht mehr trennt.

Wenn sie also aufeinandergeprallt sind - die Kollision erkannt ist - muss ich die Positionen manuell einmal so setzen, dass sich die Kugeln nur berühren, nicht ineinander sind. Doch da muss ich ja ein bestimmtes Verhältnis des Vektors einhalten, da sie sonst an falscher Position gesetzt werden. Hoffe, dass es nun verständlich(er) ist, sonst mach ich noch ne Zeichnung ;)

air


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 13, 2006 03:03 
Offline
DGL Member

Registriert: Do Dez 01, 2005 12:55
Beiträge: 41
Hallo Airblader.
Dein problem ist ja relativ einfach zu lösen, mathematisch zumindestens.
Du hast einen Bewegungsvektor vor der kollision.
Dieser Bewegungsvektor gibt ja nicht nur an in welche Richtung die Kugeln sich bewegen, sondern auch, woher sie kommen.
Wenn du jetzt bei der Kollisionsabfrage feststellst, dass es eine kollision gibt, dann dann stellst du eine gleichung auf:
Du hast einen faktor x.
Dieser faktor gibt an, wie lang du den Bewegungsvektor beider kugeln nach hinten gehen musst um den kollisionsort zu erreichen.
X ist hier so etwas wie eine Zeitangabe.
Wenn die kugeln sich unterscheidlich schnell bewegen musst du natürlich x mit dem Geschwindigkeitsfaktor multiplizieren.
Jetzt muss die Position beider Kugeln um den Faktor X bewegt werden um den Abstand der beiden Kugeln auf die Summe ihrer beiden Radien zu bringen.
Den Abstand bekommst du über den Betrag der Differenz der beiden Ortsvektoren der Kugeln. aber das weißt du ja schon von der Kollisionsabfrage.
Unsere bisherige Gleichung Lautet also:

Radius_A + Radius_B = | (x*Geschw_a*(-Richtungsvek_a)+Ortsvektor_a) - (x*Geschw_b*(-Richtungsvek_b)+Ortsvektor_b) |

Ich hoffe mal, dass das richtig ist..
Jetzt noch nach x freistellen und das ganze dann auch ausführen, also die kugel a um -richtungsvektor mal geschwindigkeit mal x verschieben und das gleiche für kugel b.

Der Betrag ist hier nicht der Positive Wert einer zahl, sondern der Vektorbetrag.

Das Freistellen dürfte etwas komplizierter sein und das mach ich heute Nacht nicht mehr.
Aber das sollte dir schonmal einen Anfangspunkt liefern.

Ich weiß allerdings nicht ob das so sonderlich geschickt ist das so zu machen.
Vielleicht wäre es besser die Bewegung nur dann auszuführen, wenn bei der Ausführung der Bewegung keine Kollision zustandekommt und schon vorher darauf zu reagieren, dann hat man das Problem mit den verhakten Kugeln nicht.

Gruß
Jan


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 13, 2006 05:18 
Offline
DGL Member

Registriert: Do Dez 01, 2005 12:55
Beiträge: 41
Hab mich doch drangesetzt und das ganze mal ausgerechnet.
Nach 3 DinA4 Seiten voll Gleichungen hab ich dann das Ergenis gekriegt, allerdings weiß ich nicht ob das richtig ist, weil es alles manuell geschrieben ist. Ich werd das Ergebnis jetzt nicht hier hinschreiben, weil ich mir gedachte habe, dass man das anders viel einfacher Lösen kann.
Das ganze ist ein eher algorithmischer Ansatz über den Dreisatz.
Das Gleiche Prinzip wie eben, nur dass wir diesmal nicht direkt x berechnen sondern für x einfach 1 einsetzen und die kugeln bewegen und den abstand messen.
Jetzt setzen wir den Abstand mit dem gesuchten Abstand ins Verhältnis und wenden das Verhältnis auf x an.
Das sieht dann so aus:

x:=1;
berechne neuen standort der kugeln:

ortsvektor_a:=x*geschwindigkeit_a*richtungsvekor_a+ortsvektor_a;
ortsvektor_b:=x*geschwindigkeit_b*richtungsvekor_b+ortsvektor_b;

jetzt den Abstand zwischen a und b berechnen und dann:

abstand_neu / abstand_ziel= x_temp / x_ziel;

daraus ergibt sich :

xziel = xtemp / ( abstand_neu / abstandziel) = xtemp*abstand_ziel /abstand_neu

Dann das daraus resultierende xziel einfach in die gleichung zum setzen der neuen Ortsvektoren einsetzen und fertig aus.

Ich hoffe mal, dass das so über den Dreisatz machbar ist.. du kannst das ja mal ausprobieren.
Ich hab mir das halt alles grad aus den Fingern gesaugt.

Gruß
Jan


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 13, 2006 08:30 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 23, 2005 20:31
Beiträge: 212
Wohnort: Sachsen/ Vogtland
Hi,

ich hatte letztens hier im Forum einen Lösungsvorschlag zum Thema gelesen, den ich sehr clever fand.
Sobald Du bemerkst das Kugeln kollidieren, rechnest Du wie gehabt die Abprall-Vektoren aus und merkst Dir aber gleichzeitig dass sich die Kugel in einer Kollision befindet (Kollisionsflag). Beim nächsten Kollisionstest läßt Du die Kugeln weg, die sich bereits in einer Kollision befinden und setzt ggf. nur das "Kollisionsflag" zurück falls sich die Kugeln bereits soweit voneinander entfernt haben, dass sie sich nicht mehr überschneiden.
Ich hab die Methode nicht selber probiert, aber klingt eigentlich sinnvoll. Vielleicht hilft es Dir ja weiter.

Grüße, DNA

_________________
Heute code ich, morgen debug ich, und übermorgen caste ich die Königin auf int.
http://www.2ndmoon.de


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]