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

Aktuelle Zeit: Do Jul 03, 2025 06:31

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Mai 21, 2012 11:03 
Offline
DGL Member

Registriert: Fr Mai 11, 2012 13:25
Beiträge: 229
Programmiersprache: c++, c, JavaScript
Hi,
will Kollision von Polyedern, vorerst mal nur Quadern, in mein Programm erinbringen.

Sie sollen mit Kugeln, Ebenen und sich selbst kollidieren, während sie durch den Raum bewegt und rotiert werden.
Das rechenaufwendigste sollte letzeres sein.

Ich hab mir gedacht, dass man zunächst checkt, ob etwas innerhalb der Kugel um den Quader mit so einem Radius, dass er gerade alle Punkte des Quaders beinhaltet, liegt. Im Fall der Kollision mit einer Kugel, die Kugel selbst, in dem mit einem Quader, die Kugel um ihn. Das kann man ja dann so checken, indem man einfach schaut, ob die Kugelmittelpunkte weniger als r1+r2 voneinander entfernt sind.

Dann vielleicht auf allen Flächen Checkpoints erstellen und dann wieder das selbe Spiel, bloß eben mit mehreren Kugeln nun, wobei der Radius so gewählt wird, dass die ganze Fläche miteinbezogen wird. (Bei einer Kugel, kann am gleich den Vektor zum Kugelmittelpunkt erstellen.)
Dann müsste man den Kollisionspunkt haben (oder eben nicht) und kann dann die neuen Geschwindigkeiten und Rotationsgeschwindigkeiten ausrechnen (muss noch überlegen wie genau, hängt ja auch davon ab womit der Quader kollidiert, aber denke man braucht alle beteiligten (Dreh-)Impulse und Vektoren zu den Mittelpunkten der Objekte). Ganz genau muss und kann es eh nicht werden.

Meint ihr so eine Kollisionsabfrage ist effizient, oder kennt jemand was besseres?

Schönen Gruß

Vinz

_________________
"Pixel, ich bin dein Vater."
-Darf Shader


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mai 21, 2012 13:38 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Vielleicht kennst du die drei Tutorials schon, aber ich verlinke sie trotzdem mal:
Kollision 1
Kollision 2
Kollision 3

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mai 21, 2012 18:22 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 15, 2009 20:48
Beiträge: 111
Wohnort: Berlin
Programmiersprache: Delphi,JS,PHP,AS3,C#
ich benutze das seperatinx axis theorem ausm tutorial.falls dir, wie mir, manche grundsätze fehlen (skalarprodukt zb), musst du noch ein bischen googeln. ich bin vollends zufrieden kann die technik nur weiterempfehlen

_________________
thanks to the internet we have rule 34, wich states that if something exists, theres a pornographic version of it,


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mai 22, 2012 15:33 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Ok dann wolln wir mal:
1. Kugel-Polyeder) Hier musst du einfach nur den Abstand vom Mittelpunkt des Kreises zu allen Ebenen des Polyeders errechnen, und schauen ob dieser kleiner 0
oder Abstand - Radius kleiner 0 für alle zutrifft.
2. Ebene-Polygon) Hierfür werden zunächst für alle Punkte die Abstände zur Ebene benötigt. Nun gilt das mindestens ein Abstand größer Epsilon und mindest ein Abstand
kleiner -Epsilong sein muss. Will man die Schnittpunkte berechnen dann muss man folgendes tun:

Code:
  1.  
  2. for(i in numpoints) //eigentlich sollte man hier eher mit Epsilon arbeiten
  3. {
  4.     p1 = points[i];
  5.     p2 = points[(i+1)%numpoints]
  6.     if(abs(dist(p1)) == 0)
  7.     {
  8.        //falls lieber ein neues Polygon erstellen will muss man diesen Punkt behalten
  9.        continue;
  10.     }
  11.     if(dist(p1) > 0) //bzw < 0 falls man die andere Seite will
  12.     {
  13.       //auch hier ggf zum neuen Polygon hinzufügen
  14.     }
  15.     if((dist(p2) == dist(p1) || abs(dist(p2)) == 0)
  16.     {
  17.        continue;
  18.     }
  19.     dot = dist(p1) / ( dists(p1) - dists(p2) );
  20.     for(j in 3)
  21.     {
  22.        if(normal[j] == 1)
  23.        {
  24.           mid[j] == dist(0);
  25.        }
  26.        elseif(normal[j] == -1)
  27.        {
  28.          mid[j] == -dist(0);
  29.        }
  30.        else
  31.        {
  32.           mid[j] = p1[j] + dot * ( p2[j] - p1[j] );
  33.        }
  34.     }
  35.     //mid ist ein Schnittpunkt
  36. }
  37.  


3. Polyeder - Polyeder)
kuckens mal nach 2. :)
Ein Tipp: die Polygone eines Polyeders lassen sich auch durch 2. konstruieren (sogar im Shader) ;)

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mai 22, 2012 19:52 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 10, 2011 19:00
Beiträge: 43
Programmiersprache: FreePascal , C++
Mir haben die Tutorials von thecplusplusguy auf Youtube geholfen.
Die sind zwar in Englisch aber leicht verständlich.

http://www.youtube.com/user/thecplusplusguy?feature=watch


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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 | 14 Queries | GZIP : On ]