Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

02.07.2010, 18:31

Verständniss Problem mit Normalvektoren

Hallo an alle,
da ich in den Kapitel mit Licht und Materialien angekommen bin, und ein Verständnissproblem mit Normalvektoren hab... Ich versteh für was man Normalvektoren braucht, aber nicht wie man die jetzt bildet... Soweit ich es verstanden hab ist der Normalvektor doch der normalisierte Richtungsvektor des Vertex? Kennt jemand von euch eine gute Seite wo es gut erklärt wird oder sowas in die Richtung?

Vielen Dank im voraus
Mfg Male

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

02.07.2010, 18:36

Ein Normalvektor steht senkrecht auf einer Fläche oder Kurve (o.ä).
Bilden kannst du ihn im 3D (mit 3 Komponenten) mit dem Kreuzprodukt:

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

Wikipedia erklärt das imo recht gut.

3

02.07.2010, 18:58

Ah ok... Dann muss man das Kreuzprodukt auf die Länge von 1 bringen, weil die Normalvektoren, doch nur eine Länge von 1 haben dürfen?

4

02.07.2010, 19:26

Ah ok... Dann muss man das Kreuzprodukt auf die Länge von 1 bringen, weil die Normalvektoren, doch nur eine Länge von 1 haben dürfen?

Daher kommt der Name Normalvektor. Weil er die Länge 1 hat. ;)


Gruß
SaRu_

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

02.07.2010, 21:05

Daher kommt der Name Normalvektor. Weil er die Länge 1 hat. ;)

Nope, weil er normal auf die Oberfläche steht ;)

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

6

02.07.2010, 21:21

Du vertauscht das mit "normalisiert", SaRu ;)
Ein Vektor mit Länge 1 heißt "Einheitsvektor"

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

02.07.2010, 21:52

Zum berechnen der Vertexnormale, aufgrund eines Polygon-Meshes, nimmt man häufig die einzelnen Facenormalen der Polygone zur hilfe, welche sich den Vertex teilen und rechnet diese dann zusammen. Die Facenormale bekommst du, wie bereits gesagt, indem du die beiden Richtungsvektoren der Dreieckskanten nimmst und daraus das Kreuzprodukt bildest: §\vec{v} = \frac{\vec{a} \times \vec{b}}{|\vec{a} \times \vec{b}|}§. Wobei §\vec{a} = B-A§ und §\vec{b} = C-A§ und A, B, C die Dreieckspunkte sind.

Anschliessend werden für jeden Vertex die entsprechenden Vertexnormalen zusammengerechnet. Dafür gibt es einige Methoden die alle Vor und Nachteile haben. Ich stell mal zwei gängige vor:

Mean Weighted Equally (MWE)

Hier werden einfach alle Facenormalen (mit gleichen Gewicht) summiert: §\vec{v}_{mwe} = \sum_{i=1}^n \vec{v}_i§. Die Methode liefert allerdings z.T. fehlerhafte Ergebnisse (siehe u.A. L-Shape Problem).

Mean Weighted by Angle (MWA)

Hier werden die Facenormalen unterschiedlich gewichtet um o.g. Problem (L-Shape) zu umgehen: §\vec{v}_{mwa} = \sum_{i=1}^n \alpha_i \vec{v}_i§ wobei §\alpha_i§ der Winkel zwischen den beiden Kanten des i-ten Polygons ist.
@D13_Dreinig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

02.07.2010, 22:14

Eine sehr einfache aber effektive Methode um schön glatte Normalen zu bekommen ist, wie schon gezeigt wurde, die Normale jedes Dreiecks aus dem Kreuzprodukt von zwei Kantenvektoren zu berechnen, sie aber noch nicht zu normalisieren. Dann werden diese unnormalisierten Dreiecksnormalen zur Vertexnormale aller Vertices die das Dreieck aufspannen addiert (Vertexnormalen werden zuvor natürlich mit 0 initialisiert). Erst wenn alle Dreiecksnormalen auf die Normalen ihrer Vertices addiert wurden werden die fertigen Vertexnormalen in einem letzten Schritt normalisiert.
Das ganze hat den Hintergrund dass die Länge des Kreuzproduktes proportional zur Fläche des Dreiecks ist. Werden die Dreiecksnormalen also unnormalisiert aufaddiert führt das dazu dass Dreiecke mit größerer Fläche (längerer Normale) auch größeren Einfluss auf die Richtung der Vertexnormale haben als kleinere Dreiecke.

9

02.07.2010, 22:34

Du vertauscht das mit "normalisiert", SaRu ;)
Ein Vektor mit Länge 1 heißt "Einheitsvektor"

Stimmt, da habt ihr beiden natürlich Recht. *rot werd* :rolleyes:

[Ausrede]Musste weg und die Freundin stand schon an der Tür und hat gedrängelt, da verwechselt man schnell mal elementare Mathematik :D[/Ausrede]

Gruß
SaRu_

10

03.07.2010, 13:17

Also wenn ich richtig verstanden hab, bildet man den Normalvektor eines Dreieck so... Wenn z.b. die Koordinaten A(0, 1, 0), B(1, -1, 0) und C(-1, -1, 0) dann wäre a = B - A, also a = (1, 0, 0) und b = C - A also b = (-1, 0, 0)... Dann bilde ich das Kreuzprodukt, also a x b / | a x b |... Dann würde da v = (-1, 0, 0) rauskommen... Ist das so richtig?

Vielen Dank an alle, die mir geholfen haben :)
Mfg Male

Werbeanzeige