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

Aktuelle Zeit: Di Jul 08, 2025 03:23

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Dez 15, 2006 22:22 
Offline
DGL Member

Registriert: Do Jun 22, 2006 19:13
Beiträge: 52
Wohnort: Lübeck
Hallo,

ich probiere die ganze zeit herum den Schnittpunkt(Kollisionspunkt) zwischen zwei Spheren zu berechnen.

Mal ein Beispiel.

Kugel1:
x = 10
y = 20
z = 30

Kugel2:
x = 30
y = 20
z = 30

Die Kugel haben jeweils einen Radius von 10.
Somit ist der "Schnittvector = x=20, y=20, z=30.

Hier ist das ja nun ein super billiges Beispiel. Nun meine Frage:

Wie errechne ich nach einer erfolgreichen Kollisionserkennung den Kollisionspunkt(Schnittpunkt). Die Kugel können
in der Realität natürlich in jeder Achse unterschiedliche Werte haben.

Ich such den Punkt in der Mitte.

Es giebt doch mit Sicherheit eine oder mehere Formeln dafür.

Hat jemand eine Idee ???


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 15, 2006 22:33 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
also eigentlich haben zwei kugeln, wenn sie sich denn schneiden schnell unendlich viele schnittpunkte. auch der punkt in der mitte ist dann nicht mehr klar, denn das was ich mir darunter vorstelle, muss nicht auf den Oberflächen der Kugeln liegen. Du musst dich also klarer ausdrücken. Ob sich zwei Kugeln schneiden kann man jedenfalls einfach dadurch prüfen, ob die entfernung der Mittelpunkte kleinergleich der summe der radien ist.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 15, 2006 23:03 
Offline
DGL Member

Registriert: Do Jun 22, 2006 19:13
Beiträge: 52
Wohnort: Lübeck
Ach nee,

ich habe doch beschrieben, dass ich das schon hinter mit habe. Eine Kollision wurde bereits erfolgreich erkannt.

Ich möchte jetzt wissen an welchen punkt sich die beiden Kugeln berühren zum Zeitpunkt der Kollision.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 15, 2006 23:12 
Offline
DGL Member

Registriert: Do Jun 22, 2006 19:13
Beiträge: 52
Wohnort: Lübeck
Etwas konkreter:

Das ist meine Kollisionserkennung:

Code:
  1.  
  2. function TBallListe.Collision(aBall1, aBall2: TBall): Boolean;
  3. var
  4.   Vector1: TPosition;
  5.   Vector2: TPosition;
  6.   VectorErg: TPosition;
  7.   Laenge1: GLFloat;
  8.   Laenge2: GLFloat;
  9. begin
  10.   Vector1 := aBall1.Position;
  11.   Vector2 := aBall2.Position;
  12.  
  13.   VectorErg[0] := Vector1[0] - Vector2[0];
  14.   VectorErg[1] := Vector1[1] - Vector2[1];
  15.   VectorErg[2] := Vector1[2] - Vector2[2];
  16.  
  17.   Laenge1 := Power(VectorErg[0], 2) + Power(VectorErg[1], 2) +
  18.     Power(VectorErg[2], 2);
  19.  
  20.   Laenge2 :=  Power(aBall1.Radius + aBall2.Radius, 2);
  21.  
  22.   Result := (Laenge1 <= Laenge2);
  23. end;
  24.  



Es muss doch möglich sein zu dem Zeitpunkt wo Result True ist den Vector berechnen zu können an dem sich die beiden Kugeln berühren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 15, 2006 23:12 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Den einen Punkt wird es wohl kaum geben, da sie sich wie Nico schon gesagt hat, an unendlich vielen schneiden. Wenn du dir zwei Kugeln vorstellst, die sich schneiden, bildet sich ja quasi ein "Schnittkreis" aus lauter Schnittpunkten, vielleicht kennst du das von den GPS-Erklärungs-Visualisierungen. Zum Verständnis hilft vielleicht das.
So spontan hätte ich ohne Vorkenntnisse die Idee,
1. den Mittelpunkt der Strecke zwischen den Spherenmittelpunkten berechnen
2. orthogonal dadrauf einen Kreis mit Radius über Pythagoras: (halbe Strecke)² + Radius² = Spherenradius²
Klingt vielleicht bisschen seltsam, aber da kann mich wahrscheinlich jemand mit mehr Fachkenntnis noch korrigieren. Vielleicht bringt auch Google mit "Intersecting spheres" noch ne Erleuchtung.

Edit: Grade fällt mir auf, es gibt die Möglichkeit, dass es einen einzigen Kollisionspunkt gibt, wenn der Abstand der Sphärenmittelpunkte genau der Summe der Sphärenradien entspricht. Dann ist der Mittelpunkt zB. bei gleichgroßen Radien der Mittelpunkt der Strecke zwischen den Sphärenmittelpunkten.

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 16, 2006 11:27 
Offline
DGL Member

Registriert: Do Jun 22, 2006 19:13
Beiträge: 52
Wohnort: Lübeck
Vielen Dank für eure Antworten !!!

Ich habe genau das gefunden was ich habel wollte:

Diese Funktion giebt mir im Fall einer Kollision den genauen Kollisionspunkt:

Code:
  1.  
  2. function ClosestPointOnSphereFromPoint(const Sphere:TSphere;
  3.   const Point:TPoint3D):TPoint3D;
  4. var
  5.   Ratio : TFloat;
  6.   dx    : TFloat;
  7.   dy    : TFloat;
  8.   dz    : TFloat;
  9. begin
  10.   dx       := Point.x - Sphere.x;
  11.   dy       := Point.y - Sphere.y;
  12.   dz       := Point.z - Sphere.z;
  13.   Ratio    := Sphere.Radius / sqrt(dx * dx + dy * dy + dz * dz);
  14.   Result.x := Sphere.x + Ratio * dx;
  15.   Result.y := Sphere.y + Ratio * dy;
  16.   Result.z := Sphere.z + Ratio * dz;
  17. end;
  18.  


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 1 Gast


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.010s | 14 Queries | GZIP : On ]