Modelloader für Blenderdateien

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Hartkern
Beiträge: 69
Registriert: Sa 5. Dez 2015, 20:03
OS, Lazarus, FPC: Win10 IDE 1.6
CPU-Target: 64Bit
Wohnort: Leipzig

Modelloader für Blenderdateien

Beitrag von Hartkern »

Hallo,

ich versuche mich derzeit an einem Modelloader, es sollen Models aus einer OBJ Wavefront Format Datei geladen werden können, die ich später in einen Vertex Array nutzen will. Ob aus dem Vertex Array mal ein VAO werden soll, steht noch in den Sternen.

Derzeit habe ich ein dezentes Verständnisproblem.

Die x,y,z eines Vertex lade ich in den Tglvertex3f array

Anschließend brauch ich ja noch nen Indecies Array um zu vermeiden das manche Vertexe mehrfach gespeichert werden..
Der Array dafür ist lediglich nen Array of Integer, welcher pro f (face) die Nummern der zu benutzenden Vertexe speichert?

Also [0]=1
[1]=2
[2]=3

Dies würde dann das f1 mit den Vertexen 1,2,3 zeichnen?

Das Zeichnen will ich dann mit folgenden realisieren:
//aktiviern Vertexarray des Models
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, aModell_Vertexe);

// zeichnen
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE,aModell_indices); //keine ahnung was der plural von indexen ist

//deaktivieren
glDisableClientState(GL_VERTEX_ARRAY);

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Modelloader für Blenderdateien

Beitrag von Mathias »

Anschließend brauch ich ja noch nen Indecies Array um zu vermeiden das manche Vertexe mehrfach gespeichert werden..

Die Idee mit den Indecies, um Speicher zu sparen wäre sicher gut.
Aber sobald noch Normale (Beleuchtung) ins Spiel kommen, kannst du dies vergessen.

Wen ich dein OBJ-Beispiel mit dem Würfel angucke, werden die gleichen Ecken wohl mehrfach verwendet, aber die Normale ist anders.
Aus diesem Grund empfehle ich dir, die Ecken mehrfach zu speichern, somit wird es eine VertexArray für die Pos und die Normalen geben, welche beide dann gleich lang sind.

Ob aus dem Vertex Array mal ein VAO werden soll, steht noch in den Sternen.

Dies würde ich auf jeden Fall machen, ausser du verwendest ein OpenGL < 3.3 .
Wie die Daten mit dem VAO gebunden werden kann ich dir schon zeigen.

ich versuche mich derzeit an einem Modelloader, es sollen Models aus einer OBJ Wavefront Format Datei geladen werden können,

Wie weit willst du gehen ?
Sollen schluss endlich auch Texturen geladen werden ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Hartkern
Beiträge: 69
Registriert: Sa 5. Dez 2015, 20:03
OS, Lazarus, FPC: Win10 IDE 1.6
CPU-Target: 64Bit
Wohnort: Leipzig

Re: Modelloader für Blenderdateien

Beitrag von Hartkern »

na wenn es Sinn machen soll, sollten schon Vertexe (v) , Normalen (vn) und Texturen (vt) gespeichert werden und auch angezeigt werden...

die genannten Teile in eigene Arrays zu puzzeln stellt kein Problem dar. Wie ich die alle für ein Modell in OpenGL verwurschteln soll ist dann eher mein Problem..

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Modelloader für Blenderdateien

Beitrag von Mathias »

Ich habe eine Modell-Viewer, welcher auch Texturen darstellen kann.

Da die meisten Modelle aus mehreren Objecten (o ???) bestehen, habe ich für jedes Object eine eigene VAO gebaut.
Viele Modelle haben ein Gemisch, aus Texturen oder ohne Texturen.

Schluss endlich ist es eine sehr komplexe Sache, dies alles zu berücksichtigen.

Für den Anfang, würde ich mal nur die (v) auswerten, dann später noch die (n) dazu fügen.
Da gibt es schon viel zu filtern, da es für die (f) schon mehrere Varianten gibt.

Code: Alles auswählen

f x     Nur Pos
f x//x  Pos & Normale
f x/x/x Pos & Textur & Normale
f x/x   Pos & Textur
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Hartkern
Beiträge: 69
Registriert: Sa 5. Dez 2015, 20:03
OS, Lazarus, FPC: Win10 IDE 1.6
CPU-Target: 64Bit
Wohnort: Leipzig

Re: Modelloader für Blenderdateien

Beitrag von Hartkern »

Nochmal zu meinen Verständnisproblem

Code: Alles auswählen

Die x,y,z eines Vertex lade ich in den Tglvertex3f array
 
Anschließend brauch ich ja noch nen Indecies Array um zu vermeiden das manche Vertexe mehrfach gespeichert werden..
Der Array dafür ist lediglich nen Array of Integer, welcher pro f (face) die Nummern der zu benutzenden Vertexe speichert?
 
Also [0]=1
[1]=2
[2]=3
 
Dies würde dann das f1 mit den Vertexen 1,2,3 zeichnen?
 


Die Vertexe und Normlen hab ich aktuell je in einen Array gespeichert, ich hab mir einen Record dazu gebastelt, da ich scheinbar zu doof bin TglVertex3f als Array zu verwenden

Code: Alles auswählen

type
  tvertex = packed record
    x : real;
    y : real;
    z : real;
  end;           


Für die Texel hab ich analog einen Record erstellt

Code: Alles auswählen

type
  ttexel = packed record
    u : real;
    v : real;
  end;       


Edit1: Die reals stammen noch aus meinen Turbo Pascal Zeiten :shock: wenn es da Verbesserung gibt, immer her damit

Zur Kontrolle verwende ich lediglich:

Code: Alles auswählen

//Testausgabe Vertexe
  for i :=0 to high(VertexArray) do
     begin
       memo1.lines.add(FloatToStr(VertexArray[i].x)+' '+FloatToStr(VertexArray[i].y)+' '+FloatToStr(VertexArray[i].z));
     end;                                                                                                               


die Vertexe, Normalen und Texel werden sauber aus den Stringlisten geparst.

Wie kann ich den Array of TGlVertex3f verwenden..da die Nummer mit den [ ] nicht funktioniert?

Des Weiteren, wie soll jetzt der Index Array aufgebaut werden? oder wie soll ich weiter vorgehen, um mir für später wenn ich zumindest erstmal für ein Objekt innerhalb der OBJ Datei alles laden will (v, vn, vt, f)

gruß Sebastian

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Modelloader für Blenderdateien

Beitrag von Mathias »

Edit1: Die reals stammen noch aus meinen Turbo Pascal Zeiten :shock: wenn es da Verbesserung gibt, immer her damit

Normalerweise nimmt man da Single oder double, aber in dem OpenGL-Fall nimmt man da GLfloat, da ist man sicher, das die Zahl dann kompatibel zu OpenGL ist.

So bringst du den String am einfachten in den Vector.
Functioniert aber erst ab fpc 3.1, ansonsten muss man einen Umweg über TStringlist und DelimeterText machen.

Code: Alles auswählen

const
  vns = 'v 123.456 234.567 345.678';
var
  vec: TVector3f;
  sa: TStringArray;
  i: integer;
begin
  sa := vns.Split(' ');
  if Length(sa) <> 4 then begin
    ShowMessage('Fehler');
  end else begin
    for i := 1 to Length(vec) do begin
      vec[i] := StrToFloat(sa[i]);
    end;
  end;
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten