Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: Allgemeines zum Magazin ::  [Suchen Autor für:] Kollisionserkennung bei 3D Objekten  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
MisterX
Unregistrierter




Beitrag MisterX Unregistrierter 00:58:25 13.08.2006   Titel:   [Suchen Autor für:] Kollisionserkennung bei 3D Objekten            Zitieren

Schön währe ein Artikel zur Kollisionserkennung. Also so ne classe die Jedes mit Jedem Testen kann.
Ne Erklährung der dahinterstehenden Ideen währe auch schön.

Punkt
Kugel
Linie
Strahl
Würfel
Quader
Zylinder
Ebene
Dreieck
Vielecke
Kegel ?
Pyramiede ?
usw.


Schließlich bracht man sowas häufiger, wenn man sich mit 3D Grafik beschäftigt.
Und ich habe im Netzt noch keine WIRKLICH brauchbare Sammlung gesehen
(Nur hier mal das eine und dort das andere)

edit by GPC: Vernünftigen Titel gesetzt und 'n Autorengesuch draus gemacht


Zuletzt bearbeitet von estartu am 14:26:10 14.01.2008, insgesamt 3-mal bearbeitet
Reyx
Autor

Benutzerprofil
Anmeldungsdatum: 14.08.2004
Beiträge: 1819
Beitrag Reyx Autor 10:06:37 13.08.2006   Titel:              Zitieren

Das Problem ist, dass das vermutlich entweder ein sehr theoretischer Artikel werden würde, oder aber sich auf eine bestimmte Bibliothek konzentrieren würde (OGL, DX, whatever).

2D ist ja kein Problem, aber bei 3D ... Allerdigns wird einem dass von einer Physik-Engine i.d.R. abgenommen.

Interessant fände ich es aber schon ...


Zuletzt bearbeitet von Reyx am 10:06:53 13.08.2006, insgesamt 1-mal bearbeitet
MisterX
Unregistrierter




Beitrag MisterX Unregistrierter 12:37:13 13.08.2006   Titel:              Zitieren

Reyx schrieb:
Das Problem ist, dass das vermutlich entweder ein sehr theoretischer Artikel werden würde, oder aber sich auf eine bestimmte Bibliothek konzentrieren würde (OGL, DX, whatever).

2D ist ja kein Problem, aber bei 3D ... Allerdigns wird einem dass von einer Physik-Engine i.d.R. abgenommen.

Interessant fände ich es aber schon ...


Warum ne Bibliothek?
3 Vectoren bestimmen nen Dreieck
2 Dreiecke kollidieren (Beispielcode) usw.
Da braucht man keine Bibliotheken. Denn so ne Vectorclasse währe schnell gemacht. Aber hinter den Kollisionen steckt mehr Mathematik ...

C/C++ Code:
Allerdigns wird einem dass von einer Physik-Engine i.d.R. abgenommen.
C/C++ Code:
Allerdigns wird einem dass von einer Physik-Engine i.d.R. abgenommen.
C/C++ Code:
Allerdigns wird einem dass von einer Physik-Engine i.d.R. abgenommen.


Nur selber machen ist lustig :)
Andreas XXL
Mitglied

Benutzerprofil
Anmeldungsdatum: 12.01.2004
Beiträge: 913
Beitrag Andreas XXL Mitglied 11:44:20 14.08.2006   Titel:              Zitieren

Das würde mich auch Interessieren. Die Vectorclasse würde ich jka noch selber zusammenfrickeln können und auch die einfachen Kollisionen wie z.B.
Kugel vs Kugel
Ebene vs Gerade

Aber die komplizierteren währen schon interessant.
Vor allem wenn man das Rad nicht immer neu erfinden will, sondern eine Klasse mit gut durchdachtem code hätte mit Kommentaren, die ETWAS die Idee dahinter beschreiben würde.
Pellaeon
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.05.2005
Beiträge: 2539
Beitrag Pellaeon Mitglied 22:22:13 05.10.2006   Titel:              Zitieren

Was heißt Idee dahinter?
Um die Objekte zu erkennen, wenn du eine Basisklasse hast benötigst du Double-Dispatching. Gibts verschiedene Möglichkeiten zu(siehe z.B. Effektiv C++ oder Modernes C++ Design).
Der Rest ist dann reine Mathematik. Da hilft dann u.U. der alte Mathehefter

http://www.scherfgen-software.net/ Hier gibts ein paar Tuts zu Kollisionen. Aber Vorsicht bei Dreieck-Dreieck, da ist ne Stelle buggy^^

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Zuletzt bearbeitet von Pellaeon am 22:22:57 05.10.2006, insgesamt 1-mal bearbeitet
mosta
Autor

Benutzerprofil
Anmeldungsdatum: 12.11.2002
Beiträge: 972
Beitrag mosta Autor 13:24:10 10.11.2006   Titel:   Re: Stellenangebot Autor für: Kollisionserkennung bei 3D Objekten            Zitieren

MisterX schrieb:
Schön währe ein Artikel zur Kollisionserkennung. Also so ne classe die Jedes mit Jedem Testen kann.
Ne Erklährung der dahinterstehenden Ideen währe auch schön.

Punkt
Kugel
Linie
Strahl
Würfel
Quader
Zylinder
Ebene
Dreieck
Vielecke
Kegel ?
Pyramiede ?
usw.


Schließlich bracht man sowas häufiger, wenn man sich mit 3D Grafik beschäftigt.
Und ich habe im Netzt noch keine WIRKLICH brauchbare Sammlung gesehen
(Nur hier mal das eine und dort das andere)

edit by GPC: Vernünftigen Titel gesetzt und 'n Autorengesuch draus gemacht


die findest du hier http://www.geometrictools.com/

deswegen wär ein Artikel überflüssig, meiner Ansicht nach.

_________________
“Computers are like bikinis. They save people a lot of guesswork.” (Sam Ewing)

The men who program in C++ are Real Men. The women who program in C++ are Real Men too
Badestrand
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.08.2006
Beiträge: 4342
Beitrag Badestrand Mitglied 20:26:17 27.11.2006   Titel:              Zitieren

..


Zuletzt bearbeitet von Badestrand am 22:32:21 02.03.2008, insgesamt 1-mal bearbeitet
Badestrand
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.08.2006
Beiträge: 4342
Beitrag Badestrand Mitglied 20:40:55 27.11.2006   Titel:              Zitieren

...


Zuletzt bearbeitet von Badestrand am 02:56:10 14.09.2008, insgesamt 1-mal bearbeitet
joomoo
Autor

Benutzerprofil
Anmeldungsdatum: 31.07.2004
Beiträge: 1520
Beitrag joomoo Autor 20:15:45 09.01.2007   Titel:              Zitieren

Andreas XXL schrieb:
Ebene vs Gerade

Da ich daran komplett scheitere, wollte ich mal fragen wie du das machst?
Ben04
Autor

Benutzerprofil
Anmeldungsdatum: 10.10.2004
Beiträge: 1635
Beitrag Ben04 Autor 23:29:21 09.01.2007   Titel:              Zitieren

Würde mich auch interessieren. Vor allem wie man das gut realisiert. Ich würde da mit Doubledispatching vorgehen und dann alle Kombinationen durchgehen. Geht wahrscheinlich mit einer gescheiten Klassenhierarchie aber besser und man muss nicht alle Kombinationen durchnehmen.

Vielleicht auch einfach statisches Funktionsüberladen einsetzen. Eine Physikengine müsste es wahrscheinlich anders machen aber für diesen Artkiel müsste das andere doch völlig reichen. In etwa so
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
typedef double coord;
typedef double length;

struct Vector3D{
  coord x,y,z;
  Vector3D(){}
  Vector3D(coord x, coord y, coord z):
    x(x), y(y), z(z){}
};

// Vielleicht ganz ohne Vektorklasse un nur Point + Translation?
// Würde dennen die nicht so gewandert in den Mathebegriffen sind wahrscheinlich
// viel helfen.

typedef Vector3D Point;
typedef Vector3D Translation;

double sqr(double n){
  return n*n;
}

length sqr_dist(const Point&a, const Point&b){
  return sqr(a.x - b.x) + sqr(a.y - b.y) + sqr(a.z - b.z);
}

length dist(const Point&a, const Point&b){
  return std::sqrt(sqr_dist(a, b));
}

struct Sphere{
  Point center;
  length radius;
};

bool is_collision(const Sphere&a, const Sphere&b){
  return dist(a.center, b.center) <= a.radius + b.radius;
  // oder besser
  // return sqr_dist(a.center, b.center) <= sqr(a.radius + b.radius);

}

bool is_collision(const Sphere&a, const Point&b){
  return dist(a.center, b) <= a.radius;
}

// Kommt immer als letztes dran
template<class Shape1, class Shape2>
bool is_collision(const Shape1&s1, const Shape2&s2){
  return is_collision(s2, s1);
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
typedef double coord;
typedef double length;

struct Vector3D{
coord x,y,z;
Vector3D(){}
Vector3D(coord x, coord y, coord z):
x(x), y(y), z(z){}
};

// Vielleicht ganz ohne Vektorklasse un nur Point + Translation?
// Würde dennen die nicht so gewandert in den Mathebegriffen sind wahrscheinlich
// viel helfen.

typedef Vector3D Point;
typedef Vector3D Translation;

double sqr(double n){
return n*n;
}

length sqr_dist(const Point&a, const Point&b){
return sqr(a.x - b.x) + sqr(a.y - b.y) + sqr(a.z - b.z);
}

length dist(const Point&a, const Point&b){
return std::sqrt(sqr_dist(a, b));
}

struct Sphere{
Point center;
length radius;
};

bool is_collision(const Sphere&a, const Sphere&b){
return dist(a.center, b.center) <= a.radius + b.radius;
// oder besser
// return sqr_dist(a.center, b.center) <= sqr(a.radius + b.radius);

}

bool is_collision(const Sphere&a, const Point&b){
return dist(a.center, b) <= a.radius;
}

// Kommt immer als letztes dran
template<class Shape1, class Shape2>
bool is_collision(const Shape1&s1, const Shape2&s2){
return is_collision(s2, s1);
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
typedef double coord;
typedef double length;

struct Vector3D{
  coord x,y,z;
  Vector3D(){}
  Vector3D(coord x, coord y, coord z):
    x(x), y(y), z(z){}
};

// Vielleicht ganz ohne Vektorklasse un nur Point + Translation?
// Würde dennen die nicht so gewandert in den Mathebegriffen sind wahrscheinlich
// viel helfen.

typedef Vector3D Point;
typedef Vector3D Translation;

double sqr(double n){
  return n*n;
}

length sqr_dist(const Point&a, const Point&b){
  return sqr(a.x - b.x) + sqr(a.y - b.y) + sqr(a.z - b.z);
}

length dist(const Point&a, const Point&b){
  return std::sqrt(sqr_dist(a, b));
}

struct Sphere{
  Point center;
  length radius;
};

bool is_collision(const Sphere&a, const Sphere&b){
  return dist(a.center, b.center) <= a.radius + b.radius;
  // oder besser
  // return sqr_dist(a.center, b.center) <= sqr(a.radius + b.radius);

}

bool is_collision(const Sphere&a, const Point&b){
  return dist(a.center, b) <= a.radius;
}

// Kommt immer als letztes dran
template<class Shape1, class Shape2>
bool is_collision(const Shape1&s1, const Shape2&s2){
  return is_collision(s2, s1);
}


Die Mathematik ist mir größtenteils bekannt allerdings ist bestimmt interessant für die die sie noch nicht kennen. Grundwissen in der Vektor-Mathematik müsste doch aber vorhanden sein oder?

Man wird auch ein Paar gute 3D Graphiken brauchen. Kennt da jemand ein gutes Programm?

Zitat:

Da ich daran komplett scheitere, wollte ich mal fragen wie du das machst?

Entweder Ebene und Gerade sind parallel oder sie schneiden sich. Wie man das am besten testet hängt davon ab wie du deine Gerade und deine Ebene Strukturen definiert hast.


Zuletzt bearbeitet von Ben04 am 23:30:09 09.01.2007, insgesamt 1-mal bearbeitet
C/C++ Forum :: Allgemeines zum Magazin ::  [Suchen Autor für:] Kollisionserkennung bei 3D Objekten  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.