appearance op• Datenarten: normalmap → rgbimage
• Aufruf: import fullseye as fs; fs.ledger.thin_film_rgb(normals, view=(0.0, 0.0, 1.0), thickness_nm=350.0, n_film=1.33, n_sub=1.0, strength=1.0, light=None, nm=None, illuminant=None, polarization='unpolarized', n_out=1.0, under_layers=()) -> 'np.ndarray' (die Implementierung direkt: import matappear; matappear.thin_film_rgb(normals, view=(0.0, 0.0, 1.0), thickness_nm=350.0, n_film=1.33, n_sub=1.0, strength=1.0, light=None, nm=None, illuminant=None, polarization='unpolarized', n_out=1.0, under_layers=()) -> 'np.ndarray'; aus dem Register: opsoptics.get("thin_film_rgb"))
Normalenkarte + Blickrichtung → die Farbe der Dünnschichtinterferenz, (H, W, 3) in linearem sRGB.
Je flacher die Fläche zur Blickrichtung liegt, desto länger ist der Lichtweg in der Schicht, und die Farbe wandert zu kürzeren Wellenlängen ―― deshalb ändern sich die Farben von Seifenblasen und angelaufenem Titan am Rand.
normals / view: (H,W,3) Normalenkarte / Richtung von der Fläche zum Blickpunkt.
thickness_nm: Schichtdicke [nm]. Ein Skalar oder ein (H, W)-Dickenfeld (ungleichmäßige Schichten, Keile, ungleichmäßiger Auftrag). n_film / n_sub / n_out / polarization / under_layers: wie bei thin_film_reflectance (komplexes n + ik, Materialnamen,
Materialdatensätze, Arrays je Wellenlänge. Ein Materialname braucht eine Tabelle, die das nm-Gitter abdeckt —— z. B. Substrat "TI" / "AL").
strength: Gesamtstärke.
light: Richtung von der Fläche zur Lichtquelle (3,). None (Standard) ist gleichmäßige Himmelsbeleuchtung: jede aufgelöste Fläche gibt das Licht
zurück, das aus der Spiegelrichtung der Blickrichtung kommt, daher ist der Einfallswinkel cosθ = |n·v| (je Pixel verschieden). Ein Vektor liefert
die Farbe der spiegelnden Reflexion dieser Quelle: die Mikroflächen, die Licht zum Betrachter senden, haben den Halbvektor h = (l + v)/|l + v|
als Normale, daher ist der Einfallswinkel cosθ = |h·l| (koaxiale Beleuchtung l = v bedeutet senkrechten Einfall). Die Helligkeit (die Form des
Glanzlichts) ist hier nicht enthalten —— mit ward_anisotropic o. Ä. multiplizieren.
nm: Wellenlängengitter [nm] (aufsteigend, 2 oder mehr Punkte). None sind die 69 Punkte über 380–720 nm (FILM_RGB_NM). Für ein Material, dessen
Tabelle diesen Bereich nicht überdeckt (z. B. Rutil "TIO2" beginnt bei 430 nm), ein Gitter innerhalb seines Bereichs übergeben.
illuminant: spektrale Verteilung der Lichtquelle, so lang wie nm. None ist D65 (wie bei spectrum_to_srgb).
Leere Eingabe (normals mit 0 Elementen) löst ValueError aus. Ein Dickenfeld, dessen Form nicht zur Normalenkarte passt, ebenfalls ValueError.
Jeder optics-Operator prüft seine Eingabe vor der Berechnung (nichts rutscht stillschweigend durch):
• Einheiten stecken im Argumentnamen — _mm / _um / _deg / _mrad. Eine Verwechslung von mm und µm stürzt nicht ab, sondern liefert eine plausibel aussehende falsche Antwort; der Name verhindert das. Aus der Größenordnung wird nie auf die Einheit geschlossen.
• Strings lösen ValueError aus — float('50') gelingt, sodass ein ungeparster Konfigurationswert als Länge durchrutschen würde (gemessen: thin_lens('50', '200') lieferte plausible 66,667 mm). bool wird als implizite Hochstufung True == 1 ebenfalls abgelehnt.
• complex / Masked Arrays lösen ValueError aus (nur reelle Slots; das stille Verwerfen des Imaginärteils bzw. Abstreifen der Maske wird abgelehnt). NaN/Inf löst bei jeder Eingabe ValueError aus.
• Division durch null und Verwandtes wird namentlich abgelehnt: Brennweite 0, Krümmungsradius 0, Brechzahl <= 0, undurchlässige Blende (alles 0, die Normierung wird 0/0), PSF mit Summe <= 0, Stokes-Vektor mit S0 = 0 und ein Objekt im vorderen Brennpunkt (Bild im Unendlichen).
• Nur zwei Operatoren liefern einen nicht-endlichen Wert, und beide halten das vertraglich fest: depth_of_field liefert jenseits der hyperfokalen Distanz far_mm = inf (genau das bedeutet die hyperfokale Distanz), und gaussian_beam liefert an der Taille wavefront_radius_mm = inf (der Krümmungsradius einer ebenen Wellenfront). Beide liefern zusätzlich einen endlichen Partner (far_is_infinite / curvature_per_mm). Jedes andere stille NaN/Inf wird intern erkannt und löst ValueError aus — "float64 ist übergelaufen" und "die Antwort ist unendlich" sind verschiedene Aussagen; die erste wird nie im Gewand der zweiten geliefert.
• Größenobergrenzen: erzeugte Gitter durch optics.MAX_GRID (4096), übergebene Felder/PSFs/Blenden durch optics.MAX_FIELD_ELEMENTS (2^24), ABCD-Elementketten durch optics.MAX_SYSTEM_ELEMENTS (1024), Zernike durch MAX_ZERNIKE_TERMS (512) / MAX_ZERNIKE_ORDER (40) / MAX_ZERNIKE_BASIS (2^25). Damit werden Pfade fail-closed geschlossen, in denen ein kleines Argument eine riesige interne Allokation auslöst (gemessen: n_max=40 × 4096² braucht 108 GB).
• Physikalisch unmögliche Zustände werden ebenfalls abgelehnt: Stokes-Vektor mit Polarisationsgrad > 1, negative Transmission, negative Intensität und ungültige Zernike-Indizes wie ungerades n-|m|.
• Leitfaden zur Familie optics_imaging
• colorimetry — Farbmetrik und Spektren — Farbe ist nur durch Spektrum × Lichtart × Beobachter bestimmt
• mv_illumination_practice — Beleuchtung in der Praxis — Wellenlänge, Polarisation, Ansteuerung, Fremdlicht, Sicherheit
• Katalog der Beispieldaten (Download-URLs / Lizenzen) — 2-D nutzt skimage.data (BSD/Public Domain) plus synthetische Bilder, 3-D nennt Download-URLs echter Datenquellen (Stanford, PDS, …).
• Herkunft und Literatur der Operatoren — die Quellen der Forschung/Verfahren, auf denen diese Operatorfamilie beruht.
• Der kanonische Algorithmus (Autor, Jahr) und seine Anwendungen stehen im Familienleitfaden oben.
• appearance_structural_colour — py -3.11 examples/appearance_structural_colour.py
rgbimage als Eingabe)clearcoat_shade · wetness · defocus_blur · diffraction_blur · sensor_capture · pixel_shift_capture · false_color_metric
appearance)cie_xyz_from_wavelength · spectrum_to_srgb · thin_film_reflectance · grating_wavelengths · grating_rgb · ward_anisotropic
*Provenance: matappear.py — OPTICS Operator-Registry. Diese Notiz wird von tools/opdocs.py md erzeugt (nicht von Hand bearbeiten).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.