Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Collision Detection-Bounding Sphere

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
12.07.2008, 19:32 Uhr
WiredCoder



Hey,
ich hab ein Problem bei meiner Collision Detection. Und zwar habe ich gerade
eine Kollisionsabfrage geschrieben, welche dazu dient um abzufrage, ob die
Kugel_Ich() mit der Kugel_1() kollidiert ist. Dazu hab ich gleich mal ne Formel
aufgestellt. Nämlich:

C++:
bool collision(float distanz)
{

distanz= sqrt( (x_ich-x_2)*(x_ich-x_2) + (y_ich-y_2)*(y_ich-y_2) + (z_ichz_2)*(z_ich-z_2) );

        if(distanz <= radius_ich+radius_1)
        {
            MessageBox(NULL,"Kollision!","Message",MB_OK);
        }
        return false;
}


Jetzt frage ich mich, was ich falsch gemacht habe. Komischerweise konnte ich
nicht mal die zu mit Wurzelziehenden Werte _² zu rechnen. Das heisst, so gab
er mir immer aus, das er die float-Werte nicht berechnen konnte:

C++:
    distanz= sqrt( ((x_ich-x_2)^2) + ((y_ich-y_2)^2) +  ((z_ich-z_2)^2) );


Nun, wenn die beiden Kugeln nun "kollidieren", passiert nichts . Wäre supi wenn
mir vielleicht einer helfen könnte und vielel lieben Dank im Voraus! Und achja, falls
ihr euch ein Bild davon machen wollt, hier ist mal ein Screenshot mit den Bounding
Spheres:
www.online-programmierung.com/Collision_Detection_Projekt_2.JPG
--
Ich würde mich sehr über einen Besuch auf meiner Website freuen: www.Online-Programmierung.com

Dieser Post wurde am 12.07.2008 um 19:33 Uhr von WiredCoder editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.07.2008, 22:36 Uhr
0xdeadbeef
Gott
(Operator)


Dass der untere Code nicht funktioniert, wird daran liegen, dass ^ die binäre XOR-Operation ist. Wenn du potenzieren willst, im Header <cmath> ist eine Funktion std::pow.

Was den oberen Code angeht, so sind sowohl Potenzierung als auch sqrt vergleichsweise langsame Operationen, dementsprechend würde ich eher die Quadrate vergleichen:

C++:
double dx = x_ich - x_2,
       dy = y_ich - y_2,
       dz = z_ich - z_2,
       rad_sum = radius_ich + radius_1;

distanz = dx * dx + dy * dy + dz * dz;
if(distanz <= rad_sum * rad_sum) {
  // Kollision
}


Wie dem auch sei, der eigentliche Fehler ist im oberen Code nicht direkt ersichtlich, obwohl es mir äußerst seltsam vorkommt, dass du in eine by-value übergebene Variable schreibst. Ich hätte mehr sowas wie

C++:
bool sphere::collision(sphere const &s) {
  double dx = x_ + s.x(),
         dy = y_ + s.y(),
         dz = z_ + s.z(),
         r_sum = radius_ + s.radius();

  double distanz = dx * dx + dy * dy + dz * dz;

  return distanz <= rad_sum * rad_sum;
}


erwartet. Möglicherweise auch ein

C++:
bool collision(sphere const &s1, sphere const &s2);


in einer physics-Klasse oder so; sonst ist immer ein bisschen die Frage, welche Kugel jetzt mit welcher kollidiert, und warum nicht andersherum.

Oh, und du solltest deine Klassenmethoden wirklich von der Deklaration abgetrennt implementieren, in einer eigenen Übersetzungseinheit.

Nachtrag:

Da dieses Problem nicht OpenGL-spezifisch ist, verschiebe ich den Thread mal ins ANSI-Forum.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 12.07.2008 um 22:37 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.07.2008, 23:08 Uhr
WiredCoder



Im übrigen hab ich gerade gemerkt das es mit der z-Überprfung mal so garnicht funzen kann. Wie frage ich am besten die Distanz zu Z ab? Hab da absolut keine Ahnung wie ich das angehen soll. Vektorberechnung?

Zitat:
in einer physics-Klasse oder so; sonst ist immer ein bisschen die Frage, welche Kugel jetzt mit welcher kollidiert

x_ich=Kugel die immer motrotiert wird-Praktisch Kugel 1
x_1=Kugel die fest irgendwo in einem Objekt sitzt-Also dann Kugel 2

Wäre so unglaublich dankbar wenn mir einer helfen könnte, weiss nicht wie ich die z-distanz abfragen soll.
Vielen lieben Dank im Voraus!
--
Ich würde mich sehr über einen Besuch auf meiner Website freuen: www.Online-Programmierung.com
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.07.2008, 23:29 Uhr
0xdeadbeef
Gott
(Operator)


Sofern x, y, z den Mittelpunkt der Kugel beschreiben, ist die grundsätzliche Rechnung schon in Ordnung. Was meinst du mit "Distanz zu Z?" Z ist eine Koordinate, kein Punkt, Distanz ergibt in dem Zusammenhang irgendwie nur wenig Sinn.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.07.2008, 23:43 Uhr
WiredCoder



Ja ich weiss was du meinst, aber ein Kollege meinte das es komisch aussehe mit der Z-Überprüfung. Mit der Distanz meine ich die Distanz zwischen z_ich und z_1, wenn du verstehst was ich meine. Trotzdem bekomme ich keine Meldung wenn die Kollision erfolgt ist. Komischerweise, kann ich mir auch nicht erklären.

Vielen lieben Dank im Voraus!
--
Ich würde mich sehr über einen Besuch auf meiner Website freuen: www.Online-Programmierung.com
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.07.2008, 15:55 Uhr
WiredCoder



So, ich hab's jetzt nochmal probiert. Ein anderer Kollege meinte jetzt, dass es sogar nur so gehen müsse:

C++:
distanz=sqrt((x_ich-x_2) + (y_ich-y_2) + (z_ich-z_2));


Leider bin ich jetzt etwas irritiert
--
Ich würde mich sehr über einen Besuch auf meiner Website freuen: www.Online-Programmierung.com
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
13.07.2008, 19:14 Uhr
Lensflare



die Distanz zwischen (x_ich, y_ich, z_ich) und (x_2, y_2, z_2) ist es sicher nicht.
Wie 0xdeadbeef bereits gesagt hat, die Rechnung von oben stimmt so.

Du sagtest, dass es um die "Kugel_1" und "Kugel_Ich" geht. Im Code verwendest du radius_1, aber die Koordinaten x_2, y_2 und z_2.
Also einmal mit Index 1 und dann mit 2.
Stimmt das so? Vielleicht liegt da der Fehler.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
13.07.2008, 19:27 Uhr
WiredCoder



So, nein das stimmt so, aus irgendeine, Grund konnte ich nicht radius_2 nehmen. Aber ich habs schon hinbekommen. Funktioniert soweit auch ganz gut, nur das da irgemdwas nicht stimmt, denn die Kollision erfolgt erst wenn ich an der linken Kugelhälfte her fahre. Bischen komisch ist das schon. Allerdings hab ich mir grad ziemlich übel den Finger verbrannt, wenns besser ist werde ich schauen ob es bei den anderen Objekten auch so ist.
Danke schön für alles und im Voraus!
--
Ich würde mich sehr über einen Besuch auf meiner Website freuen: www.Online-Programmierung.com
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
14.07.2008, 13:30 Uhr
WiredCoder



Tut mir leid wegen dem Doppelpost, aber hab es jetzt perfekt hinbekommen. Mein Fehler war, dass ich die Radien der beiden Kugeln addiert statt multipliziert habe. Welches auch der Grund war, warum der Abstand zur Kollision 2xRadien entfernt war. Naja, danke an alle die mir geholfen haben, hab es jetzt so gelöst:

C++:
BOOL collision()
{
    float distanz[5];
    char buffer[9999]="Distanz: ";
    const char msgcol[5][100]={"Kollision-Kugel_Ich()->Kugel_1()","Kollision-Kugel_Ich()->Kugel_2()","Kollision-Kugel_Ich()->Kugel_3()","Kollision-Kugel_Ich()->Kugel_4()","Kollision-Kugel_Ich()->Kugel_5()"};

    distanz[0] = sqrt((x_ich-x_2)*(x_ich-x_2)+(y_ich-y_2)*(y_ich-y_2)+(z_ich-z_2)*(z_ich-z_2));

    sprintf(buffer,"%.2f",distanz);

        if(distanz[0] <= radius_ich+radius_1)
        {
            MessageBox(NULL,msgcol[0],buffer,MB_OK);
            return 0;
        }

        return false;
}



--
Ich würde mich sehr über einen Besuch auf meiner Website freuen: www.Online-Programmierung.com
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: