PDA

View Full Version : [Frage] CG1Object::transform normals


Lizzy
12-11-2004, 21:15
Hallo,

weil jemand, was mit dem Kommentar gemeint ist, man soll die Objektnormalvektoren in viewing coord. tranformieren? Wofür brauch ich die? Ich mein mir is shcon klar, dass man die Weltkoordinaten in viewing coordinaten umwandeln muss, aber muss man dann auch die normalvektoren an diese viewing coordinaten anpassen? Ein normalvektor is ja auch weiterhin ein normalvektor.... in welcher form werden diese gespeichert? Als vektoren, die von einem punkt weg in eine richtung gehen... daher sollts ja egal sein, ob das welt oder viewing coordinaten sin, oder? normal auf das objekt is ja weiterhin, nicht? Und ein normalvektor zu einer fläche zB is ja unabhängig von der camera position, oder?

Bitte darum, etwas licht in die sache zu bringen.. ich wär ja gern in die fragestunde gegangen, war aber leider verhindert... was blöd is, weil ich die fragestunde wirklich gebraucht hätte...

ChrisChiu
12-11-2004, 21:34
Hallo,

weil jemand, was mit dem Kommentar gemeint ist, man soll die Objektnormalvektoren in viewing coord. tranformieren? Wofür brauch ich die? Ich mein mir is shcon klar, dass man die Weltkoordinaten in viewing coordinaten umwandeln muss, aber muss man dann auch die normalvektoren an diese viewing coordinaten anpassen? Ein normalvektor is ja auch weiterhin ein normalvektor.... in welcher form werden diese gespeichert? Als vektoren, die von einem punkt weg in eine richtung gehen... daher sollts ja egal sein, ob das welt oder viewing coordinaten sin, oder? normal auf das objekt is ja weiterhin, nicht? Und ein normalvektor zu einer fläche zB is ja unabhängig von der camera position, oder?

Bitte darum, etwas licht in die sache zu bringen.. ich wär ja gern in die fragestunde gegangen, war aber leider verhindert... was blöd is, weil ich die fragestunde wirklich gebraucht hätte...

Denk an die verschiedenen Koordinatensysteme - Objekt-lokal, Weltkoordinatensystem, View-Koordinatensystem (kann man als Kamera-Koordinatensystem sehen), und Device Koordinatensystem (das 2D Ergebnis).

Die Normalvektoren auf die Flächen werden ja objektlokal aus den atoff-Files geladen (für Vertex-Normals) oder berechnet (für Face-Normals). Dann hat man die Normalvektoren mal relativ zu den vorhandenen Objektkoordinaten.

D.h. die Normalvektoren von verschiedenen Objekten sind - wenn die Objekte alle verschoben, rotiert, skaliert sind - alle trotzdem im lokalen Objektkoordinatensystem - für jedes Objekt einzeln. Das ist nicht besonders sinnvoll - man muß die Normalvektoren zwecks "Vergleichsmöglichkeit" (und vor allem damit man sie im selben Koordinatensystem-Kontext miteinander verknüpfen kann und Berechnungen darauf ausführen kann) alle in dasselbe Koordinatensystem bringen. Auch in Anbetracht dessen, dass man später bei der Beleuchtung ebenfalls den Lichtvektor in Viewing-Koordinaten bekommt, müssen die Normalvektoren dann auch im Viewing-Koordinatensystem sein - folglich ist eine Transformation auch der Vektoren notwendig.

Kleines Beispiel: sagen wir, ein Vektor im Objekt zeigt nach rechts, also (1, 0, 0). Dieses Objekt wird dann rotiert. Relativ zum Objektkoordinatensystem ist natürlich der Vektor immer noch (1, 0, 0), aber im Weltkoordinatensystem ist der Vektor dann anders - nämlich rotiert - analog zu den Punkten selbst. Im Viewing-Koordinatensystem wird - je nach Kameraorientierung, der Vektor nochmals anders.

Bei Normalvektoren ist natürlich die Translation nicht relevant - da Vektoren bekanntermaßen nur Richtungen und keine Absolutpositionen angeben. Aber da Transformationen auch Rotationen und nichtuniforme Skalierungen beinhalten, müssen auch Vektoren diese Transformationen mitmachen (Achtung: bei der nichtuniformen Skalierung ist bei Vektoren ein bisschen was zu beachten - siehe dazu die Bemerkungen in der Beispielangabe).

EDIT: Zur Veranschaulichung hab ich meinem kreativem Zeichendrang Ausdruck verliehen :D und eine Skizze gezeichnet: http://www.cg.tuwien.ac.at/~chiu/vektor_transformation.jpg

Der blaue Vektor ist nur ein Beispiel - aber man sieht, dass im ein Vektor im Modellkoordinatensystem und im Weltkoordinatensystem nicht unbedingt dieselben "Zahlenwerte" haben - auch wenn sie eigentlich derselbe Vektor sind. Es ist einfach ein anderer Koordinaten-Kontext. Da man den Lichtvektor im Endeffekt dann in View-Koordinaten bekommt, muß man die Normalvektoren - die man ja mit dem Lichtvektor verknüpfen will bei der Beleuchtung dann - in dasselbe Koordinatensystem bringen.

Merkregel: niemals Berechnungen mit Entitäten (Vektoren, Vertizes) aus verschiedenen Koordinatensystemen durchführen!

Lizzy
12-11-2004, 22:02
ah, danke!

ich denke jetzt versteh ich mehr... ich bin immer davon ausgegangen, in den .atoff files wären alle objektkoordinaten auf das gleiche system bezogen.

Aber diese Aufgabe müssen wir erst ausprogrammieren, indem wir objektlokale koordinaten in weltkoordinaten (das was ich in den .atoff files vermutet habe) umrechnen müssen. Dann ists auch halbwegs offensichtlich, wieso man die normalvektoren transformieren muss (dank deiner skizze, die einiges klar gemacht hat ... teilweise auch VO inhalte, die ich in der VO zwar verstanden habe, aber nicht in die viewing pipeline einordnen konnte... ;-)

danke auch für die rasche antwort!