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

lumpinus

Frischling

  • »lumpinus« ist der Autor dieses Themas

Beiträge: 27

Wohnort: Bad Münstereifel

  • Private Nachricht senden

1

06.10.2006, 20:24

Wie einen Normalvektor in einem Dreieck interpolieren?

Hallo zusammen!

Also, ich entwickel grade einen Lightmapper und muss für jeden Pixel (oder 3D-Punkt) in einem Dreieck den Normalvektor wissen, der, logischerweise irgendwo zwischen den Normalvektoren der drei Eckpunkte dieses Dreiecks, zu finden ist.

Nun hab ich mir gedacht, betimmst du erstmal die Entfernung des aktuellen Punktes zu den drei Eckpunkten, und je weiter ein Eckpunkt weg ist, desto geringer ist der Einfluss dessen Normalvektors (oh Gott). :D

Problem ist nur dass wenn der Punkt genau auf der Verbindungslinie von den ersten beiden Eckpunkten ist, hat trotzdem der dritte Eckpunkt immernoch einen Einfluss (weil er ja nicht unendlich weit weg ist). Das ist natürlich falsch. 8)
Es muss eine Lösung her bei der der dritte Eckpunkt eben keinen Einfluss mehr hat.

Ich denke das ist ein Problem auf das man automatisch stößt wenn es um Lightmapping geht. Es müsste also schon einen Algo dafür geben.

Ich muss eigentlich nur wissen wie die GPU das macht wenn man Per-Pixel-Lighting mit Shader implementiert, wo man im Pixel-Shader den interpolierten Normalvektor vom Vertex-Shader erhält.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

06.10.2006, 21:47

Das ist relativ leicht.
Du musst den gesuchten Punkt in ein Koordinatensystem transformieren, dessen Ursprung an einem der 3 Eckpunkte liegt, und dessen Achsen entlang der beiden Kanten verlaufen, die an diesen Eckpunkt angrenzen.
Dann erhältst du zwei Koordinaten (u, v) - auch genannt baryzentrische Koordinaten, und kannst den interpolierten Normalenvektor, Texturkoordinaten, Farbe oder was auch immer an dieser Stelle ausrechnen:

n' = n0 + u*(n1 - n0) + v*(n2 - n0)

Wobei (u, v) die baryzentrischen Koordinaten bezogen auf Eckpunkt 0 sind und
ni der Normalenvektor an Eckpunkt i.

Es gibt auch eine vorgefertigte Funktion zum Berechnen der baryzentrischen Koordinaten:
D3DXVec3BaryCentric

Hier noch ein Link, der auch in der SDK-Dokumentation steht:
http://mathworld.wolfram.com/BarycentricCoordinates.html

lumpinus

Frischling

  • »lumpinus« ist der Autor dieses Themas

Beiträge: 27

Wohnort: Bad Münstereifel

  • Private Nachricht senden

3

06.10.2006, 22:09

gut, aber wie transformiere ich den gesuchten Punkt?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

06.10.2006, 22:16

Entweder nachdenken, die Funktion verwenden oder Google fragen ...

lumpinus

Frischling

  • »lumpinus« ist der Autor dieses Themas

Beiträge: 27

Wohnort: Bad Münstereifel

  • Private Nachricht senden

5

06.10.2006, 22:29

moment, die Funktion benötigt doch die zwei baryzentrischen Koordinaten (f, g).
Aus dem DirectX-SDK entnehme ich dass die Funktion nicht anderes tut als deine Formel zu wrappen.
Außerdem sagst du dass die Kooardiantenachsen, an den zwei anliegenden Kanten verlaufen sollen. Aber wenn da kein 90° Winkel ist, wäre es doch verzerrt, und könnte nicht einfach mit einer Rotation und Translation erstellt werden.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

06.10.2006, 23:43

OK, da hatte ich mich wohl vertan.
Weil ich gerade Lust hatte, habe ich es mal für dich hergeleitet :)
www.scherfgen-software.net/misc/barykoord.png

lumpinus

Frischling

  • »lumpinus« ist der Autor dieses Themas

Beiträge: 27

Wohnort: Bad Münstereifel

  • Private Nachricht senden

7

07.10.2006, 11:01

Man super, David! :o

lumpinus

Frischling

  • »lumpinus« ist der Autor dieses Themas

Beiträge: 27

Wohnort: Bad Münstereifel

  • Private Nachricht senden

8

07.10.2006, 11:38

Das funktioniert nicht richtig.
Ich bekomme für s sowohl positive als auch negative Werte.

Außerdem ist t immer unbestimmt, weil der Nenner (siehe Blatt) immer null ist. Ist ja auch logisch, denn das Punktprodukt zwischen zwei Vektoren die senkrecht zueinander stehen ist ja immer null.

Oder liege ich da falsch dass in deiner Rechnung N der Normalenvektor des Dreiecks ist? Also das normalisierte Kreuzprodukt zwischen z.B. AB und AC.

edit: Ich seh gerade du hast dich in der letzten Zeile vertan. Statt AC müsste es AB heißen.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

07.10.2006, 11:43

Ja, stimmt. Das muss natürlich AB heißen.
Eigentlich sollte das klappen, denn ich habe es genau so schon einmal verwendet.

lumpinus

Frischling

  • »lumpinus« ist der Autor dieses Themas

Beiträge: 27

Wohnort: Bad Münstereifel

  • Private Nachricht senden

10

07.10.2006, 11:45

Alles klar jetzt. Einige Punkte waren außerhalb des Dreiecks. Deshalb die negativen Werte. Vielen Dank nochmal!

Werbeanzeige