blender - Objekte in OGL einbinden



  • Und die Werte *in* "m_face_vertexes" sind auch schon mit 3 multipliziert? 🙂



  • bin ich doof ^^

    ok, die Werte musste ich natürlich nochmal mit drei multiplizieren, also sieht der erste Punkt jetzt so aus:

    glVertex3d (m_vertexes [m_face_vertexes [i] * 3], m_vertexes [m_face_vertexes [i] * 3 + 1], m_vertexes [m_face_vertexes [i] * 3 + 2]);
    

    wenn ich das mache, dann sieht das meinen Objekt zumindest schonmal ähnlich, aber es gibt dennoch viele dreiecke, die einfach nicht reinpassen. Also ganz korrekt kann ich das noch nicht haben, hab ich da noch einen dummen fehler gemacht?

    habe das ganze mal mit einem würfel gemacht, und da hat er den auch nicht ordentlich gezeichnet. Interessanterweise bestehen dort die Face-Vertexes aus 4 Koordinaten, daher habe ich das nochmal mit Quads (diesmal habe ich aber nicht vergessen, das alles mit 4 zu multiplizieren ^^) gezeichnet, aber auch das hilft nicht..

    ich danke euch, für euer bemühungen!



  • Interessanterweise bestehen dort die Face-Vertexes aus 4 Koordinaten

    Da sind die Seiten eben viereckig.

    diesmal habe ich aber nicht vergessen, das alles mit 4 zu multiplizieren

    Die Vektoren sind aber weiterhin dreidimensional.

    aber es gibt dennoch viele dreiecke, die einfach nicht reinpassen

    Wo genau da noch ein Fehler ist kann man von hier aus schlecht sagen.



  • diesmal habe ich aber nicht vergessen, das alles mit 4 zu multiplizieren

    Die Vektoren sind aber weiterhin dreidimensional.

    das ist richtig, ich meinte in der for-schleife und die anzahl der Vertices.

    also, die werte in den vektoren m_vertices und m_face_vertices stimmen, das habe ich nochmal überprüft.

    wenn ich versuche den Würfel zu zeichnen, dann bekomme ich vier Quadrate im Raum gestellt hin, die teilweise in Ordnung sind, teilweise komisch geneigt sind und nicht passen.

    glBegin (GL_QUADS);
    
     	for (int i = 0; i < (m_face_vertices.size ()); i += 4)
     	{
    		glVertex3d (m_vertices [m_face_vertices [i] * 3], m_vertices [m_face_vertices [i] * 3 + 1], m_vertices [m_face_vertices [i] * 3 + 2]);
    		glVertex3d (m_vertices [m_face_vertices [i + 1] * 3], m_vertices [m_face_vertices [i + 1] * 3 + 1], m_vertices [m_face_vertices [i + 1] * 3 + 2]);
    		glVertex3d (m_vertices [m_face_vertices [i + 2] * 3], m_vertices [m_face_vertices [i + 2] * 3 + 1], m_vertices [m_face_vertices [i + 2] * 3 + 2]);
    		glVertex3d (m_vertices [m_face_vertices [i + 3] * 3], m_vertices [m_face_vertices [i + 3] * 3 + 1], m_vertices [m_face_vertices [i + 3] * 3 + 2]);
    	}
    	glEnd ();
    


  • Warum denn so kompliziert? Zeichne sie doch ganz einfach als Dreiecke, warum du das tun solltest habe ich bereits gesagt.



  • ich habe doch vorher schon gesagt: wenn ich ein würfel mit blender erstelle, dann hat er nicht dreiecke, sondern vierecke in der obj-datei gespeichert. Daher zeichne ich auch die Vierecke.

    In meinen Objekt, welches ich ursprünglich zeichnen wollte, da standen dort auch Dreiecke.

    Wenn alles funktioniert, kann ich dann immer noch alles in Dreiecken zeichnen lassen, aber ich will erstmal, dass es funktioniert...



  • Hä? Egal was für Sachen du da modellierst, es werden alle Daten als Dreiecke abgespeichert. Oder was dachtest du? Glaubst du etwa das Elefanten als Elefanten-Ecke abgespeichert werden? Außerdem: Wie sollte man dann bitte einen Loader schreiben ohne zu wissen, was für ein Model modelliert wurde?

    EDIT:
    Du hättest dir auch selber ausrechnen können, ob die Daten als Dreick gespeichert wurden doer als Quadrate. Bei einem Quadrat müssten es insgesamt 24 Koordinaten seien und bei einem Dreieck 36 Koordinaten.



  • so sieht meine obj aus:

    # Blender3D v245 OBJ File: <memory>
    # www.blender3d.org
    mtllib cube.mtl
    v 1.000000 1.000000 -1.000000
    v 1.000000 -1.000000 -1.000000
    v -1.000000 -1.000000 -1.000000
    v -1.000000 1.000000 -1.000000
    v 1.000000 0.999999 1.000000
    v 0.999999 -1.000001 1.000000
    v -1.000000 -1.000000 1.000000
    v -1.000000 1.000000 1.000000
    usemtl (null)
    s off
    f 1 2 3 4
    f 5 8 7 6
    f 1 5 6 2
    f 2 6 7 3
    f 3 7 8 4
    f 5 1 4 8
    

    und die face-vertices sind 4. daher nehme ich an, dass es sich um vierecke handelt. Bei meinem ersten Objekt waren es allerdings 3...



  • Egal was für Sachen du da modellierst, es werden alle Daten als Dreiecke abgespeichert.

    Da man beim Modellieren haeufig irgendeine Form von Grid nutzt, sind ein Grossteil der Polygone Vierecke.
    Viele Exporter erzeugen aber automatisch Dreiecke wenn diese nicht planar sind.

    Du hättest dir auch selber ausrechnen können, ob die Daten als Dreick gespeichert wurden doer als Quadrate. Bei einem Quadrat müssten es insgesamt 24 Koordinaten seien und bei einem Dreieck 36 Koordinaten.

    Jedes Polygon eines Modells kann eine andere Anzahl von Eckpunkten haben.

    Ulf schrieb:

    so sieht meine obj aus [...]

    Und jetzt zeig mal noch den Inhalt von "m_vertices" und "m_face_vertices".



  • hellihjb schrieb:

    Viele Exporter erzeugen aber automatisch Dreiecke wenn diese nicht planar sind.

    Richtig, darauf war es bezogen.

    hellihjb schrieb:

    Jedes Polygon eines Modells kann eine andere Anzahl von Eckpunkten haben.

    Da er sagte das es sich um einen Würfel handele, habe ich es darauf bezogen.

    🙂



  • Kóyaánasqatsi schrieb:

    Hä? Egal was für Sachen du da modellierst, es werden alle Daten als Dreiecke abgespeichert. Oder was dachtest du? Glaubst du etwa das Elefanten als Elefanten-Ecke abgespeichert werden?

    😃 👍



  • hellihjb schrieb:

    Und jetzt zeig mal noch den Inhalt von "m_vertices" und "m_face_vertices".

    wie gesagt, die stimmen:

    cout << "m_vertices:" << endl << endl;
    for (int i = 0; i < m_vertices.size (); i++)
    	cout << m_vertices [i] << endl;
    
    cout << "m_face_vertices:" << endl << endl;
    for (int i = 0; i < m_face_vertices.size (); i++)
    	cout << m_face_vertices [i] << endl;
    

    Ausgabe:

    m_vertices:
    
    1
    1
    -1
    1
    -1
    -1
    -1
    -1
    -1
    -1
    1
    -1
    1
    0.999999
    1
    0.999999
    -1
    1
    -1
    -1
    1
    -1
    1
    1
    m_face_vertices:
    
    1
    2
    3
    4
    5
    8
    7
    6
    1
    5
    6
    2
    2
    6
    7
    3
    3
    7
    8
    4
    5
    1
    4
    8
    


  • Glaube mir doch einfach. Wenn die Würfeldaten als Quadrat-Koordinaten abgespeichert werden, dann müssten es maximal 6 Faceindices seien. Da dann ein Quadrat 4 Eckpunkte hat, müssten es 6 * 4 Koordinaten seien. Wenn deine Würfeldaten als Dreick-Koordinaten abgespeichert werden, was standardisiert und üblich ist, dann hättest du pro Würfelseite 2 Faceindices und somit 2 * 3 Koordinaten. Der komplette Würfel hätte so 12 Faceindices und 12 * 3 Koordinaten.

    Glaubst du mir jetzt?

    Im Übrigen:
    Überprüfe mal die Daten aus der Würfel-Datei mit deinen. Irgendetwas stimmt da nicht, da der maximale Index 8 beträgt.

    EDIT:
    So sieht ein Würfel aus...



  • Kóyaánasqatsi schrieb:

    Irgendetwas stimmt da nicht, da der maximale Index 8 beträgt.

    Index "1" referenziert "m_vertices[0]" - alle Indizes muessen also um 1 verschoben werden.

    Wenn deine Würfeldaten als Dreick-Koordinaten abgespeichert werden, was standardisiert und üblich ist

    Das ist ja offentsichtlich nicht der Fall.
    Je nach einsatzzweck kann es auch durchaus sinnvoll sein, Polygone zu erhalten.



  • Wenn man bei Blender ins .obj Format exportiert, dann gibt es einen Schalter mit Aufschrift "Triangulate". Nur um mal die weitere Diskussion um Dreiecke und nicht Dreiecke zu beenden 😉


Anmelden zum Antworten