blender - Objekte in OGL einbinden



  • Hallo,

    ich habe gerade mich etwas in blender eingearbeitet, und versuche nun dieses in OGL zu nutzen:

    Ich habe das .obj Format genommen, dort sind ja alle vertixes aufgeführt. Die habe ich dann ausgelesen und wollte sie zeichnen. Allerdings kommt da nur Mist heraus. Die Koordinaten werden korreckt ausgelesen, das habe ich überprüft. Ich habe alle Punkte mit glBegin (GL_POLYGON) gezeichnet, ist das so richtig?

    Desweiteren wundert mich, dass mein Objekt recht wenig Polygone besitzt, trotzdem sind es über tausend Vertixes, die in der obj stehen, daher bekomme ich vllt gerade mal 1 fps, wenn überhaupt.



  • Die Faceindices...



  • Hallo,

    ich verstehe dich nicht richtig, meinst du mit Faceindece den Buchstabe vor jeder Zeile im obj-File? Ich weiß, dass die Zeilen mit -v ... die Vertexes sind, und nur die zeichne ich auch, bzw versuche.

    Tut mir leid, wenn ich dich falsch verstanden habe...



  • Faceindices fangen wie mit bei den Vertices mit "f" an. Sprich:
    f x y z
    Diese brauchst du um die Vertices zu rendern:
    glVertex3f( vertex[faceIndex.x].x, vertex[faceIndex.y].y, vertex[faceIndex.z].z );



  • hallo, so richtig bin ich immer noch nicht weiter.

    in den Vektoren m_vertexes und m_face_vertexes sind jeweils die Vertexes und die Face-Vertexes hintereinander gespeichert. Nun will ich das Objekt zeichen:

    glBegin (GL_POLYGON);
      	for (int i = 0; i < (m_face_vertexes.size () - 3); i += 3)
     		glVertex3d (m_vertexes [m_face_vertexes [i]], m_vertexes [m_face_vertexes [i + 1] + 1], m_vertexes [m_face_vertexes [i + 2] + 2]);
    	glEnd ();
    

    Habe ich das so richtig verstanden? Wahrscheinlich nicht, denn sonst würde es wohl funktionieren 😉



  • Da sich benachbarte Polygone Eckpunkte teilen und man diese nicht mehrfach angeben moechte, gibt es ein Array mit gemeinsamen Eckpunkten.
    Zusaetzlich wird definiert, aus welchen Eckpunkten jedes Polygon (meistens Drei- oder Vierecke) aufgebaut ist. Jeder Eckpunkt wird dabei durch den Index im Vertex-Array spezifiziert.
    Fuer einen Eintrag "f a b c" machst Du also

    glBegin(GL_TRIANGLES);
    glVertex3f( vertex[a].x, vertex[a].y, vertex[a].z );
    glVertex3f( vertex[b].x, vertex[b].y, vertex[b].z );
    glVertex3f( vertex[c].x, vertex[c].y, vertex[c].z );
    glEnd();
    

    Bei mehr als drei Eckpunkten kannst Du GL_QUADS oder GL_POLYGON nehmen, performanter ist diese in Dreiecke zu zerlegen und in einem Rutsch zu zeichnen.

    Der Plural von Vertex ist uebrigens Vertizen oder englisch Vertices.



  • hellihjb schrieb:

    performanter ist diese in Dreiecke zu zerlegen und in einem Rutsch zu zeichnen.

    Im Übrigen: Die Grafikkarte ist darauf ausgelegt, Dreiecke zu verarbeiten. Daher sollte man immer glBegin( GL_TRIANGLES ); nehmen wenn es die Situation zulässt.

    hellihjb schrieb:

    Der Plural von Vertex ist uebrigens Vertizen oder englisch Vertices

    Vertexes ist ebenfalls ein gültiges Synonym. Ich war ebenfalls überrascht als ich es gesehen habe.



  • danke, das mit den Dreiecken werde ich mir merken!

    Aber irgendwie funktioniert es immer noch nicht.

    Wie gesagt, in den Vektoren sind die Punkte hintereinander gespeichert. Dank euch verstehe ich jetzt, wie die obj Dateien sich zusammensetzen, aber wieso funktioniert das nicht? Wenn ich das zeichne kommt nur wildes Zeug heraus..

    glBegin (GL_TRIANGLES);
      	for (int i = 0; i < (m_face_vertexes.size () - 3); i += 3)
     	{
    		glVertex3d (m_vertexes [m_face_vertexes [i]], m_vertexes [m_face_vertexes [i] + 1], m_vertexes [m_face_vertexes [i] + 2]);
    		glVertex3d (m_vertexes [m_face_vertexes [i + 1]], m_vertexes [m_face_vertexes [i + 1] + 1], m_vertexes [m_face_vertexes [i + 3] + 2]);
    		glVertex3d (m_vertexes [m_face_vertexes [i + 2]], m_vertexes [m_face_vertexes [i + 2] + 1], m_vertexes [m_face_vertexes [i + 3] + 2]);
    	}
    	glEnd ();
    


  • Jeder Vektor in "m_vertexes" besteht ja aus drei Werten.
    Du willst also wahrscheinlich sowas:

    glVertex3d(
      m_vertexes[ m_face_vertexes[i]*3 ],   // x
      m_vertexes[ m_face_vertexes[i]*3+1 ], // y
      m_vertexes[ m_face_vertexes[i]*3+2 ], // z
    );
    

    Oder 'ne sinnvolle Vektor-Klasse...



  • aber da die for-schleife jeweils jeden dritten wert aufruft, brauche ich das nicht mehr mit 3 zu multiplizieren.

    Der vektor m_vertexes besteht nicht aus drei Werten, er besitzt alle punkte der obj-Datei, also:

    m_vertexes [0] ... 1. Vertex: x
    m_vertexes [1] ... 1. Vertex: y
    m_vertexes [2] ... 1. Vertex: z
    m_vertexes [3] ... 2. Vertex: x
    m_vertexes [4] ... 2. Vertex: y
    ...

    mit m_face_vertexes genau das gleiche.



  • 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?

    😃 👍


Anmelden zum Antworten