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

Aktuelle Zeit: Sa Jul 19, 2025 20:48

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



Ein neues Thema erstellen Auf das Thema antworten  [ 29 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Licht, 3ds & Normalen
BeitragVerfasst: So Okt 09, 2005 11:41 
Offline
DGL Member

Registriert: Mi Jul 20, 2005 18:43
Beiträge: 30
Hallo,

Und wieder tut sich ein neues Problem auf. Das Licht wird nicht richtig "angezeigt" auf meinen Modelen. Aber diesmal bin ich wohl nicht der einzige der dieses Problem zu haben scheint:

http://www.delphigl.com/forum/viewtopic.php?t=4315&highlight=normalen+3ds

Allerdings hab ich in diesem Thread keine Antwort gefunden , bzw. nur gelesen habe das es sehr schwierig ist eigene (richtige) Normalen für ein 3DS Model zu berechnen.

Deswegen ein paar Fragen
1.) Flash, wie hast du dein Problem gelöst? - Hast du es überhaupt gelöst?
2.) Gibt es noch ein anderen 3DS Loader der eventuell die Normalen etwas besser berechnet?

Und wenn ich das mit den 3DS Dateien nicht hinbekomme, dann muss ich wohl oder übel auf ein anderes Format umsteigen.
3.) Welches Format ist geeignet für Schachfiguren (starre Objekte)?
4.) Gibt es einen Konverter vom 3ds Format zu diesem Format?
5.) Wie ist ein einfaches Format aufgebaut? - Was muss man beachten wenn man selbst ein Format entwickeln will?

Ich hoffe jemand von euch weiß hier Rat.

PS: Um mein Problem zu verdeutlichen hab ich mal eine kleine Grafik angehängt die links den Bauern in 3ds Max zeigt und rechts in meinem Programm.

MFG
Maximus


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 09, 2005 12:21 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 26, 2002 22:12
Beiträge: 259
Wohnort: Dresden
So schwer ist es gar nicht, die Normalen zu berechnen. Wie Lars in dem Thread auf den du verlinkt hast bereits richtig meinte benötigt man gar keine Smootinggroups dafür.
Berechne einfach die Normale für jedes Face, weise sie den Punkten des Faces zu und bilde anschließend den Mittelwert, wenn der Winkel zwischen den Faces einen bestimmten Grenzwinkel nicht überschreitet. Ich persönlich nutze in der Regel einen Winkel von 30° als Grenzwert und das ganze funktioniert sehr gut. Du kannst ja etwas mit dem Grenzwert herumprobieren um einen optimalen Wert zu finden.

_________________
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 09, 2005 13:28 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Zum Thema Konvertieren: Ansich gibt es Konverter, wie Sand an Meer, seien es eigenständige Programme, Scripts oder aber Plugins...
Ich würde dir Blender empfehlen...
Erst 3DS importieren, dann beliebiges anderes Format exportieren.
Habe keine Erfahrung mit 3D Studio Max (da ich es mir nicht leisten kann und ich wage arg zu bezweifeln, dass die meisten hier es können, aber egal...), aber der hat doch bestimmt auch eine Exportiertfunktion, oder?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 09, 2005 15:28 
Offline
DGL Member

Registriert: Mi Jul 20, 2005 18:43
Beiträge: 30
Jetzt fängsts an spaßig zu werden. Bisher hab ich gehofft mich mit meinen sehr Oberflächlichen OpenGL Kenntnissen durchmogeln zu können, aber ab diesem Punkt scheint dies nicht mehr zu funktionieren.

Zu dem Berechnen der Normalen per Face:

Hab ich es so richtig Verstanden? - z.B. liegen 2 Dreiecke nebeneinander und bilden ein Quadrat. Jetzt berechne ich die Normale für Dreieck 1 und Dreieck 2, bilde den Mittelwert von beiden Normalen und überschreib die Normalen mit dem Mittelwert?

MFG
Maximus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 09, 2005 15:50 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wie man Normalen berechnet findest du im Wiki. (http://wiki.delphigl.com/index.php/Normale)
Du berechnest zuerst deine Normalen und setzt die dann mittels glNormal, dann zeichnest du deine beiden 3Ecke und dann berechnest du die Normalen für die nächsten Dreiecke usw.

Ich hab das selber aber noch net gemacht...Mir war das dann bisl egal... ;)

Noeska ist in letzter Zeit seeeehr ruhig... Sein 3DS Loader bedürfte wirklich mal wieder einem Update. Bones und so Zeugs is mir ziemlich egal, solange wenigstens(;)) die Normalen richtig funktionieren.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 09, 2005 19:38 
Offline
DGL Member

Registriert: Mi Jul 20, 2005 18:43
Beiträge: 30
Ist das kompliziert mit den Normalen.
So wenn ich jetzt die Normale über Punkt[0] des Dreiecks durch das Kreuzprodukt von Vektor1 und Vektor2 hab, dann ist das doch die Normale für das komplette Dreieck (also nicht nur für Punkt[0] soner auch für P[1] und P[2]), oder?

Nicht nur, dass das obere mir immer noch nicht klar ist, sondern ich rätsel auch noch wie ich den Winkel zwischen dem aktuellen Dreieck und dem nächsten herausfinde ...

(Zum Glück gibts bisher ein Erfolg, Ich hab die Render Procedure von der Klasse T3dsMesh gefunden ;) )

MFG
Maximus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 09, 2005 19:58 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Wenn du ein Dreieck a,b,c hast, dann ist die Flächen-Normale für das Dreieck:
normalize((a-c) x (b-c))

An den Eckenpunkten treffen sich im Normalfall mehrere Flächen und die Punkte der angrenzenden Flächen Dreiecke liegen auf einer Stelle. Wenn die Normalen dieser Flächen nicht zu weit auseinander liegen, dann kann man allen diesen Punkten die schon auf einer Stelle liegen den Mittelwert aller Flächennormalen als Normale geben. Man kann diese Eckpunkte mit gemeinsamen Normalen fürs Rendering dann auch zu einem Punkt zusammenfassen. Bei runden Stellen bekommt man dann einen weichen Verlauf. Wenn die Flächen aber wie z.B. beim Würfel weit auseinander liegen, dann kann man die Flächen-Normalen nicht zusammenfassen. Ein Würfel hat 12 Dreiecke und jedes Dreieck hat drei Punkte die nur zu diesem Dreieck gehören. Mit 8 Punkten würde man nicht auskommen.
Beim Modellieren muß man aufpassen, dass man genügend Punkte erstellt. Der Standard Würfel in Cinema4D hat nämlich nur 8 Punkte. Daher muß man entweder in Cinema4D bei solchen Objekten mit dem Befehl "Flächen ablösen" einzelne Punkte erstellen oder beim Laden des Modells an den harten Kanten neue Punkte erstellen.
Am einfachsten ist es wenn man direkt im Modellierungsprogramm harte Ecken dadurch erzeugt, dass die sich die angrenzenden Flächen die Punkte nicht teilen und weiche Ecken mit gemeinsamen Punkten erstellt. Dann braucht man beim Laden nur noch die Flächennormalen mitteln.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 17:04 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
wie berechnet ihr den den Mittelwert der Normalen genau?
Ich arbeite momentan an einem Poylgonnetz und da möchte ich auch für jeden Vertex einen Normalenvektor. Nur mit dem "Mittelwert" hats noch nicht recht geklappt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 17:14 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Nun ja, es geht wohl um den "aritmetrischen" Mittelwert, also das gleiche, wie wenn du deine Note ausrechnest:
Zwei Einser und ein Dreier machen (2*1 + 1*3)/3 = 1,67
Hier mit den Normalen geht das so, dass du ein Netz von Flächen hast. Vereinfacht gehen wir mal von Vierecken aus. Also grenzen an jedes Vertex vier Flächen. Du rechnest folglich für jede Fläche den Normalenvektor aus und bildest dann für jede Komponente (also x, y, z der Normale) einzeln den Mittelwert. Das ist dann der Mittelwert der vier Flächennormalen.
Das Problem bei vielen Implementationen ist nun, dass man oft nicht weis, welche Flächen an ein Quad grenzen. Dass muss man aber natürlich erst herausfinden, ich würde dazu bei deinem Programmstart einmal durch alle Vertexe gehen und die angrenzenden Flächen suchen, die Normalen berechnen und abspeichern, sparst du viel Berechnugszeit.

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 17:36 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Mal ne andere Frage: hat wer ein kleines Beispielprogramm, wo mal ein Parallelleuchter drinnen ist der schräg leuchtet und das ein Objekt auch nur von der Seite angeleuchtet ist? Es will nicht klappen bei mir. Und langsam weis ich auch net worans scheitert ... . Entweder ist es dunkel, oder Licht ist, aber wenn ich die Kamera beweg, dann habe ich auf allen Seiten das Licht, so als würde die Lichtquelle mitgehen. Habe zwar wie im Tut beschrieben da die stelle die Lichtdefinition gesetzt für stationiäres Licht, aber irgendwas ist immer noch falsch bei mir.

Wie gesagt ein kleines Beispiel würde mir helfen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 18:09 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Standardmäßig beleuchtet OpenGL Vorder und Rückseiten von Flächen immer gleich. Kann man glaub ich ausschalten.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 18:12 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
das mein ich nicht

stell dir einen Zylinder um die z-Achse vor, Normalenvektoren zeigen alle nach außen von der z-Achse weg. Ich habe ein Parallelstrahler der schräg ist. NUn drehe ich mich um die z-Achse, also um den Zylinder, irgendwann müsste ich ja mal die Rückseite erreichen wo es dunkler ist. passiert aber nicht. das licht "geht dauernd mit"[/quote]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 18:23 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Aktivier mal GL_LIGHT_MODEL_LOCAL_VIEWER (siehe http://wiki.delphigl.com/index.php/GlLi ... CAL_VIEWER)

Mal sehn obs dadurch besser wird.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 18:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Ja, das ist ein altbekanntes Verständnisproblem. Ich habe das so gelöst:
(teilweise Pseudocode)
Code:
  1.  
  2. var
  3. light_position    : Array[0..3] of GLfloat = (0, 0, 0, 1);
  4. begin
  5.  
  6. glTrans/scale/Rot....; //allgemeine Matrixoperationen
  7.  
  8. glPushMatrix;
  9.  glTrans/Rot....; //Verschieben/Rotieren der Lichtquelle
  10.  
  11.  //Das muss glaub ich alles rein
  12.  glMaterialfv(GL_FRONT, GL_SPECULAR, @material_specular[0]);
  13.  glMaterialfv(GL_FRONT, GL_SHININESS, @material_shininess[0]);
  14.  glMaterialfv(GL_FRONT, GL_AMBIENT, @material_ambient[0]);
  15.  glMaterialfv(GL_FRONT, GL_DIFFUSE, @material_diffuse[0]);
  16.  
  17.  glLightfv(GL_LIGHT0, GL_POSITION, @light_position[0]);
  18.  glLightfv(GL_LIGHT0, GL_AMBIENT, @light_ambient[0]);
  19.  glLightfv(GL_LIGHT0, GL_DIFFUSE, @light_diffuse[0]);
  20.  glLightfv(GL_LIGHT0, GL_SPECULAR, @light_specular[0]);
  21. glPopMatrix;
  22.  
  23. glTrans/scale/Rot....; //Matrixoperationen für den Betrachter    <----!!!!!!!!!!!!!!
  24. end;
  25.  

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 18:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
am Local Viewer liegts nicht


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 30 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 14 Queries | GZIP : On ]