Normale: Unterschied zwischen den Versionen
Flash (Diskussion | Beiträge) (=Wie berechne ich Normalen?= NORMIEREN) |
K (→Normalisieren: Kommas gesetzt) |
||
(15 dazwischenliegende Versionen von 10 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
= Normalen = | = Normalen = | ||
− | + | ||
+ | |||
== Was ist das? == | == Was ist das? == | ||
− | + | Eine '''Normale''' ist ein Vektor, der Senkrecht auf eine Fläche steht. | |
− | Eine '''Normale''' ist ein Vektor. | + | |
+ | |||
− | |||
== Wozu brauch ich Normalen? == | == Wozu brauch ich Normalen? == | ||
− | |||
'''Normalen''' haben in OpenGL zwei zentrale Aufgaben. | '''Normalen''' haben in OpenGL zwei zentrale Aufgaben. | ||
Zeile 14: | Zeile 14: | ||
# Sie bestimmen wie Licht von der Fläche reflektiert wird. | # Sie bestimmen wie Licht von der Fläche reflektiert wird. | ||
− | + | ||
+ | |||
== Wie berechne ich Normalen? == | == Wie berechne ich Normalen? == | ||
− | |||
'''Normalen''' sind Flächennormalen. Das heißt, sie stehen senkrecht auf einer Fläche.<br> | '''Normalen''' sind Flächennormalen. Das heißt, sie stehen senkrecht auf einer Fläche.<br> | ||
Zeile 32: | Zeile 32: | ||
# Einen Eckpunkt als Bezugspunkt (P0) wählen. | # Einen Eckpunkt als Bezugspunkt (P0) wählen. | ||
# Die beiden Vektoren v1 = P1-P0 und v2 = P2-P0 bestimmen. | # Die beiden Vektoren v1 = P1-P0 und v2 = P2-P0 bestimmen. | ||
− | # Diese beiden Kreuzmultiplizieren | + | # Diese beiden Kreuzmultiplizieren v1 X v2. (steht in jedem Tafelwerk unter [[Vektorprodukt|Kreuzprodukt]]) |
# Das Ergebnis hat schonmal die richtige Richtung. (Für OpenGl reicht das.) | # Das Ergebnis hat schonmal die richtige Richtung. (Für OpenGl reicht das.) | ||
− | Eine Normale heißt aber nur deshalb Normale, weil sie normiert ist. Das heißt sie ist 1 Längeneinheit lang. Wenn man einen Vektor normieren will dividiert man einfach den Vektor | + | === Normalisieren === |
+ | Eine Normale heißt aber nur deshalb Normale, weil sie normiert ist. Das heißt, sie ist 1 Längeneinheit lang. Wenn man einen Vektor normieren will, dividiert man einfach den Vektor durch seine Länge. | ||
Allgemein: | Allgemein: | ||
− | + | [[Bild:Normierung_Allgemein.png]] | |
Beispiel eines normierten Vektors: | Beispiel eines normierten Vektors: | ||
+ | [[Bild:Normierung_Beispiel.png]] | ||
− | + | Das Ergebnis ist die Normale des Dreiecks und damit auch der gesamten Ebene, in der das Dreieck liegt. | |
− | |||
− | |||
− | + | Mit [[glNormal]] hat man in OpenGL explizit die Möglichkeit, einer Fläche eine '''Normale''' zuzuweisen. Diese muss nicht senkrecht (wie eine echte Normale) auf dieser Fläche stehen. Damit hat man die Möglichkeit, die Beleuchtung von Flächen gezielt zu manipulieren. | |
+ | <br> | ||
− | + | ''GL_NORMALIZE''<br> | |
− | + | In OpenGL gibt es weiterhin die Möglichkeit, die Normalen automatisch normalisieren zu lassen. Dazu muss mittels glEnable(GL_NORMALIZE) das Normalisieren eingeschaltet werden. Alle darauffolgenden Aufrufe von glNormal setzen die aktuelle Normale automatisch normiert. Abgeschaltet werden kann dies natürlich wieder durch glDisable(GL_NORMALIZE). | |
== Siehe auch == | == Siehe auch == | ||
− | + | [[Vektorprodukt]], [[glNormal]] | |
− | [[glNormal]] |
Aktuelle Version vom 19. November 2013, 20:39 Uhr
Inhaltsverzeichnis
Normalen
Was ist das?
Eine Normale ist ein Vektor, der Senkrecht auf eine Fläche steht.
Wozu brauch ich Normalen?
Normalen haben in OpenGL zwei zentrale Aufgaben.
- Sie zeigen welche Flächenseite die Vorderseite ist (anhand des Vorzeichens).
- Sie bestimmen wie Licht von der Fläche reflektiert wird.
Wie berechne ich Normalen?
Normalen sind Flächennormalen. Das heißt, sie stehen senkrecht auf einer Fläche.
Welche Fläche?
Eine beliebige...
Ersteinmal eine kurze Zusammenfassung.
- Flächen bestehen aus Polygonen.
- Polygone bestehen aus n Dreiecken.
- Jedes Dreieck ist definiert durch seine 3 Eckpunkte.
- 3 Punkte liegen immer in einer Ebene
Wenn man nun die Normale eines Dreiecks berechnen will geht man folgenermaßen vor:
- Einen Eckpunkt als Bezugspunkt (P0) wählen.
- Die beiden Vektoren v1 = P1-P0 und v2 = P2-P0 bestimmen.
- Diese beiden Kreuzmultiplizieren v1 X v2. (steht in jedem Tafelwerk unter Kreuzprodukt)
- Das Ergebnis hat schonmal die richtige Richtung. (Für OpenGl reicht das.)
Normalisieren
Eine Normale heißt aber nur deshalb Normale, weil sie normiert ist. Das heißt, sie ist 1 Längeneinheit lang. Wenn man einen Vektor normieren will, dividiert man einfach den Vektor durch seine Länge.
Allgemein:
Beispiel eines normierten Vektors:
Das Ergebnis ist die Normale des Dreiecks und damit auch der gesamten Ebene, in der das Dreieck liegt.
Mit glNormal hat man in OpenGL explizit die Möglichkeit, einer Fläche eine Normale zuzuweisen. Diese muss nicht senkrecht (wie eine echte Normale) auf dieser Fläche stehen. Damit hat man die Möglichkeit, die Beleuchtung von Flächen gezielt zu manipulieren.
GL_NORMALIZE
In OpenGL gibt es weiterhin die Möglichkeit, die Normalen automatisch normalisieren zu lassen. Dazu muss mittels glEnable(GL_NORMALIZE) das Normalisieren eingeschaltet werden. Alle darauffolgenden Aufrufe von glNormal setzen die aktuelle Normale automatisch normiert. Abgeschaltet werden kann dies natürlich wieder durch glDisable(GL_NORMALIZE).