none
Mesh generieren für Viewport3D RRS feed

  • Frage

  • Hallo Zusammen!

    Ich schlag mich jetzt schon ein paar Tage mit dem generieren eines Meshes zur Ausgabe in einen Viewport3D rum;

    Vieleicht kann mir jemand helfen, meinen "Knopf" zu lösen:

    Also - ich lese Tiefendaten von einer Kinect ein und bilde aus jedem Bildpunkt einen Point3D(x, y, z);

    Diese Points lese ich in eine nested List vom Typ Point3D ein. Soweit - so gut.

    Nun ist mein Problem, dass ich nicht in jeder Subliste gleich viele Points habe, so kann sublist[0] 12 Point3D haben,

    sublist[1] aber z.B. 25.

    Das Zuweisen der Punkte zum Mesh ist kein Problem mit my_mesh.Positions.Add(Point3D);

    Der Haken ist aber nun, dass ich zum Generieren des Meshes diese einzelnen Vertices ccw miteinander verbinden muss mit my_mesh.TriangleIndices.Add(pointPos).

    Meine Frage nun: Ist meine Vorgehensweise überhaupr die Richtige? Ich bin relativ neu in der 3D Programmierung.

    Wenn ja: Wie soll der Algorithmus dafür aussehen?

    Wenn nein: Welche Alternativen bieten sich?

    Ich habe schon versucht, die Punktereihenfolge bei der Übergabe ans Mesh zu ändern, um die Indices aufsteigend anordnen zu können. Doch das

    Problem beliebt immer das selbe. Unter Umständen habe ich auch die falsche Struktur für die Haltung der Daten gewählt...?

    Fragen über Fragen...

    Wie gesagt, bin relativ neu in 3D Programmierung und für jeden Hinweis dankbar.

    Grüsse

    Peter 

     

    Mittwoch, 7. März 2012 13:26

Alle Antworten

  • Hallo Peter,

    ja, so wird eine MeshGeometry3D grundsätzlich erstellt, der Haken - wie Du es nennst - ist allerdings, dass Du wissen musst wie Deine Geometry aufgebaut ist. In der WPf wird die Oberfläche eines Dreiecks entgegen dem Uhrzeigersinn aufgebaut.

    Bsp: Wenn also ein Würfel im Ursprung mit der Kantenlänge 1 erzeugt wird, dann haben wir hier z.Bsp. die Punkte

    1. 0,0,0
    2. 1,0,0
    3. 0,1,0
    4. 1,0,1
    5. 0,1,-1
    6. 1,1,-1
    7. 1,0,-1
    8. 0,0,-1

    bitte beachten, die Reihenfolge ist beliebig, jeder nach seinem Geschmack und ich baue gerne in den Raum, daher z=-1! Wobei die Punkte 1 bis 4 die Front bilden, die weiter als Beispiel dienen soll.

    Zum Aufbau der Front baue ich jetzt zwei Dreiecke und die kann ich jetzt aus meinen Punkten erstellen - beachten gegen den Uhrzeiger daher

    P1; P2; P4 + P1;P4; P3

    P1; P2; P3 + P2; P4; P3 liefert Dir das gleiche Ergebnis. Wenn Du aber die Punkte anders verbindest, drehst Du die Oberflächen ggf. um 180° und siehst dann ggf nichts mehr, wenn die Textur bzw. das Material dazu kommt.

    Ich hoffe das hilft erst einmal.

    Steffi

    Donnerstag, 8. März 2012 08:40
  • Hallo Steffi

    - erstmal danke für Deine Antwort!

    Dein Beispiel ist mir soweit klar, der "springende Punkt" ist eher - wie Du richtig schreibst - ich muss meine Geometry kennen.

    Wenn ich ein statisches Objekt habe wie einen einfachen Würfel oder etwas komplexer bsp. einen Zylinder, so kann ich meine Geometry relativ gut kennen. Ich aber lese die räumlichen Informationen von einer Kinect ein. Dass bedeutet, dass ich die Geometry 'per se' nicht kenne (Ausser eben die Auflösung, Bsp. 640x480 aller Tiefenpunkte). 

    OK - nun eben der Hacken: Kinect liefert für Distanzen < 800 && > 4000mm Tiefenwerte von 0; wenn ich mich also an die statische Auflösung der Kinect halte, und obige Regel befolge, so bekomme ich folgendes Ergebnis:

    ok - iss noch aufm Kopf....

    Nun - wie man sieht geht's jetzt darum, eben die Nullwerte, welche als tiefste Ebene zu sehen sind quasi zu "filtern", und somit auch die Bindung der Triangles im Vordergrund, welche die relevanten Bereiche sind, zu lösen (es entfallen dann auch die perspektivischen "Zieher" nach hinten).

    Einfach gesagt, möchte ich nur Körper, welche im Raum stehen (oder allg. VOR einer Referenztiefe), darstellen.

    Nur eben - wie mache ich das, ohne das die Performance leidet? Hast Du da Anhaltspunkte, oder weisst Du Quellen? 

    Ich vermute, ich benötige einen Algorithmus zur Analyse der Datenpunkte, siehst Du das auch so? Wenn ja, wie könnte der Aussehen?

    Danke und Grüsse

    PEter

    Donnerstag, 8. März 2012 10:24
  • Hi,

    nachdem ich die Kinect nicht wirklich kenne habe ich mich aber in der allwissenden Müllhalde - Internet - umgesehen und für Dein Problem scheint es da einiges zu geben.

    Matthew Fisher  und OpenKinectsollten Dich weiterbringen und Du musst das Rad nicht neu erfinden.

    Allerdings ist Dein Ergebnis von den obigen nicht wirklich weit entfernt und mir nicht so ganz klar, was Du wirklich brauchst. Da ich Kinectdaten nicht verarbeite kann ich Dir aber ansonsten auch nicht weiter helfen - sorry.

    Good luck

    Steffi

    Donnerstag, 8. März 2012 15:10
  • Allwissende Müllhalde - *lol* - wie wahr....

    Ich kenne die beiden Seiten bereits, danke trotzdem für Deinen "Zuspruch".

    Der Vollständigkeit halber (hab mich u.U. wenig deutlich ausgedrückt...):

    Ziel ist es, dass das Ganze mal (nativ) etwa so aussieht:

    Habe noch einen interessanten Anhaltspunkt gefunden:

    pointclouds.org

    Nochmal danke, Grüsse

    Peter

    Freitag, 9. März 2012 08:21