2009-05-25 2 views
4

Warum bewirkt das (gleichmäßige) Skalieren des Objektobjekts, dass das Objekt in OpenGL ES 1.x heller wird?Warum verringert das Skalierungsobjekt das Objekt in OpenGL ES?

Es wäre sinnvoller zu sein, dass es dunkler wäre, weil die Normalen nicht verkleinert werden, wodurch das Objekt dunkler wird? Aber aus irgendeinem Grund wird das Objekt leichter. Wenn ich es vergrößere, wird das Objekt dunkler. Meiner Meinung nach sollte das umgekehrt sein.

Bitte schlagen Sie nicht GL_NORMALIZE usw. vor. Ich bin nur neugierig, warum OpenGL-Implementierung so funktioniert.

+0

Ich würde einige Vorher/Nachher Screenshots davon veröffentlichen. –

Antwort

7

Einfache Frage, komplexe Antwort. Dies ist der betreffende Extrakt aus der redbook:

Transforming Normals

Normale Vektoren in der gleichen Weise Transformation nicht als Ecken oder Position Vektoren. Mathematisch ist es besser zu normalen Vektoren nicht als Vektoren, sondern als Ebenen senkrecht zu diesen Vektoren zu denken. Dann werden die Transformationsregeln für normale Vektoren durch die Transformationsregeln für senkrechte Ebenen beschrieben. Eine homogene Ebene wird durch den Zeilenvektor (a, b, c, d) mit bezeichnet, wobei mindestens eines von a, b, c oder d ungleich Null ist. Wenn q eine von null verschiedene reelle Zahl ist, dann stellen (a, b, c, d) und (qa, qb, qc, qd) die gleiche Ebene dar. A Punkt (x, y, z, w) T ist auf der Ebene (a, b, c, d) wenn ax + durch + cz + dw = 0. (Wenn w = 1, dies ist die Standardbeschreibung einer euklidischen Ebene.) Damit (a, b, c, d) eine euklidische Ebene darstellt, muss mindestens einer von a, b oder c ungleich Null sein. Wenn sie alle null sind, dann stellt (0, 0, 0, d) die "Ebene bei Unendlichkeit" dar, die alle "Punkte im Unendlichen" enthält.

Wenn p eine homogene Ebene ist und V ein homogener Vertex-, dann wird die Anweisung „v liegt auf der Ebene P“ geschrieben mathematisch als pv = 0, wobei pv normale Matrixmultiplikation ist. Wenn M eine nichtsinguläre Scheiteltransformation (das heißt, eine 4 × 4-Matrix, die ein inverse M-1 hat), dann pv = 0 ist entsprechen pM-1 mV = 0, so Mv auf der Ebene pM liegt -1. Somit pM-1 ist das Bild der Ebene unter dem Scheitelpunkt Transformation M.

Wenn der Normalvektoren als Vektoren denken wie statt als die Ebene senkrecht zu ihnen lassen und v n seinen Vektoren so, dass v senkrecht zu n ist. Dann ist nTv = 0.Somit ist für eine beliebige nichtsinguläre Transformation M, nTM-1Mv = 0, was bedeutet, dass nTM-1 die Transponierte des transformierten Normalenvektors ist. Somit ist der transformierte Normalenvektor (M-1) T n. In anderen Wörtern werden normale Vektoren durch die inverse Transponierung der Transformation umgewandelt, die Punkte transformiert. Puh!

Kurz gesagt, Positionen und Normalen werden nicht auf die gleiche Weise umgewandelt. Wie im vorhergehenden Text erläutert, ist die normale Transformationsmatrix (M-1) T. Eine Skalierung von M auf sM würde (M-1) T/s ergeben: je kleiner der Skalierungsfaktor, desto größer die transformierte Normale ... Hier geht's los!

0

Es scheint, dass die Normalen nicht mit dem Objekt skalieren. Dies würde bedeuten, dass die Normalen für ein Objekt in voller Größe eine wesentlich größere Abdeckung eines Objekts mit einer kleineren Größe darstellen würden. Dies würde dazu führen, dass die Winkel zwischen den Lichtquellen und den Normalen genau gleich sind, jedoch auf einer Fläche, die viel kleiner ist.

+0

Hmm hmm .. das würde irgendwie Sinn machen, aber ich verstehe nicht die Mathe hinter Hit. Werden die Flächennormalen nicht einfach mit der inversen Modellansichtsmatrix multipliziert, die von der Skalierung betroffen ist. –

+0

Das weiß ich nicht, mein Verständnis von Normalen kommt aus 3D-Animation, nicht OpenGL so sehr. Ich habe meine Antwort auf ein paar schnelle Lektüre basiert, die ich gemacht habe, wo Normalen oft vorberechnet sind und gesagt werden müssen, um ihren jeweiligen Polygesichtern/verts/etc zu folgen. Wenn die Normalen der Geometrie nicht folgen (oder in Ihrem Fall skalieren), erhalten Sie dunkle und helle Flecken. – Soviut