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

Aktuelle Zeit: Fr Jul 18, 2025 22:00

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Lighting richtig eingesetzt
BeitragVerfasst: Mi Jul 07, 2004 13:34 
Offline
DGL Member

Registriert: Di Jun 22, 2004 12:13
Beiträge: 46
Bisher gefällt mir das Licht nicht so richtig, es ist zu weich. Ich benutze die Standard-Einstellungen aus dem Licht-Tutorial. Wenn ich z.B. eine Kugel habe, dann sieht die richtig weich aus, gut, das sollte auch so sein. Aber weiter unten im Tutorial sind Objekte, die haben richtig scharfe Kanten in der Oberfläche. Praktisch hat da wohl jedes Face EINE Helligkeit und keine berechnete zwischen zwei Punkten wie Phong. Was muss ich einstellen, um auch diese scharfen Kanten zu haben? Das würde meinem Objekt viel mehr Tiefe geben...

Hier mein "langweiliges" Objekt...


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 07, 2004 13:44 
Offline
DGL Member

Registriert: So Jun 27, 2004 18:12
Beiträge: 7
Das Problem sind die Normalen.
Wenn du 2 Flächen hast die an den Kanten die selben Vertices verwenden dann nutzen logischerweisse auch die selben Normalen. Und diese sind meist nen Mittelwert aus den Normalen der 2 Flächen was das ganze rund aussehen lässt.
Ich würde die Modelle an der Kante teilen und danach wieder zusammenfügen so dass jede Fläche seine eigenen Vertices bekommt (sollte mit den meisten 3D Programmen funktionieren).

edit: hab mir das Bild nochmal genau angeguckt ... scheinbar hast du gar keine Normalen?? :?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 07, 2004 14:23 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 26, 2002 22:12
Beiträge: 259
Wohnort: Dresden
lazyCE hat Recht. Dein Objekt sieht so aus, als hättest es gar keine Normalen berechnet.
Der Grund dafür, dass das in dem Tutorial so gut klappt ist, dass dort Quadrics verwendet werden, für die die Normalen bereits berechnet wurden.
Du musst die Normalen für jedes Face oder besser jeden Vertex einzeln berechnen und diese dann anschließend mit glNormal* beim Rendern übergeben.

_________________
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: Mi Jul 07, 2004 15:47 
Offline
DGL Member

Registriert: Di Jun 22, 2004 12:13
Beiträge: 46
Ne, Normalen habe ich nicht berechnet, das obige Objekt besteht aus 127 Faces, also Dreiecke. Muss ich mal gucken wie ich das mit den Normalen machen muss, irgendwo gibts ja sicher ein Tutorial. Danke für den Tip!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 07, 2004 15:52 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Die Normale ist das Kreuzprodukt der beiden Vektoren, welche eine Ebene (hier deine Dreiecke) aufspannt.
Mehr Mathematische Sachen findest du im Scipt "CompGeo" (Links -> General -> CompGeo)
(ACHTUNG: Der normale Link is irgendwie falsch gepolt. Einfach die URL rauskopieren, die geht.)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 07, 2004 21:40 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
also deinem bild fehlen wirklich die normalen - berechnet werden die wie bereits gesagt mit dem kreuzprodukt, das steht aber auch in dem Tutorial: "Normalenberechnung per Dreieck".

Zitat:
Der Grund dafür, dass das in dem Tutorial so gut klappt ist, dass dort Quadrics verwendet werden, für die die Normalen bereits berechnet wurden.

Nope muss ich dich enttäuschen - ich war viel fauler: die sind in einem raytracer entstanden - war viel zu faul, das in OpenGl hinzuwurschteln, obwohl das in dem Fall auch kein Problem gewesen wäre, wie ich das ja oben drüber an Beispielen schön gezeigt hab - dort waren die kugeln aber imho handberechnet.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 16, 2004 10:12 
Offline
DGL Member

Registriert: Di Jun 22, 2004 12:13
Beiträge: 46
So, da bin ich auch malwieder nach längerer Pause... habe das eben mit den Normalen programmiert, es sieht schon besser aus, aber irgendwie scheint da was noch nicht zu stimmen, wie Ihr unten sehen könnt...

Hier mein Quelltext zur Normalenberechnung:

Code:
  1.  
  2. unit vectors;
  3.  
  4. interface
  5.  
  6. procedure calcNormals(ax:Single;ay:Single;az:Single;bx:Single;by:Single;bz:Single;cx:Single;cy:Single;cz:Single);
  7.  
  8. type
  9.   TVector = record x,y,z: Single; end;
  10.  
  11. var
  12.   v1,v2,nv: TVector;
  13.  
  14. implementation
  15.  
  16. function vec_scale(const v:TVector;const scale:single):TVector;
  17. begin
  18.   result.x:=v.x*scale;
  19.   result.y:=v.y*scale;
  20.   result.z:=v.z*scale;
  21. end;
  22.  
  23. function vec_normalize(const v:TVector):TVector;
  24. var l:single;
  25. begin
  26.   l:=sqrt(sqr(v.x)+sqr(v.y)+sqr(v.z));
  27.   vec_normalize:=vec_scale(v,1/l);
  28. end;
  29.  
  30. procedure calcNormals(ax:Single;ay:Single;az:Single;bx:Single;by:Single;bz:Single;cx:Single;cy:Single;cz:Single);
  31. begin
  32.   //Vektoren bilden
  33.   v1.x:=bx-ax; v1.y:=by-ay; v1.z:=bz-az;
  34.   v2.x:=cx-ax; v2.y:=cy-ay; v2.z:=cz-az;
  35.   //Kreuz-Produkt
  36.   nv.x:=(v1.y*v2.z)-(v1.z*v2.y);
  37.   nv.y:=(v1.z*v2.x)-(v1.x*v2.z);
  38.   nv.z:=(v1.x*v2.y)-(v1.y*v2.x);
  39.   //Normieren
  40.   vec_normalize(nv);
  41. end;
  42.  
  43. end.
  44.  


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 16, 2004 10:20 
Offline
DGL Member

Registriert: Di Jun 22, 2004 12:13
Beiträge: 46
Ich glaube ich kanns selbst beantworten... es liegt an der Position meines "A-Punktes im Dreieck". Ich könnte probieren die Normalen aus drei möglichen A-Punkten zu berechnen und dann den Durchschnitt bilden...


EDIT: Ach ist ja völliger Blödsinn... Normale ist Normale, da gibts keine Durchschnittswerte. Aber wie kann ich die Dreiecke angleichen? Bzw wo kommen diese ungleichen Beleuchtungen her?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 16, 2004 10:57 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ungleiche Beleuchtung trotz dass die Dreiecke auf der gleichen Fläche liegen :
Lass dir mal deine Normalen anzeigen, dann wird dir wohl auffallen dass, obwohl Dreiecke die gleiche Fläche bilden, deren Normale in eine andere Richtung zeigen. Das lässt sich vermeiden, in dem man bei allen Dreiecken die gleiche Eckpunkt-Windung benutzt. Du wirst wahrscheinlich mal gegen den Uhrzeigersinn und mal mit dem Uhrzeigersinn nutzen.

Normalenberechung :
Besonders bei komplexeren Formen wird die Sache mit der Normalenberechnung, sofern man denn korrekte Normalen will, sehr biestig. Für Rundungen muss man diese nämlich über den Mesh (bzw. den gerundeten Teil) interpolieren, um diese Rundungen auch via passenden Normalen in der Beleuchtung sehen zu können. Abert bei Objekten wie z.B. Boxen ist das dann natürlich wiederrum inkorrekt, denn dort braucht man scharfe Normalen um die Seiten voneinander abzutrennen. Wenn du es also wirklich korrekt machen willst, dann musst du ermitteln in welchem Winkel die Normalen zueinander stehen und diese nur dann über mehrere Eckpunkte addieren (und normalisieren), wenn dieser Winkel unter einem bestimmten Wert liegt. Bei einer Box hat man dann ja im Endeffekt zwischen den Normalen der Seiten einen Winkel von 90°, während dieser bei weichen Rundungen sehr viel geringer liegt.
Alles in allem ist die Normalenberechnung also alles andere als trivial. Wenn du dein Objekt in einem 3D-Modeller erstellst, wäre es ratsam wenn du diesem auch den Export der Normalen überlässt (bei 3DS-MAX z.B. über das MAXScript), denn die haben ja meist optimierte Algorithmen um korrekte Normalen zu berechnen.

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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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