Modelloader für Blenderdateien

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...

Modelloader für Blenderdateien

Beitragvon Hartkern » 8. Jun 2016, 15:01 Modelloader für Blenderdateien

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);
Hartkern
 
Beiträge: 68
Registriert: 5. Dez 2015, 20:03
Wohnort: Leipzig
OS, Lazarus, FPC: Win10 IDE 1.6 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 8. Jun 2016, 16:10 Re: Modelloader für Blenderdateien

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3877
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Hartkern » 8. Jun 2016, 16:27 Re: Modelloader für Blenderdateien

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..
Hartkern
 
Beiträge: 68
Registriert: 5. Dez 2015, 20:03
Wohnort: Leipzig
OS, Lazarus, FPC: Win10 IDE 1.6 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 8. Jun 2016, 17:47 Re: Modelloader für Blenderdateien

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3877
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Hartkern » 10. Jun 2016, 13:36 Re: Modelloader für Blenderdateien

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
Hartkern
 
Beiträge: 68
Registriert: 5. Dez 2015, 20:03
Wohnort: Leipzig
OS, Lazarus, FPC: Win10 IDE 1.6 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 10. Jun 2016, 18:02 Re: Modelloader für Blenderdateien

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3877
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Multimedia



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried