Bin ganz frisch hier und kenne fast noch gar nix.
Las das Markt+Technik Buch "OpenGL" (ist eigentlich nicht mein "prefered" Verlag, aber es gibt sonst wenige deutsche Bücher dazu).
Dieses Buch schuf mir aber nur die Grundlagen (ein bisschen Lineare Algebra, Vektoren und Matrizen, OpenGL Primitiven und Kamera-Dinge).
Danach vertiefte ich mich noch in die 3D-Modelierung mit Blender. Mein Ziel ist es ein kleines Spiel zu progammieren, doch zuerst brauche ich noch VIEL mehr Grundlagen.
In vielen Tutorials finde ich Mesh-Klasses die durch Laden oder selber Produzieren erstellt werden.
Doch alle Tutorials erstellen nicht nur Mesh-Objekte sonder machen so viel, das ich den Überblick verliere.
Zuerst mal... was ist ein Mesh?
Nach meiner Auffassung, auch durch meine neu gewonnene Erfahrung mit Blender, ist ein Mesh eine Ansammlung von Punkten (Vertex) die mit Linien (Edges) und Flächen (Faces) verbunden sind.
Widersprecht mir wenn ich falsche liege!
Ich habe von Hand schon mit den OpenGL Primitiven kleine Häuse gebaut (wie im Buch beschrieben) mit:
- 4 Wänden (GL_QUADS)
- 2 Dachgiebeln (GL_TRIANGLES)
- 2 Dachhälften (GL_QUADS)
Für ein Spiel wäre es sehr Aufwändig Häuser, Autos, etc. von Hand zu erstellen. So drängen sich mir andere Techniken auf.
Mesh ist eine sehr verbreitete Technik, die ich gerne auch lernen möchte, verstehe aber nicht, wie ich Mesh-Objekte von einem 3D-Programm in meine OpenGL Umgebung bringe.
Ich habe mir mal ein 3DS Print-Programm (C++) angeschaut. Hier nun die wichtigsten Strukturen in Delphi:
Code:
type
Vertex = record
x: real;
y: real;
z: real;
Face = record
p1: word;
p2: word;
p3: word;
Mesh = record
vertices: array of Vertex;
faces: array of Face;
end;
Diese 3DS Dateien können mit einem 3D-Programm eingelesen und angesehen/editiert werden.
Es gibt also eine Möglichkeit, diese Mesh-Objekte (egal ob es jetzt 3DS oder andere Formate) in meine OpenGL Umgebung zu bringe... ich weiss einfach nicht wie!
Beispiel: eine Schachtel (Cube ohne Deckel)
- Wenn ich die Punkte kenne, wie weiss ich, ob das Objekt einen Deckel hat oder nicht?
- Wir kann ich unterscheiden, ob die Schachtel aus Vierecken oder Dreiecken besteht?
- Gibt es verschiedene Algorithmen diese Objekte in ein Format zu speichern/laden?
Könnt Ihr mir in einfachen Sätzen beibringen, wie eine Mesh zusammengesetzt ist und wie man sie füllt/lädt?
Also erstmal deine Auffassung was ein Mesh ist im Grunde richtig.
Es ist ein Polygon-Netz welches zum Darstellen von Objekten in 3D-Programmen verwendet wird.
Also quasi eine Ansammlung von Dreiecken und,oder Vierecken.
Am einfachsten wäre für den Anfang wenn du dir mal das Wavefront Format (.obj) anschaust, das ist recht einfach zu verstehen und zu laden.
Das Beispiel mit der Kiste ohne Deckel:
Es werden im z.B. Wavefront-Format erst alle Punkte (Vertices) gespeichert und anschließend werden die Polygone dadurch erzeugt indem man ihnen sagt aus welchen der Punkte sie bestehen.
Also ist es recht einfach herauszufinden ob eine Kiste keinen Deckel hat weil in dem Fall einfach kein Polygon dafür existiert.
Weiterführend:
Schau mal hier im Wiki nach da gibt es ein Tutorial zum Thema einen Exporter für Blender schreiben mit dem du dir dann eigene Methoden einbauen kannst wie du deine Objekte speichern willst.
Außerdem gibt es auchnoch die gl3ds Lib von Noeska mit der du ziemlich leicht 3DS Modelle laden und ausgeben kannst.
Registriert: Di Dez 27, 2005 12:44 Beiträge: 393 Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo,
da in der Face-Struktur nur 3 Eckpunkte abgespeichert werden, kannst du damit leider nicht zwischen Dreiecken und Quads unterscheiden.
Das ist aber nicht weiter schlimm, da es in Blender eine einfache Funktion gibt, um Quads in Dreiecke umzuwandeln.
Alternativ zum wavefront-Format könntest du dir auch mal das stl-Format ansehen, da werden einfach nur die Normalen und die Eckpunkte der Dreiecke abgespeichert, für einen Importer bräuchtest du da nur ein paar Zeilen Code, z.B:
Code:
GLuint readStl( char* fileName )
{
char line[256];
float n[3], v[3];
int lc=0;
FILE* f = fopen(fileName, "rb");
if ( f == NULL ) { printf(" cannot read stl\n"); exit(-1); }
Das 3DS-Format kann nur Dreiecke speichern? Oh Gott!
Vielleicht konnte man Früher nur Dreiecke speichern, doch ab Version 3 gibt es (fast) garantiert auch Quads im Format.
Wenn ich's in Blender importiere, kommen nur Dreicke vor.
Kann sein das die frei verfügbaren Import/Export Sourcen "nur" die Dreiecke-Variante kennen.
Werde mich mal genäuer Schlau machen...
Wie siehst denn aus, wenn ich "nur" Dreiecke lade.
Sind die Dreiecke in einer bestimmten Reihenfolge abgespeichert, das ich mich nicht um die Reihenfolge kümmern muss?
Jedes Dreieck ist völlig unabhänging von den anderen Dreiecke (GL_TRIANGLES) oder gibt es eine Reihenfolge (GL_TRIANGLE_STRIP)?
Was nehmt ihr für ein Format?
Es soll ja platzsparend sein (= binär) aber doch viel funktionalität haben.
Registriert: Mo Jan 31, 2005 11:02 Beiträge: 432 Wohnort: Rheinlandpfalz
Hi,
wie schon angedeutet, gibt es mehrere Möglichkeiten komplexe Objekte in OpenGL zu laden.
3ds- und Obj-Dateien sind da natürlich eine davon. Für Obj habe ich selbst schon einen Loader geschrieben. Wenn du 3ds benutzen willst, kann ich dir Noeskas Loader empfehlen.
te-bachi hat geschrieben:
Wie siehst denn aus, wenn ich "nur" Dreiecke lade. Sind die Dreiecke in einer bestimmten Reihenfolge abgespeichert, das ich mich nicht um die Reihenfolge kümmern muss? Jedes Dreieck ist völlig unabhänging von den anderen Dreiecke (GL_TRIANGLES) oder gibt es eine Reihenfolge (GL_TRIANGLE_STRIP)?
Also generell brauchst du dir um die Reihenfolge keine Gedanken zu machen (es sei denn du willst mit Blending arbeiten), denn zumindest bei meinem Obj-Loader mache ich es so, dass die Triangles mit glBegin(GL_TRIANGLES) in der Reihenfolge gerendert werden, wie sie in der Datei stehen. Anschließend hat man die Möglichkeit das ganze in ne DisplayListe zu compilieren, welches die Renderzeit natürlich drastisch verringert. Dennoch sind Displaylisten nicht mehr aktuell, und werden durch bessere / schnellere Methoden ersetzt, wie zb Vertex-Buffer-Objects (VBOs).
Conan und ich sind dabei einen neuen Loader zu schreiben (bzw. sind eigentlich schon fertig, es müssen lediglich noch ein paar Beispielanwendungen geschrieben werden). Dieser wird (hoffentlich) bald released werden. Er nutzt ein eigenes Datei-Format, welches aber an dem Obj-Format angelehnt ist. Aufgrund des eigenen Formates mussten wir uns also selbst einen Exporter schreiben. Da Blender sehr leistungsstark und OpenSource ist, haben wir uns entschlossen dafür einen Exporter zu schreiben, also quasi ein Heimspiel für dich . Der neue Loader (Restless genannt), wird auf VBO's basieren. Er unterstützt Keyframe-Animationen (mit beliebig vielen bone weights pro vertex), welche der Hauptgrund waren einen neuen Loader zu schreiben, denn so etwas gibt es afaik in dieser Form für Delphi/Pascal und OpenGL noch nicht. Man kann ihn sowohl mit Delphi als auch FPC (Free Pascal) benutzen. Er wird als DLL herauskommen, welche man unter Windows und Linux mit einem Pascal-Header benutzen kann, wobei es bei Linux noch einen kleinen Bug gibt... Hier ist eine Testanwendung, welche jedoch nur die Animationsfähigkeiten des Loaders demonstriert, also reine Bone-Animation (ohne ein eigentliches Objekt zu "verformen"). Diese Animation stammt aus einer Motion-Capturing Datei, welche mit Blender geladen und dann in unser Format exportiert wurde. Tasten für die Demo sind WASD und LMB (zum Steuern der Kamera), SPACE (zum Starten der Animation).
Hier ist noch eine etwas ältere News von unserem Projekt, welche aber auf der Version des Loaders zu dieser Zeit basiert (also schon ein bisschen out of date, und damals ein erster Test ).
Obiger Link hat geschrieben:
Das Restless-Projekt steht kurz vor seiner Veröffentlichung.
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.