Normalen berechnen?
lima-city → Forum → Programmiersprachen → C/C++ und D
berechnen
code
drehung
dreieck
ecke
ende
entsprechen
frage
funktion
http
lama
normale berechnen
normale ecke
orientierung
problem
url
vektor
vorderseite
vorgehen
vorzeichen
-
Ich habe Probleme die Normalen für ein ein OpenGL Objekt zu berechnen bzw. zuzuweisen. Mit dem berechnen kappt alles aber wie muss ich die einzelnen Ecken zuweisen damit das Licht richtig berechnet wird. Ich berechne die Normalen mit der Formel wobei ich schon versucht hab
Normale(ecke1, ecke2, ecke3)
und das ergebnis für das ganze Dreieck genommen hab (funktioniert nicht),
Normale(ecke1, ecke2, ecke3)
Normale(ecke2, ecke3, ecke1)
Normale(ecke3, ecke1, ecke2)
und dann für jede Ecke eine Normale zugewiesen hab (funktioniert auch nicht) und dass ganze nochmal nur hab ich das fortführend gemacht so das manche Dreiecke Normalen hatten die auch aus anderen Dreiecken berechnet wurden.
Wie ist es richtig und hat es vieleicht damit was zu das manche Dreiecke vielleicht falsch rum sind?? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
So ganz verstehe ich dein Problem nicht, gib mir mal ein konkretes Beispiel, was da nicht klappt!
Also insgesamt gibt es 6 Möglichkeiten für die Vertauschung der Reihenfolge der Ecken (Vektoren), die eine Dreiecksfläche festlegen:
Davon entsprechen drei nur einer Drehung des Dreiecks, d. h. diese Vertauschungen ändern logischerweise nichts an der Drehrichtung. Die Normale zeigt dann auch in die gleiche Richtung, denn deren "Vorzeichen" wird ja durch die Drehrichtung der Ecken festgelegt (davon hängt nämlich ab, ob dieses Kreuzprodukt, was in dem Wiki als "v1 X v2" bezeichnet wird, positiv oder negativ ist).ecke1, ecke2, ecke3 ecke1, ecke3, ecke2 * ecke2, ecke1, ecke3 * ecke2, ecke3, ecke1 ecke3, ecke1, ecke2 ecke3, ecke2, ecke1 *
Die Vertauschungen, die die Drehrichtung nicht ändern, sind genau die, die du angegeben hast.
Die Vertauschungen, die die Drehrichtung ändern, habe ich oben mit * gekennzeichnet, probiere also mal so was wie:
aus und du wirst sehen, dass du eine andere Normale bekommst (nämlich mit -1 multipliziert).Normale(ecke1, ecke3, ecke2)
und dann für jede Ecke eine Normale zugewiesen hab (funktioniert auch nicht) und dass ganze nochmal nur hab ich das fortführend gemacht so das manche Dreiecke Normalen hatten die auch aus anderen Dreiecken berechnet wurden.
Häh?Wie ist es richtig und hat es vieleicht damit was zu das manche Dreiecke vielleicht falsch rum sind??
"Falsch herum" hört sich irgendwie komisch an, die Normale hängt von der Drehrichtung der Ecken ab. Da die Normale die Vorderseite bestimmt, kann am Ende eine Orientierung herauskommen, die du so nicht beabsichtigt hast.
Dass die Orientierung am Ende so ist, wie du sie dir gedacht hast, dafür bist du selbst verantwortlich... in den meisten Fällen bietet es sich aber wohl an zu schauen, ob ein bestimmter Referenzpunkt oberhalb oder unterhalb der Ebene liegt (= ob ihm die Vorderseite zugewandt ist oder nicht), in der sich das Dreieck befindet. Nach Bedarf multiplizierst du dann ganz einfach die Normale mit -1.
Wenn du einen Referenzpunkt r hast, eine Ecke s des Dreiecks und die Normale n zu diesem Dreieck, dann kannst du die Orientierung bzgl. r herausfinden indem du schaust ob positiv (Vorderseite der Fläche ist r zugewandt) oder negativ (Rückseite der Fläche ist r zugewandt) ist. -
lama-no2 schrieb:
So ganz verstehe ich dein Problem nicht, gib mir mal ein konkretes Beispiel, was da nicht klappt!
Also insgesamt gibt es 6 Möglichkeiten für die Vertauschung der Reihenfolge der Ecken (Vektoren), die eine Dreiecksfläche festlegen:
Davon entsprechen drei nur einer Drehung des Dreiecks, d. h. diese Vertauschungen ändern logischerweise nichts an der Drehrichtung. Die Normale zeigt dann auch in die gleiche Richtung, denn deren "Vorzeichen" wird ja durch die Drehrichtung der Ecken festgelegt (davon hängt nämlich ab, ob dieses Kreuzprodukt, was in dem Wiki als "v1 X v2" bezeichnet wird, positiv oder negativ ist).ecke1, ecke2, ecke3 ecke1, ecke3, ecke2 * ecke2, ecke1, ecke3 * ecke2, ecke3, ecke1 ecke3, ecke1, ecke2 ecke3, ecke2, ecke1 *
Die Vertauschungen, die die Drehrichtung nicht ändern, sind genau die, die du angegeben hast.
Die Vertauschungen, die die Drehrichtung ändern, habe ich oben mit * gekennzeichnet, probiere also mal so was wie:
aus und du wirst sehen, dass du eine andere Normale bekommst (nämlich mit -1 multipliziert).Normale(ecke1, ecke3, ecke2)
und dann für jede Ecke eine Normale zugewiesen hab (funktioniert auch nicht) und dass ganze nochmal nur hab ich das fortführend gemacht so das manche Dreiecke Normalen hatten die auch aus anderen Dreiecken berechnet wurden.
Häh?Wie ist es richtig und hat es vieleicht damit was zu das manche Dreiecke vielleicht falsch rum sind??
"Falsch herum" hört sich irgendwie komisch an, die Normale hängt von der Drehrichtung der Ecken ab. Da die Normale die Vorderseite bestimmt, kann am Ende eine Orientierung herauskommen, die du so nicht beabsichtigt hast.
Dass die Orientierung am Ende so ist, wie du sie dir gedacht hast, dafür bist du selbst verantwortlich... in den meisten Fällen bietet es sich aber wohl an zu schauen, ob ein bestimmter Referenzpunkt oberhalb oder unterhalb der Ebene liegt (= ob ihm die Vorderseite zugewandt ist oder nicht), in der sich das Dreieck befindet. Nach Bedarf multiplizierst du dann ganz einfach die Normale mit -1.
Wenn du einen Referenzpunkt r hast, eine Ecke s des Dreiecks und die Normale n zu diesem Dreieck, dann kannst du die Orientierung bzgl. r herausfinden indem du schaust ob positiv (Vorderseite der Fläche ist r zugewandt) oder negativ (Rückseite der Fläche ist r zugewandt) ist.
Also mein Problem:
Ich hab ein Objekt, gerade teste ich es an zwei Dreiecken:
erstes Dreieck:-3.0, 0.0, -3.0 0.0, -3.0, 0.0 0.0, 3.0, 0.0
zweites Dreieck:
3.0, 0.0, -3.0 0.0, -3.0, 0.0 0.0, 3.0, 0.0
Das ganze sieht übrigens ein bisschen aus wie ein Schmetterling ^^
Und meine Frage ist es jetzt wie ich die Ecken in der Funktion "Normale(ecke p1, ecke p2, ecke p3)" anordnen muss damit dass Licht richtig berechnet wird.
Ich hab schon einiges probiert aber bisher kommt nur so was raus:
Bild
Wie man sieht passt das Licht in der Mitte nicht. -
Und meine Frage ist es jetzt wie ich die Ecken in der Funktion "Normale(ecke p1, ecke p2, ecke p3)" anordnen muss damit dass Licht richtig berechnet wird.
Probiere
.Normale(ecke p1, ecke p3, ecke p2)
-
lama-no2 schrieb:
Und meine Frage ist es jetzt wie ich die Ecken in der Funktion "Normale(ecke p1, ecke p2, ecke p3)" anordnen muss damit dass Licht richtig berechnet wird.
Probiere
.Normale(ecke p1, ecke p3, ecke p2)
Heißt das ich brauch pro Dreieck nur eine Normale? In anderen Foren wird geschrieben das man bei kurvigen Objekten wie dem und anderen für jede Ecke eine Normale berechnen muss. Wie müsste ich vorgehen wenn ich z.B. die Normale der ecke2 eines Dreiecks berechnen will? -
Heißt das ich brauch pro Dreieck nur eine Normale?
Normalerweise ja!In anderen Foren wird geschrieben das man bei kurvigen Objekten wie dem und anderen für jede Ecke eine Normale berechnen muss.
Wenn kurvig gekrümmt bedeutet stimmt das. Ein Dreieck ist aber keine gekrümmte Fläche, noch nicht einmal ein Kreis, der hat zwar einen Rand mit Kurven aber die Fläche selbst ist nicht gekrümmt... so etwas wie eine Kugel wäre gekrümmt.
Aber bei einem einzelnen Dreieck macht das keinen Sinn!Wie müsste ich vorgehen wenn ich z.B. die Normale der ecke2 eines Dreiecks berechnen will?
Mathematisch gesehen hat ein Dreieck (wie jede glatte Fläche) nur eine einzige Normale! Und diese Normale kann man berechnen, die ist für ecke1 die gleiche wie für ecke2 und ecke3.
Es gibt in OpenGL aber den Trick, um die Lichtreflexion realistischer zu machen, verschiedene Normalen für jede Ecke eines Dreiecks oder Polygons anzugeben (wenn aus den Dreiecken/Polygonen eine gekrümmte Fläche zusammengesetzt werden soll).
Du kannst diese Normalen aber nicht aus den Dreiecken/Polygonen selbst berechnen, dazu musst du wissen, was das zusammengesetzte Objekt am Ende darstellen soll!
Dies ist hier erklärt: http://vrml.cip.ica.uni-stuttgart.de/linuxtag/suenden.html
ab "Sichtbare Kanten auf einem 3D-Modell" lesen. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage