Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: Spiele-/Grafikprogrammierung ::  Kollisionserkennung zwischen Punktwolken und/oder Dreiecksnetzen     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
jonas93
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.02.2018
Beiträge: 6
Beitrag jonas93 Mitglied 16:29:46 06.03.2018   Titel:   Kollisionserkennung zwischen Punktwolken und/oder Dreiecksnetzen            Zitieren

Hallo zusammen,

bevor ich anfange zu programmieren wollte ich mich hier noch einmal nach anderen Meinungen oder Tipps umhören.

Ich möchte berechnen, ob und wo zwei Objekte kollieren. Die Objekte bewegen sich nicht und sind auch nicht deformierbar (statische Szene, Rechenzeit erstmal nicht relevant).

Objekt A: 3D-Punktwolke
Objekt B: Dreiecksmesh bzw. CAD-Datei

Lösungsansätze:
1)Konvertieren → zwei Punktwolken → mit Raumpartitionierungsverfahren ermitteln, welche Punkte aus Objekt A in der Nähe von Punkten aus Objekt B sind (dann braucht man auch die Oberflächennormalen der einzelnen Punkte um zu bestimmen, ob ein Punkt aus der anderen Wolke innerhalb oder außerhalb liegt..)

2)Konvertieren → zwei Dreiecksnetze → Kollisionserkennung über Bounding Volume Hierachies, dazu wollte ich das Rad nicht neu erfinden und gerne Bibliotheken wie die OpenDynamicsEngine oder Bullet o.Ä. nutzen

Was würdet ihr bevorzugen? Gibt es noch (einfache) Alternativen, auf die ich bisher nicht gekommen bin? Hat jemand Erfahrung mit den genannten Engines?

Gruß
Jonas
dot
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 6820
Beitrag dot Mitglied 18:16:59 06.03.2018   Titel:              Zitieren

Was genau definierst du dabei als Kollision der Punktwolke mit dem Mesh? Wenn ein Punkt genau auf einem Polygon des Mesh zu liegen kommt? Wenn ein Punkt innerhalb des vom Mesh eingeschlossenen Volumens liegt? Falls Zweiteres: Wie genau definierst du den "Punkt" in dem die beiden kollidieren?

_________________
one point of view will never reveal the entire scene.
jonas93
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.02.2018
Beiträge: 6
Beitrag jonas93 Mitglied 18:48:33 06.03.2018   Titel:              Zitieren

Genau, ich möchte dann berechnen, ob ein Punkt der Punktwolke im vom Mesh umschlossenen Volumen liegt. Punkte in der Nähe (innerhalb gewisser Toleranz) einer Dreiecksfläche würde ich dann als Berührpunkte definieren. Punkte die weiter ins Volumen eindringen sind die, die ich auf jeden Fall finden möchte.
dot
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 6820
Beitrag dot Mitglied 18:51:16 06.03.2018   Titel:              Zitieren

Klingt für mich so, als wäre es sinnvoll, das Mesh in einen BSP-Baum zu zerlegen. Mit dem solltest du deine Tests effizient durchführen können...

_________________
one point of view will never reveal the entire scene.
rapso
Moderator

Benutzerprofil
Anmeldungsdatum: 17.06.2002
Beiträge: 8807
Beitrag rapso Moderator 14:35:18 07.03.2018   Titel:              Zitieren

wenn du nur rausfinden willst,ob ein punkt innerhalb des volumens des anderen meshes liegen, musst du lediglich von dem punkt aus einen ray bis ausserhalb das meshes definieren und zaehlen wie oft es das mesch schneidet. ist die anzahl gerade -> ausserhalb, bei ungerade -> innerhalb.

_________________
follow me|
-Mod im Spiele-/Grafikprogrammierung
jonas93
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.02.2018
Beiträge: 6
Beitrag jonas93 Mitglied 11:19:04 17.04.2018   Titel:              Zitieren

Danke für eure Antworten und entschuldigt meine späte Rückmeldung. Ich habe nun zwei OBB-Bäume aus einer VTK-Klasse für die Meshes erstellt. Der Schnitttest zwischen den Blättern der beiden OBB-Bäume funktioniert auch bereits.

Für einen detaillierteren Schnitttest, also den zwischen Dreiecksflächen und nicht zwischen Hüllkörpern, brauche ich die Eckpunkte der Dreiecke und die Normalenvektoren.

Auf die x, y, z-Werte der Eckpunkte der Dreiecke in den kollidierenden Hüllkörpern kann ich mittlerweile zugreifen. Nur bei den Normalenvektoren komme ich ohne Hilfe nicht mehr weiter.

Ich lese eine STL mittels vtkSTLReader ein. In der STL sind die Eckpunkte und Normalen ja enthalen. Ich versuche nun aus einem vtkPolyData-Objekt die Normalen auszulesen:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    vtkSmartPointer<vtkPolyData> pdata = vtkSmartPointer<vtkPolyData>::New();
    pdata->DeepCopy(reader2->GetOutput());
    std::cout << "Looking for cell normals..." << std::endl;
 
    // Count points
    vtkIdType numPoints = pdata->GetNumberOfPoints();
    std::cout << "There are " << numPoints << " points." << std::endl;
 
    // Count triangles
    vtkIdType numPolys = pdata->GetNumberOfPolys();
    std::cout << "There are " << numPolys << " polys." << std::endl;
 
    // Double normals in an array
    vtkDoubleArray* normalDataDouble = vtkDoubleArray::SafeDownCast(pdata->GetCellData()->GetNormals());
 
    if (normalDataDouble)
    {
        int nc = normalDataDouble->GetNumberOfTuples();
        std::cout << "There are " << nc
            << " components in normalDataDouble" << std::endl;
    }


Die Anzahl der Punkte und Flächen wird korrekt ausgegeben, nur das Array mit den Normalen scheint leer zu sein.
Wie komme ich an die Normalenvektoren?
rapso
Moderator

Benutzerprofil
Anmeldungsdatum: 17.06.2002
Beiträge: 8807
Beitrag rapso Moderator 10:50:26 18.04.2018   Titel:              Zitieren

vielleicht ein bug im vtkSTLReader. setz ein breakpoint wo normalen gelesen werden sollen und pruefe was schiefgeht. (wie sollen wir herausfinden weshalb der reader deine datei ohne normalen ausgibt ;) )

_________________
follow me|
-Mod im Spiele-/Grafikprogrammierung
C++ Forum :: Spiele-/Grafikprogrammierung ::  Kollisionserkennung zwischen Punktwolken und/oder Dreiecksnetzen   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++.net 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 und www.c-plusplus.net 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.