blender - Objekte in OGL einbinden
-
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 alsoglBegin(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?
-
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.
-
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