Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Mai 14, 2024 09:05

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: 3D-Modell benutzen
BeitragVerfasst: Mo Okt 01, 2012 13:12 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Moin.

Mal angenommen ich habe in Blender ein 3D-Modell erstellt und möchte dies in OpenGL darstellen.
Ich bin leider etwas verwirrt durch den ganzen Krams (Python, Exporter, Loader...) der dazu zu lesen ist und würde gern ein wenig in die richtige Richtung gelenkt werden.

Ich hätte am liebsten die Triangles aus dem Modell in einem XML-File, dass ich danach lesen kann.
(Keine Ahnung ob das der übliche Weg ist)

Wie muss ich vorgehen um die Daten aus dem Modell zu erhalten?

Grüße!

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 3D-Modell benutzen
BeitragVerfasst: Mo Okt 01, 2012 14:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Es gibt einen großen haufen von Modellformaten. Wenn du die Triangles in nem eigenen Format haben willst, musst du einen eigenen Exporter schreiben. Gängiger ist es aber für den Einstieg, ein einfaches Format wie Wavefront Obj zu nehmen. Einen Exporter dafür liefert Blender gleich mit. Wie man die Daten interpretiert findet sich zu hauf im Internet dokumentiert.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 3D-Modell benutzen
BeitragVerfasst: Mo Okt 01, 2012 16:08 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Danke,
Wavefront ist im Grunde genau das was ich suche.
Das interpretieren der Daten sollte kein Problem darstellen.

Grüße!

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 3D-Modell benutzen
BeitragVerfasst: Mi Okt 03, 2012 11:16 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
MD5 ist auch relative leicht zu kapieren... und noch leichter zu lesen da es ASCII ist.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 3D-Modell benutzen
BeitragVerfasst: Mi Okt 03, 2012 13:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Warum ist ASCII leichter zu lesen als … ASCII? Wavefront Obj ist ASCII ;)

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 3D-Modell benutzen
BeitragVerfasst: Do Okt 04, 2012 07:25 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Hey,

wenn du nicht alles selber machen willst, schau dir doch mal folgende lib an:
http://assimp.sourceforge.net/

Ich meine mich zu erinnern, dass auch vor kurzem jemand Delphi Bindings dafür erstellt hat.

Die lib kann viele unterschiedliche Modelformate laden und was du dann in deinem Programm raus bekommst ist eine Datenstruktur die, unabhängig vom Modelformat, immer gleich aussieht.
Ich für meinen Teil fands ziemlich nervig eigene Loader für irgendwas zu schreiben, ist zwar anfangs ganz interessant, aber irgendwann fragt man sich ob man den ganzen Schmodder eigentlich braucht für die eigenen kleinen Tests und lässt dann eh die hälfte des Formats weg :)

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 3D-Modell benutzen
BeitragVerfasst: Do Okt 04, 2012 21:09 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Vielen Dank,

mit dem Wavefront-Format komm ich ganz gut zurecht.
Hat alles was ich brauche (momentan zumindest) und ist auch recht übersichtlich... ist ja ASCII ;)
Konnte bereits ein Modell laden und inklusive beleuchtung (smooth) darstellen. Morgen kommt noch Textur in den Loader und dann bin ich zufrieden.
Mein erstes Modell ist ein Bäumchen, schaut vernünftig aus.

Grüße

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 3D-Modell benutzen
BeitragVerfasst: Fr Okt 05, 2012 19:04 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
So nun denn ;)

Nachdem ich es nun geschafft habe das Modell inklusive Normalen pro Vertex und Texturen zu laden und darzustellen:

Dateianhang:
Tree.jpg


treten doch ein paar Fehler auf:

Dateianhang:
badtree.jpg


Hier ist deutlich zu sehen, dass die Textur (nur an einigen Stellen) "verzogen" ist.
In Blender sieht es feini aus.

Ich weiß gerade nicht woran es liegt. Ich vermute jedoch, dass es irgendwie mit dem Export aus Blender zu tun hat.
Wäre es ein generelles Problem, sollte die Textur ja vermutlich überall nicht stimmten.

Gibt es da besondere "Einstellungen", die man beim Export beachten muss um eine vernünftige Darstellung in OpenGL zu erhalten oder bin ich komplett auf dem Holzweg!?

Grüße!


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 3D-Modell benutzen
BeitragVerfasst: Sa Okt 06, 2012 13:14 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Yeah!
Problem erkannt, Problem verbannt ;)

Auflösung:
Ich habe bemerkt, dass die Textur gar nicht mit dem übereinstimmt, was mir Blender anzeigt. Sprich die Koordinaten stimmten nicht wirklich, auch wenn es an den meisten stellen ein schlüssiges Bild ergab. Also habe ich die eingelesenen UV-Koordinaten anzeigen lassen und konnte diese als Fehlerquelle ausschließen.

Trotzdem war ja die Textur insgesamt irgendwo verschoben. Mit etwas rumprobieren konnte ich dann sehen, dass die Verschmierungen häuptsächlich an den Seams zu sehen sind. Ich fing an mich zu wundern, warum die Seams diese Verschmierungen verursachen.

Dann erkannte ich die tücken der OOP in meinem Problem :D

Die Faces verwenden gemeinsame Vertices an den Stellen an denen sie auf andere Faces treffen.
Und genau das habe ich auch getan, statt einen neues Objekt zu erzeugen habe ich das Objekt eben für mehrere Faces verwendet.
So werden die UV-Koordinaten überschrieben und stimmen eben nicht mehr:
Code:
  1. Point A = new Point(((Point)vertices[a]).getX(), ((Point)vertices[a]).getY(), ((Point)vertices[a]).getZ());
statt
Code:
  1. Point A = (Point)vertices[a]
löste dementsprechend das Problem

Grüße!

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 3D-Modell benutzen
BeitragVerfasst: Sa Okt 06, 2012 19:23 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Und wieder einmal zu früh gefreut, zumindest teilweise!

Die Verwaschungen sind weg, allerdings sitzen die Texturen nicht an den Stellen an denen sie sitzen sollen!

So sieht's in Blender aus:
Dateianhang:
BlenderTree.jpg
so will ich es auch haben!

Und das hier kommt in OpenGL raus:
Dateianhang:
OpenGLTree.jpg
doof ;)

Was ich bisher versucht habe:
Textur auf Potenz von 2 zu bringen. Kein Erfolg.
Und das wars auch schon :(

Woran kann das nun liegen?

Textur erzeugen:
Code:
  1.  
  2.                 Bitmap image = new Bitmap(fullPath);
  3.                 Gl.glEnable(Gl.GL_TEXTURE_2D);
  4.                 uint[] id = new uint[1];
  5.                 Gl.glGenTextures(1, id);
  6.                 BitmapData bitmapData = image.LockBits(new Rectangle(0, 0, image.Width, image.Height),
  7.                     ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
  8.                 Gl.glBindTexture(Gl.GL_TEXTURE_2D, id[0]);
  9.                 t.setTexID(id[0]);
  10.  
  11.                 Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, image.Width, image.Height, 0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
  12.  
  13.                 Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
  14.                 Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
  15.  
  16.                 image.UnlockBits(bitmapData);
  17.                 Gl.glDisable(Gl.GL_TEXTURE_2D);
  18.  


Textur nutzen:
Code:
  1.  
  2. Gl.glEnable(Gl.GL_TEXTURE_2D);
  3.  
  4.                     Gl.glShadeModel(Gl.GL_SMOOTH);
  5.  
  6.                     Gl.glBegin(Gl.GL_TRIANGLES);
  7.  
  8.                     for (int j = 0; j < t.getTriangleCount(); j++) {
  9.                         Triangle tri = t.getTriangle(j);
  10.                         Gl.glBindTexture(Gl.GL_TEXTURE_2D, textures.getTextureID(tri.getTexFile()));
  11.                         Point A = tri.getA();
  12.                         Point B = tri.getB();
  13.                         Point C = tri.getC();
  14.  
  15.                         Vector3d normal = A.getNormal();
  16.                         Gl.glNormal3d(normal.getX(), normal.getY(), normal.getZ());
  17.                         Gl.glTexCoord2d(A.getUV().getX(), A.getUV().getY());
  18.                         Gl.glVertex3d(A.getX(), A.getY(), A.getZ());
  19.                         normal = B.getNormal();
  20.                         Gl.glNormal3d(normal.getX(), normal.getY(), normal.getZ());
  21.                         Gl.glTexCoord2d(B.getUV().getX(), B.getUV().getY());
  22.                         Gl.glVertex3d(B.getX(), B.getY(), B.getZ());
  23.                         normal = C.getNormal();
  24.                         Gl.glNormal3d(normal.getX(), normal.getY(), normal.getZ());
  25.                         Gl.glTexCoord2d(C.getUV().getX(), C.getUV().getY());
  26.                         Gl.glVertex3d(C.getX(), C.getY(), C.getZ());
  27.                     }
  28.  
  29.                     Gl.glEnd();
  30.  
  31.                     Gl.glDisable(Gl.GL_TEXTURE_2D);
  32.  


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 3D-Modell benutzen
BeitragVerfasst: Sa Okt 06, 2012 21:52 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
2,5h später:

Code:
  1.  
  2. image.RotateFlip(RotateFlipType.RotateNoneFlipY);
  3.  

Nun läufts!

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 3D-Modell benutzen
BeitragVerfasst: Mi Okt 10, 2012 12:57 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
So dann, da ist er: mein erster Baum
Bzw. gleich mal 3 davon:
Dateianhang:
treewithleafes.jpg


Geladen mittels eigenem Loader. Das model wird geladen und kann dann an ein Object Tree angehängt werden, sodass ich für jeden Baum eigene Positionsangaben machen kann. Das erste mal für mich! Man ist dat aufregend :D

Aber ein paar Fragen habe ich dennoch:

Die Blätter sind mit png-texturen auf Quads erstellt und demnach muss ich OpenGL ja irgendwie sagen, was es mit den durchsichtigen Teilen der Textur zu machen hat.
Momentan mach ich das mittels:
Code:
  1. Gl.glEnable(Gl.GL_ALPHA_TEST);
  2. Gl.glAlphaFunc(Gl.GL_GREATER, 0.9f);
was ja auch funktioniert. Aber ist das der übliche Weg / Best Practice?

Grüße!


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 3D-Modell benutzen
BeitragVerfasst: Mi Okt 10, 2012 13:39 
Offline
DGL Member

Registriert: Mo Okt 01, 2012 13:21
Beiträge: 5
Programmiersprache: Delphi, Python
Das mit dem Alphatest ist schon richtig, das wird in so ziemlich allen Spielen so gemacht. Die Alternative wäre jedes Blatt einzeln aus Dreiecken zusammenzubauen, was aber aufgrund der hohen Anzahl nicht für Echtzeitanwendungen mit mehr als ein paar Bäumen nicht geeignet ist :wink:
Normalerweise malt man in die Blatt-Textur dann auch ein paar Zweige, und richtet die Quads dann so aus, das diese Zweige mit einem der Äste verbunden sind. Ist dann allerdings ein etwas erhöhter Aufwand beim erstellen der Bäume und muss für den Anfang nicht sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 3D-Modell benutzen
BeitragVerfasst: Mi Okt 17, 2012 15:50 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Zitat:
Normalerweise malt man in die Blatt-Textur dann auch ein paar Zweige, und richtet die Quads dann so aus, das diese Zweige mit einem der Äste verbunden sind. Ist dann allerdings ein etwas erhöhter Aufwand beim erstellen der Bäume und muss für den Anfang nicht sein.

Also so genau muss ich da glaub ich gar nicht sein. Ich möchte mich eh auf Strategie/Wirtschaftssimulation konzentrieren. Man sieht eh alles nur von oben und aus einer gewissen Entfernung und ich denke bei der Zahl an Bäumen/Gebäuden die unter Umständen auf dem Bildschirm zu sehen sein können, wäre vermutlich schnell die Lleistungsgrenze erreicht, wenn man es mit der Zahl der Polygone übertreibt.

Das Laden der Modelle klappt inzwischen sehr gut:
Dateianhang:
holzfaeller.jpg


Denke das reicht an Funktionalität und ich kann mich so langsam auf Logik konzentrieren.
Der Umgang mit den Modellen ist recht cool... ich hab keine Ahnung, was da gängige Praxis ist:
Code:
  1.  
  2.             PaintableObject t1 = new PaintableObject();
  3.             t1.setMove(new Vector3d(7, 0, 5));
  4.             t1.setParentPosition(new Vector3d(0, 0, 0));
  5.             t1.calcRealPosition();
  6.             t1.setModel(modelLoader.getModel("tree2010"));
  7.             t1.setRotation(80);
  8.             objects.addPaintableObject(t1);
  9.  


Grüße!


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 3D-Modell benutzen
BeitragVerfasst: Mi Okt 17, 2012 17:49 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Nur so am Rande, aktivier mal mipmaps (glGenerateMipmaps) für deine Texturen, macht alles gleich viel hübscher dann ;)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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


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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.031s | 17 Queries | GZIP : On ]