Modellierung mit OpenGL



  • Ich schreibe gerade ein Programm das aus einer Seiten-, Vorder- und Draufsicht (2D) ein 3D-Modell erstellen soll (z.B. ein T-Träger).

    Bisher bin ich so vorgegangen:
    - die fehlende Koordinate aus der Vorderansicht (nur x,y) habe ich mir aus der Draufsich bzw. Seitenansicht geholt.
    - dann habe ich das vorderste und dass hinterste Polygon gezeichnet
    - und da das vordere und das hintere Polygon jeweils gleichviele Vertices haben, konnte ich die Verbindungspolygone auch ganz einfach konstruieren.
    (vorn unten -> hinten unten -> hinten oben -> vorn oben)

    Wie kann ich aber Vorgehen, wenn das vordere und das hintere Polygon unterschiedlich viele Vertices haben? Oder wenn zwischen dem vorderen und hinteren Polygon zusätzliche Vertices sind, die zum Objekt gehören?

    Hat jemand ne Idee. 🙂



  • Bist du so scharf darauf was neues zu erfinden, oder hast du sowas noch nicht gefunden?
    http://en.wikipedia.org/wiki/Wavefront_.obj_file

    Denn damit hast du dann auch gleich die Möglichkeit es aus 3DS Max etc. zu exportieren.



  • Die Sache ist die, das ich die ganzen Vertices in einem Array habe. Und dieses Array müsste ich dann irgendwie mit OpenGL visualisieren können.

    Wie kann ich da vorgehen? Habe also kein Dateiformat.



  • Ach so, das ist ein ganz anderes Thema. Dann habe ich deinen ersten Post wohl missverstanden.
    Nun, um die Frage zu beantworten sollte man wohl wissen welche OpenGL Version du nutzt etc., aber ich werde auch so nur auf irgendein OpenGL Tutorial verweisen, da sollte das alles erklärt werden..



  • gartenkralle_deluxe schrieb:

    Die Sache ist die, das ich die ganzen Vertices in einem Array habe. Und dieses Array müsste ich dann irgendwie mit OpenGL visualisieren können.

    Wie kann ich da vorgehen? Habe also kein Dateiformat.

    Nunja, das Array sollte sortiert sein. Es gibt nur mehrere Möglichkeiten.
    Ich sortiere das Array so:

    VCT

    Wo V für Vertices, T für Texturkoordinaten und C für Color bzw Material steht.
    Du musst dich dann nur entscheiden wie du es zeichnen willst. Per VBO oder per Client-Side-Array.
    Du kannst dann OpenGL mitteilen wie deine Daten angeordnet sind.
    In meinem Fall schaut das so aus, mit VBO:

    // Create Vertex Array
            glGenVertexArrays(1, &m_vao);
            glBindVertexArray(m_vao);
    
            // Create 1 VBO
            glGenBuffers(1, &m_vbo);
            glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
    
            // Enable Attribute Sets
            glEnableVertexAttribArray(0);
            glEnableVertexAttribArray(1);
            glEnableVertexAttribArray(2);
    
            // Define Attribute Sets
            glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(NLVertexData), 0);
            glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(NLVertexData), (void*)(3*sizeof(float)));
            glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(NLVertexData), (void*)(7*sizeof(float)));
    
            // Send Vertex data
            glBufferData(GL_ARRAY_BUFFER, 6*m_list.size()*sizeof(NLVertexData), data, GL_STREAM_DRAW);
    
            // Disable Attribute Sets               
            glDisableVertexAttribArray(0);
            glDisableVertexAttribArray(1);
            glDisableVertexAttribArray(2);
    
            // Unbind
            glBindVertexArray(0);
            glBindBuffer(GL_ARRAY_BUFFER, 0)
    

    Mit Hilfe der Attribut-Sets habe ich dem Vertex Array Object eben verraten wo was sitzt. Jetzt weiss OpenGL allerdings noch nicht ob das Vertices sind oder was anderes. Das macht man dann mit dem Vertex-, bzw Fragmentshader.

    Im Fall von Client-Side-Arrays geht man wieder anders vor, aber ich empfehle hier wirklich VBO zu nehmen. Entweder mit purem OpenGL3 oder mit OpenGL2 + Extensions.



  • Kennst du eine lösung für die alte fixed function pipleline?

    Man müsste aus den ganzen Vertices Polygone erstellen, und zwar so das ein abgeschlossenes Objekt entsteht und keine Vertices außerhalb/innerhalb des Objekts verbleiben.



  • Das musst du selber machen. Da kann dir OpenGL nicht helfen.



  • Danke Scorer24, ich schau's mir gleich mal an. 🙂



  • Scorcher24 schrieb:

    Das musst du selber machen. Da kann dir OpenGL nicht helfen.

    Richtig. Mein Problem bleibt dadurch bestehen.
    Ich brauch also einen Algorithmus der mir z.B aus 100 beliebigen im Raum verteilten Vertices die Abfolge der Vertices für die Polygone berechnet, sodass ein abgeschlossenes Objekt entsteht, ohne das Vertices innerhalb/außerhalb des Objekts verbleiben.

    Dafür gibts doch sicher herangehensweißen!?


  • Mod

    lustige beschriebung: "aus 100 beliebigen im Raum verteilten Vertices die Abfolge der Vertices für die Polygone berechnet, sodass ein abgeschlossenes Objekt entsteht, ohne das Vertices innerhalb/außerhalb des Objekts verbleiben", fehlt noch "so dass es schoen ist" 😉

    kein wunder dass du nichtmal danach googlen kannst, deinen angaben nach koennte es so ziemlich jeder algorithmus sein der irgendwie punkte verbindet, wobei bei allen das ergaebniss komplet anders ist. vielleicht hilft dir einer der suchbegriffe
    - marching cubes
    - convex hull point cloud
    - Surface reconstruction 3d point scan

    wenn dir das nicht hilft, musst du halt genauer beschreiben was du machen willst, meine kristalkugel ist aus plexiglas und man kann kaum was sehen bei tageslicht 😉


Anmelden zum Antworten