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

Aktuelle Zeit: Di Jul 15, 2025 23:28

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 21, 2003 05:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 18:50
Beiträge: 92
Hiho ich hab mir ne eigene Importunit geschrieben, die ASE und ASC - Dateien in ein Array einliest, wobei Array[0] immer die Anzahl der Vertices ist. Als ich versucht habe, das zu Rendern, kam leider alles andere als das gewünschte Objekt raus. Also hab ich das ganze anstatt mit GL_TRIANGLE_STRIP mal mit GL_LINE_LOOP zeichnen lassen, und hab festgestellt, dass nur die einzelnen Vertex gespeichert werden, aber keine "Normalen" wie z.B. Dreiecke. Mein Prob ist, den Zusammenhang zwischen den einzelnen Vertexdaten zu finden, denn mit GL_LINE_LOOP Objekte zu zeichnen hat wenig Zweck :P Ich hab mir zwar schon 2 Tuts zum Thema gezogen, doch ich blick bei dem Haufen Chaos im Quellcode nicht durch ... kann mir da einer weiterhelfen ?

_________________
http://www.onkeltorty.net
http://sourceforge.net/projects/simpleassembler


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 21, 2003 10:32 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ich hoffe mal dir ist bewusst, dass z.B. das ASE-Format für jedes geometrische Objekt zuerst eine Vertexliste speichert (*MESH_VERTEX_LIST) und dann eine Facelist (*MESH_FACE_LIST) die die Indizes für die von jedem Face (ein Face entspricht übrigens einem Dreieck) genutzten Vertexe ablegt.

Wenn du also folgende Vertexliste für dein geometrisches Objekt hast :
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre>*MESH_VERTEX_LIST {
*MESH_VERTEX <span class='integer'>0</span> -<span class='integer'>20</span> -<span class='integer'>50</span> -<span class='integer'>16</span>
*MESH_VERTEX <span class='integer'>1</span> <span class='integer'>15</span> -<span class='integer'>50</span> -<span class='integer'>16</span>
*MESH_VERTEX <span class='integer'>2</span> -<span class='integer'>20</span> -<span class='integer'>50</span> <span class='integer'>18</span>
*MESH_VERTEX <span class='integer'>3</span> <span class='integer'>15</span> -<span class='integer'>50</span> <span class='integer'>18</span>
}</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->

Und dazu folgende Faceliste :
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre> *MESH_FACE_LIST {
*MESH_FACE <span class='integer'>0</span>: A: <span class='integer'>0</span> B: <span class='integer'>1</span> C: <span class='integer'>3</span> AB: <span class='integer'>1</span> BC: <span class='integer'>1</span> CA: <span class='integer'>0</span> *MESH_SMOOTHING <span class='integer'>4</span> *MESH_MTLID <span class='integer'>4</span>
}</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->

Dann besteht dein erstes Face (Dreieck) aus folgenden Vertexen :
Vertex0(-20/-50/-16)->Vertex1(15,-50,-16)->Vertex3(15,-50,18)

Hoffe mal das hilft dir weiter.Das speichern einer "unsortieren" Vertexliste" mit folgenden Vertexindizes ist ein sehr häufig genutztes Konzept.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 21, 2003 15:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 18:50
Beiträge: 92
Ah das bringt sehr viel Licht ins Dunkel ... ich muss erstmal meine Importunit erweitern ...

Danke für die Hilfe

_________________
http://www.onkeltorty.net
http://sourceforge.net/projects/simpleassembler


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 21, 2003 16:07 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 18:50
Beiträge: 92
Eine Frage hab ich noch ....
Erstmal ein kurzer Ausschnitt aus einer ASC - Datei :
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre>Tri-mesh, Vertices: <span class='integer'>290</span> Faces: <span class='integer'>512</span>
Vertex list:
Vertex <span class='integer'>0</span>: X:<span class='integer'>0.0000</span> Y:<span class='integer'>0.0000</span> Z:<span class='integer'>0.0000</span>
Vertex <span class='integer'>1</span>: X:<span class='integer'>0.0000</span> Y:<span class='integer'>0.3830</span> Z:<span class='integer'>0.0000</span>
Vertex <span class='integer'>2</span>: X:<span class='integer'>0.5147</span> Y:<span class='integer'>0.2780</span> Z:<span class='integer'>0.2038</span>
Vertex <span class='integer'>3</span>: X:<span class='integer'>0.0000</span> Y:<span class='integer'>0.6650</span> Z:<span class='integer'>0.0000</span>
Vertex <span class='integer'>4</span>: X:<span class='integer'>0.5075</span> Y:<span class='integer'>0.5935</span> Z:<span class='integer'>0.2071</span>
Vertex <span class='integer'>5</span>: X:<span class='integer'>0.7285</span> Y:<span class='integer'>0.5717</span> Z:<span class='integer'>0.4708</span>
Vertex <span class='integer'>6</span>: X:<span class='integer'>0.0000</span> Y:<span class='integer'>1.2450</span> Z:<span class='integer'>0.0000</span>
[...]
Vertex <span class='integer'>286</span>: X:<span class='integer'>3.3992</span> Y:<span class='integer'>1.6487</span> Z:<span class='integer'>0.2477</span>
Vertex <span class='integer'>287</span>: X:<span class='integer'>3.0406</span> Y:<span class='integer'>1.6733</span> Z:<span class='integer'>0.3209</span>
Vertex <span class='integer'>288</span>: X:<span class='integer'>3.3661</span> Y:<span class='integer'>2.0187</span> Z:<span class='integer'>0.3372</span>
Vertex <span class='integer'>289</span>: X:<span class='integer'>5.0000</span> Y:<span class='integer'>2.1390</span> Z:<span class='integer'>0.0000</span>
Face list:
Face <span class='integer'>0</span>: A:<span class='integer'>2</span> B:<span class='integer'>1</span> C:<span class='integer'>0</span> AB:<span class='integer'>1</span> BC:<span class='integer'>1</span> CA:<span class='integer'>1</span>
Material: "Material #1"
Smoothing: <span class='integer'>2</span>
Face <span class='integer'>1</span>: A:<span class='integer'>1</span> B:<span class='integer'>4</span> C:<span class='integer'>3</span> AB:<span class='integer'>1</span> BC:<span class='integer'>1</span> CA:<span class='integer'>1</span>
Material: "Material #1"
Smoothing: <span class='integer'>2</span>
</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->
Also mir leuchtet ein, was Vertices und Faces sind. Ich frag mich nur noch, was in der Face List AB, BC, CA ist. Und was bedeutet "Smoothing : 2" ? Bezieht sich das auf Antialising ? (Der Leie ist der Meinung, das AB, BC und CA eine Erweiterung vom Dreieck zum Polygon ist. Andererseits beschreibt es die typischen Dreieckspunkte ...)

_________________
http://www.onkeltorty.net
http://sourceforge.net/projects/simpleassembler


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 21, 2003 16:32 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
AB, BC und CA sind Flags für die Kantensichtbarkeit (0=Kante nicht sichtbar, 1=Kante sichtbar).Und Smoothing hat nichts mit Antiaaliasing zu tun, sondern gibt die Smoothing-Gruppe an, zu der das Face gehört.Was genau das ist kann ich auch nicht sagen, aber AFAIK dienen Smoothinggruppen dazu die Beleuchtung eines Objektes "weicher" zu machen, und werden wohl zur Normaleninterpolation genutzt.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 21, 2003 16:42 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Beim Berechnen der Beleuchtung werden ja die Normalen eines Punktes aus den umliegenden Dreiecken gewonnen. Dabei werden aber immer nur solche Dreiecke berücksichtigt, die in der gleichen Smoothing Group liegen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 21, 2003 16:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 18:50
Beiträge: 92
Oki das ist mir aber noch zu starker Tobak ... (wenn ich mal die Vertexdaten von nem Teapot aus dem Kopf raus eingeben kann dann beschäftige ich mich damit wieder :lol: )

Danke für die Hilfe :D

_________________
http://www.onkeltorty.net
http://sourceforge.net/projects/simpleassembler


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 21, 2003 19:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 18:50
Beiträge: 92
Also mit "kleineren" Objekten klappt es wunderbar ... nur wenns dickere Dinger werden, dann gehts leider in die Hose. Hier mal paar Objekte, die ich aus ner ASC - Datei eingelesen habe :

Ein Würfel :
Bild

Ein flacher Zylinder :
Bild

Ein Rohr :
Bild

Und ab jetzt gehen die Probleme los ...

Eine Kugel :
Bild

Und der gute, alte Teapot :
Bild

Ich komm leider nicht drauf, woran das liegt. Ich mache folgendes :
1.) Die Anzahl der Vertices einlesen
2.) Die Anzahl der Faces einlesen
3.) Dynamisches Array dimensionieren : ascfile_array[0..Anzahl Vertices,0..2]
4.) Dynamisches Array dimensionieren : ascfile_indicies[0..Anzahl Faces,0..2]
5.) Vertexdaten und Face - Indicies in die jeweiligen DynArrays einlesen
6.) Mit folgender Renderloop rendern :
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre> //Culling ausschalten
glDisable(GL_CULL_FACE);
glClear(GL_DEPTH_BUFFER_BIT <span class='reserved'>or</span> GL_COLOR_BUFFER_BIT);
glLoadIdentity;
glTranslatef(-<span class='integer'>2</span>, -<span class='integer'>2</span>, - <span class='integer'>20</span>);
glRotatef(winkel,<span class='integer'>1</span>,<span class='integer'>1</span>,<span class='integer'>1</span>);
//glColor3f(<span class='integer'>0.6</span>,<span class='integer'>1</span>,<span class='integer'>0.6</span>);
glColor3f(<span class='integer'>1</span>,<span class='integer'>1</span>,<span class='integer'>1</span>);
<span class='reserved'>if</span> <span class='reserved'>not</span> glisEnabled(GL_TEXTURE_2D) <span class='reserved'>then</span> glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,mappe.texnummer[<span class='integer'>3</span>]);
glTexGeni(GL_S,GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGeni(GL_T,GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
<span class='reserved'>for</span> i:=low(ascfile_indicies) <span class='reserved'>to</span> high(ascfile_indicies) <span class='reserved'>do</span> //von erstem Face zum letzten
<span class='reserved'>begin</span>
glBegin(GL_LINE_LOOP);
//glBegin(GL_TRIANGLES);
glVertex3f(ascfile_<span class='reserved'>array</span>[ascfile_indicies[i,<span class='integer'>0</span>],<span class='integer'>0</span>],
ascfile_<span class='reserved'>array</span>[ascfile_indicies[i,<span class='integer'>0</span>],<span class='integer'>1</span>],
ascfile_<span class='reserved'>array</span>[ascfile_indicies[i,<span class='integer'>0</span>],<span class='integer'>2</span>]);
glVertex3f(ascfile_<span class='reserved'>array</span>[ascfile_indicies[i,<span class='integer'>1</span>],<span class='integer'>0</span>],
ascfile_<span class='reserved'>array</span>[ascfile_indicies[i,<span class='integer'>1</span>],<span class='integer'>1</span>],
ascfile_<span class='reserved'>array</span>[ascfile_indicies[i,<span class='integer'>1</span>],<span class='integer'>2</span>]);
glVertex3f(ascfile_<span class='reserved'>array</span>[ascfile_indicies[i,<span class='integer'>2</span>],<span class='integer'>0</span>],
ascfile_<span class='reserved'>array</span>[ascfile_indicies[i,<span class='integer'>2</span>],<span class='integer'>1</span>],
ascfile_<span class='reserved'>array</span>[ascfile_indicies[i,<span class='integer'>2</span>],<span class='integer'>2</span>]);
glEnd;
<span class='reserved'>end</span>;
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
//Culling einschalten
glEnable(GL_CULL_FACE);
</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->
Kann mir von euch jemand aus der Sch... :o helfen ?

_________________
http://www.onkeltorty.net
http://sourceforge.net/projects/simpleassembler


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 21, 2003 19:32 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ich glaub weniger das dein Problem in deinem Renderloop liegt, sondern eher beim Einlesen der Daten.Es wär also am besten, wenn du deinen ASC-Loader inklusive Quellcode und den von dir oben gezeigten Objekten mal hochladen könntest, wodurch die Fehlersuche stark erleichtert würde.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 21, 2003 20:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 18:50
Beiträge: 92
Oki also den ASC - Loader kann man <a href='http://www.onkeltortysfiles.de/sectionsdata.pas' target='_blank'>hier</a> downloaden ... nur die Objekte hab ich gelöscht. Ich hab sie einmal aus Caligari True Space 4 exportiert und einmal beim Nachbarn aus 3DStudio Max R2.5 ... (Man kann bei beiden als Exportfunktion nur die Anzahl der Nachkommastellen angeben, also ich denke, dass der Fehler nicht im Objektexport liegt ...)

(Nachtrag :)
Also ich habe beim Nachbarn nochmal die Teekanne exportiert und man kann sie <a href='http://www.onkeltortysfiles.de/section5.asc' target='_blank'>hier</a> downloaden. Als ich sie mir nochmal angesehen habe, ist mir etwas in den Sinn geschossen : das Vorzeichen ... ich habe in meinem ASC - Loader nicht auf Vorzeichen geprüft ... kann es sein, dass das die Fehlerquelle ist ? (Muss morgen früh fort, sonst würde ich selbst nochmal nachforschen ...)

_________________
http://www.onkeltorty.net
http://sourceforge.net/projects/simpleassembler


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 21, 2003 22:21 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Alzheimer hat geschrieben:
Nachtrag :
Also ich habe beim Nachbarn nochmal die Teekanne exportiert und man kann sie <a href='http://www.onkeltortysfiles.de/section5.asc' target='_blank'>hier</a> downloaden. Als ich sie mir nochmal angesehen habe, ist mir etwas in den Sinn geschossen : das Vorzeichen ... ich habe in meinem ASC - Loader nicht auf Vorzeichen geprüft ... kann es sein, dass das die Fehlerquelle ist ? (Muss morgen früh fort, sonst würde ich selbst nochmal nachforschen ...)

Wenn du die Vorzeichen nicht prüfst, kanns natürlich daran liegen das bestimmte Objekte nicht korrekt dargestellt werden.Ändere deinen ASC-Loader mal dahingehend ab, das er diese interpretiert und sag bescheid obs dann geht.
Wenn nicht, dann schau ich mir morgen mal den Loadersource genauer an.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 22, 2003 05:34 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 18:50
Beiträge: 92
Also ich hab die Vertex- und Face-Arrays überwachen lassen und es lag nicht am Vorzeichen, da positive als auch negative Werte im Vertex-Array enthalten sind ... Nächste Möglichkeit ist jetzt nur noch, dass an den Face - Arrays was nicht stimmt ...

_________________
http://www.onkeltorty.net
http://sourceforge.net/projects/simpleassembler


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 22, 2003 09:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
So, hab mich mal durch deinen Code gewühlt und bin mir sicher den Fehler gefunden zu haben.Zu Testzwecken hab ich mir mal die von dir für das letzte Face des Teapots (Nr.1023) eingelesenen Indizes ausgeben lassen, und dabei kam A:46/B:52/C:52.Richtig wäre allerdings A:469/B:529/C:528 gewesen.
Daraufhin hab ich mal schnell in deinen Parser geschaut, und sofort gesehen das du immer nur zwei Stellen für die Indizes des Faces einliest, was natürlich falsch ist, da die ja auch >100 sein können.Siehe dazu folgende Zeile :
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre>ascfile_indicies[merker_<span class='reserved'>array</span>,<span class='integer'>0</span>]:=strtoint((trim(copy(eingelesen,pos('a:',eingelesen)+<span class='integer'>2</span>,<span class='integer'>2</span>))))</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->
Du musst also zuerst schauen wo in der Zeile z.B. 'a:' steht, und dann auch gucken wo 'b:' steht.Alles was dazwischen liegt stellt dann das entsprechende Indize dar.Einfach blind 2 Stellen einzulesen ist ja falsch, weshalb z.B. Objekte mit über 100 Indizes bei dir nicht gefunzt haben.Änder das mal wie eben gesagt so ab, das der komplette Teil zwischen z.B. 'a:'...'b:' als Indize interpretiert wird, und auch große Objekte sollten korrekt dargestellt werden.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jul 22, 2003 12:33 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Wären sicherlich nicht abgeneigt. Insgesamt werden wir sicherlich für jeden Loader dankbar sein und auch versuchen in Zukunft einige Vereinheitlicht zur Verfügung zu stellen. Also bitte keine falsche Schüchternheit bei solchen Dingen, imma her damit. (Und wer nur Fragen hat, es zeigen will und nicht sofort veröffentlichen will, kann es auch gerne uns zusenden!)

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 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.009s | 15 Queries | GZIP : On ]