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

Aktuelle Zeit: Fr Jul 18, 2025 08:18

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: glNormal3F.. was bewirkt es ?
BeitragVerfasst: Mi Jul 30, 2008 18:41 
Offline
DGL Member

Registriert: Mo Jun 30, 2008 12:47
Beiträge: 69
Ich hab das in DGL-Wiki durchgelesen aber nichts verstanden !
Was macht diese Funktion denn genau ???

Wäre nett, wenn ich paar Antworten kriege würde

MfG

_________________
...GOD is wearing black...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 30, 2008 20:10 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Hallo,

die Funktion gibt die Normale eines Polygons an. Die steht normalerweise immer (es sei denn, man will das gezielt manipulieren) senkrecht auf der Fläche. Normalerweise sollte die dann auch noch normalisiert sein. Mit einem gewinnsen Performanceverlust kann man aber auch glEnable(GL_NORMALIZE) anmachen.

Die Normale wird für die Lichtberechnung gebraucht, lässt du dabei die Normalen weg, können komische Ergebnisse herauskommen.

Markus

Edit: Falls du den Artikel noch nicht gelesen hast, da steht eigentlich alles drinne: http://wiki.delphigl.com/index.php/Normalen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 30, 2008 20:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wir sind immer nett. Meistens jedenfalls. ;)

Und zum Verstehen musst du mal schauen wie OpenGL die Flächen sieht. Nämlich nur als einzelne Dreiecke ohne einen zusammenhang. Es weiß nicht ob das Dreieck zu einer geraden Fläche oder zu einer Rundung gehört. Und genau dazu sind die Normalen da. Die geben an in welche Richtung das Vertex zeigt. Die Normalen einer Fläche müssen nicht gleich sein.

Normalen sind aber nur wichtig für die veraltete OpenGL Beleuchtung und evtl. zur Berechnung in einem Shader. Wobei aktuell weit verbreitet sind Normal maps. Dabei wird in den Kanälen Rot, Grün und Blau die Normale kodiert. Das ganze als Textur über eine Fläche gelegt und sie kann innerhalb eines Dreieckes normalentechnisch einen Huckel haben.

[edit] Ah. Zu langsam. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 30, 2008 23:15 
Offline
DGL Member

Registriert: Mo Jun 30, 2008 12:47
Beiträge: 69
könnt ihr mir das anhand eines bsp.es erklären `?
vlt verstehe ich es dann besser

_________________
...GOD is wearing black...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 30, 2008 23:44 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Les dir mal durch, wie OpenGL die Beleuchtung berechnet:
http://wiki.delphigl.com/index.php/Beleuchtung
Das dürfte einiges klären. :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 31, 2008 09:04 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Hallo,

ich hab hier mal ein Bild gefunden, anhand dem man das alles gut erkennen kann.

http://de.wikipedia.org/wiki/Bild:Normalenvektor.png


Wie man sieht stehen die Normalen senkrecht auf den einzelnen Teilflächen. Im Tutorial Lineare Algebra wird gezeigt, wie man eine solche Normale berechnet.

Code:
  1. function GetNormal(Triangle : TTriangle) : TVector;
  2. var
  3.   VectorA, VectorB, Normal : TVector;
  4. begin
  5.    VectorA := SubVectors(Triangle[0],Triangle[1]);
  6.    VectorB := SubVectors(Triangle[1],Triangle[2]);
  7.    Normal := CrossProduct(VectorA,VectorB);
  8.    Normalize(Normal);
  9.    result := Normal;
  10. end;
  11.  
  12.  


Der Code berechnet zuerst VectorA und VectorB, um eine Ebene zu definieren, zu der man die Normale finden muss.
Dazu muss man erstmal zwei Vektoren im Dreieck anhand der Eckpunkte berechnen.
VectorA ist dann der Vektor von Triangle[1] nach Triangle[0].
VectorB ist der von [2] nach [1].

Das kann man sich an diesem Bild veranschaulichen:

Bild

VectorA und VectorB (blau und rot) sind hier links nochmal vom gleichen Punkt aus gezeichnet. Jetzt sollte man sich die Ebene vorstellen können, welche die beiden Vektoren aufspannen.

Zu dieser Ebene bekommt man die Senkrechte mit dem Kreuzprodukt:

Code:
  1.  
  2. function CrossProduct(VectorA,VectorB : TVector) : TVector;
  3. begin
  4.    Result.X := VectorA.Y*VectorB.Z - VectorA.Z*VectorB.Y;
  5.    Result.Y := VectorA.Z*VectorB.X - VectorA.X*VectorB.Z;
  6.    Result.Z := VectorA.X*VectorB.Y - VectorA.Y*VectorB.X;
  7. end;
  8.  


Das Kreuzprodukt zu erklären würde hier aber ein bisschen zu weit führen. Im obigen Code wird der Vektor dann nochmal Normalisiert, um ihn auf die Länge von 1LE zu bekommen, indem man die einzelnen Komponenten durch die Länge des Vektors teilt:

Code:
  1.  
  2. procedure Normalize(var Normal : TVector);
  3. var
  4.   Length : Single;
  5. begin
  6.   Length := Magnitude(Normal);
  7.   if (Length = 0) then Length := 1; //Wir wollen keine Division durch 0
  8.   Normal.X := Normal.X / Length;
  9.   Normal.Y := Normal.Y / Length;
  10.   Normal.Z := Normal.Z / Length;
  11. end;
  12.  


Die Länge bekommt man durch den Satz des Pythagoras:

Code:
  1.  
  2. function Magnitude(Vector : TVector) : Single;
  3. begin
  4.    result := sqrt(Vector.X * Vector.X+
  5.                   Vector.Y * Vector.Y+
  6.                   Vector.Z * Vector.Z);
  7. end;
  8.  


Ich hoffe mein Beitrag konnte das ein bisschen veranschaulichen.

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 31, 2008 10:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Habe die direkte Verlinkung des Bildes mal entfernt, da es erstens reichlich groß ist. Und ich zweitens nicht weiß ob es so gerne gesehen wird oder rechtlich sogar etwas zweifelhaft ist, wenn man Bilder direkt verlinkt. So ganz ohne Copyright etc. Außerdem wäre es nur fair, wenn derjenige für seine Arbeit auch genannt wird. (und traffic von Wikipedia natürlich)

Aber noch eine Anmerkung: Die passt bei dem Bild auch ganz gut. Die Normalen kleben nicht an der Fläche! Auch wenn sie immer in der Mitte der Fläche dargestellt werden. Die Normalen kleben an den Eckpunkten einer Fläche. OpenGL sieht dieses Objekt nicht als ganzes sondern nur als einzelne Dreiecke. Damit weiß OpenGL nicht welche Form das Objekt annehmen soll. Das kann man OpenGL aber durch die Normalen mitteilen.

Wenn man zum Beispiel eine Kugel beleuchten will, dann sollte sich die Beleuchtung aber gleichmäßig um die Kugel ziehe. Auch wenn die Kugel immer aus einer Vielzahl an geradflächigen Dreiecken besteht. Sie also NIE wirklich perfekt Rund wäre. Deswegen nimmt man dann da nicht die Normale der Fläche sondern die Normalen der Punkte. Und die sind im Vergleich zur Flächennormale etwas nach außen gebogen. Bzw führ sie genau vom Mittelpunkt weg. Die Normalen werden ähnlich wie die Farbe von einem Vertex zum Nächsten interpoliert und damit würden dir normalen auch über die Fläche "verlaufen" und für OpenGL würde so eine Rundung entstehen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]