Mittels Projektionsmatrix einen flachen Schatten zeichnen

Die Geometrie eines 3D-Objektes wird auf eine Fläche projiziert
Die Berechnung dieser Matrix wird hier erläutert

Montag, 14. April 2014

Gerichtete Lichtquelle

Eine gerichtete Lichtquelle wie die Sonne befindet sich so weit entfernt, dass die Strahlen für den Betrachter parallel erscheinen. Somit kann ein Punkt X anhand des Lichtvektors L (Geradengleichung: X+Lt) auf eine Ebene P projiziert werden.

Lichtquelle L = [Lx  Punkt X = [Xx   Projektion Y = [Yx
                 Ly             Xy                   Yy
                 Lz             Xz                   Yz
                 0 ]            1 ]                  Yw]

Fläche P: n ∙ x + d = 0  mit n = [nx   x = (1/Xw) * [Xx
                                  ny                 Xy
                                  nz]                Xz]

     L              X:╳
    ❘ ❘               ┆
    ▼ ▼              _┆_______
                    / ▼      / P
                   /Y:╳     /
                  /        /
                 /________/

Berechne Projektionsmatrix M, so dass gilt:

     Y = M X  ,  n ∙ (M X) + d = 0
Abbildung 1: Parallele Lichtquelle

Damit der Punkt X auf der Ebene zu liegen kommt, muss n∙x+d=0 erfüllt sein. D.h. n∙(X+Lt)+d=0! Aufgelöst nach t ergibt sich: t=(-d-n∙X)/(n∙L). Der Wert von t eingesetzt in die Geradengleichung ergibt: Y=X-L(d+n∙X)/(n∙L) und umgeformt: Y=(X(n∙L)-L(n∙X)-Ld)/(n∙L).

Die Division kommt in den homogenen Abschnitt der Matrix (0 0 0 n∙L). Die Subtraktion -Ld kommt in den Translationsabschnitt (transponiert): [-dLx -dLy -dLz]. Der Rest ist die Summe einer Skalierungsmatrix mit Faktor (n∙L) und des Skalarproduktes -L(n∙X). Damit ergibt sich die Matrix als:

M = ( n∙L-Lx*nx     -Lx*ny     -Lx*nz  -d*Lx  )
    (    -Ly*nx  n∙L-Ly*ny     -Ly*nz  -d*Ly  )
    (    -Lz*nx     -Lz*ny  n∙L-Lz*nz  -d*Lz  )
    (         0          0          0   n∙L   )
Abbildung 2: Projektionsmatrix für paralleles Licht

Punktförmige Lichtquelle

Eine punktförmige Lichtquelle befindet sich in der Nähe und das Licht erstreckt sich in alle Richtungen und nicht parallel. Somit kann ein Punkt X anhand der Geradengleichung: l+(l-X)t auf eine Ebene P projiziert werden.

Lichtquelle L = [Lx  mit l = (1/Lw) * [Lx
                 Ly                    Ly
                 Lz                    Lz]
       l:╳       Lw]
          \                 Fläche P: n ∙ x + d = 0
           ◀
          X:╳               mit n = [nx   x = (1/Xw) * [Xx
             \                       ny                 Xy
              \_________             nz]                Xz]
              /◀       / P
             /Y:╳     /
            /        /
           /________/

Berechne Projektionsmatrix M, so dass gilt:

     Y = M X  ,  n ∙ (M X) + d = 0
Abbildung 3: Punktförmige Lichtquelle

Damit der Punkt X auf der Ebene zu liegen kommt, muss n∙x+d=0 erfüllt sein. D.h. n∙(l+(l-X)t)+d=0! Aufgelöst nach t ergibt sich: t=(-d-n∙l)/(n∙(l-X)). Der Wert von t eingesetzt in die Geradengleichung ergibt: Y=l-(l-X)(d+n∙l)/(n∙(l-X)) und zusammengefasst ergibt sich: Y=(l(n∙(l-X))-(l-X)(d+n∙l))/(n∙(l-X)). Wird ausmultipliziert, ergibt sich: Y=(l(n∙l)-l(n∙X)-l(d+n∙l)+X(d+n∙l))/(n∙(l-X)). Zusammengefasst: Y=((d+n∙l)X-l(n∙X)-l*d)/(n∙(l-X)).

Wie gehabt kommt die Division in den homogenen Abschnitt der Matrix (-nx -ny -nz n∙l), die Subtraktion -ld in den Translationsvektor und der Rest ist die Summe der Skalierung mit Faktor (d+n∙l) und dem Skalarprodukt -l(n∙X). Damit ergibt sich die Matrix als:

M = ( n∙l+d-lx*nx       -lx*ny       -lx*nz  -d*lx  )
    (      -ly*nx  n∙l+d-ly*ny       -ly*nz  -d*ly  )
    (      -lz*nx       -lz*ny  n∙l+d-lz*nz  -d*lz  )
    (         -nx          -ny          -nz   n∙l   )
Abbildung 4: Projektionsmatrix für Punktlichtquelle

Einheitlich Projektionsmatrix

Wird jedes Matrixelement der Matrix aus Abbildung 4 mit Lw multipliziert bleibt das Ergebnis gleich, gleichwohl ergibt sich dann folgende, vereinheitlichte Darstellung:

M = ( n∙L+d*Lw-Lx*nx          -Lx*ny          -Lx*nz  -d*Lx  )
    (         -Ly*nx  n∙L+d*Lw-Ly*ny          -Ly*nz  -d*Ly  )
    (         -Lz*nx          -Lz*ny  n∙L+d*Lw-Lz*nz  -d*Lz  )
    (         -Lw*nx          -Lw*ny          -Lw*nz   n∙L   )
Abbildung 5: endgültige Projektionsmatrix (1)

Wenn für parallele Lichtquellen Lw auf 0 gesetzt wird und für punktförmige Lw != 0, dann kann Projektionsmatrix aus Abbildung 5 für beide Lichtquellenarten benutzt werden!

Für Puristen kann mit N=[nx ny nz d] (N ist der Vektor der Ebenengleichung P) und damit n∙L+d*Lw==N∙L die Matrix wie folgt notiert werden:

M = ( N∙L-Lx*Nx     -Lx*Ny     -Lx*Nz      -Lx*Nw  )
    (    -Ly*Nx  N∙L-Ly*Ny     -Ly*Nz      -Ly*Nw  )
    (    -Lz*Nx     -Lz*Ny  N∙L-Lz*Nz      -Lz*Nw  )
    (    -Lw*Nx     -Lw*Ny     -Lw*Nz   N∙L-Lw*Nw  )
Abbildung 6: endgültige Projektionsmatrix (2)