scene op• Datenarten: keine → table (ein Operator, der allein durch seine Argumente bestimmt ist — er nimmt kein Bild und keine Daten entgegen)
• Aufruf: import fullseye as fs; fs.ledger.scene_material(kind: 'str' = 'lambert', albedo=0.6, metal: 'str' = 'al', finish: 'str' = 'random', glass: 'str' = 'N-BK7', sigma_per_mm: 'float' = 0.0, roughness_um: 'float' = 0.05, metal_source: 'str' = 'materials', reflectance_curve=None, absorption_from_k: 'bool' = False) -> 'dict' (die Implementierung direkt: import optscene; optscene.scene_material(kind: 'str' = 'lambert', albedo=0.6, metal: 'str' = 'al', finish: 'str' = 'random', glass: 'str' = 'N-BK7', sigma_per_mm: 'float' = 0.0, roughness_um: 'float' = 0.05, metal_source: 'str' = 'materials', reflectance_curve=None, absorption_from_k: 'bool' = False) -> 'dict'; aus dem Register: opsoptics.get("scene_material"))
Erzeugt ein Material. kind ist eines von dreien: lambert / conductor / dielectric.
Es gibt nur 3 Arten, weil Vermischen stillschweigend falsch wird; um mehr hinzuzufügen, die Typen trennen (ob diffus, Metall oder transparent, ändert grundlegend, wohin Strahlen gehen).
lambert: vollständig diffus, verwendet nur albedo (Skalar oder 3 RGB-Elemente).
conductor: die Farbe wird durch den komplexen Brechungsindex von metal (glassmirror.METALS) bestimmt,
die anisotrope Keulenbreite durch finish (metalfinish.FINISHES). Es wird keine Farbe angegeben.
roughness_um ist die Oberflächenrauheit Rq [µm]. Der spiegelnd zurückgegebene Anteil wird durch
exp(-(4πσcosθ/λ)²) bestimmt (Davies 1954 / Bennett-Porteus 1961), daher
entscheidet dieser 1 Wert zwischen spiegelnd (0.01 = poliert) und eher diffus (1.0 = satinierte Oberfläche).
Die Wellenlänge geht in die Formel ein, daher sieht dieselbe Fläche je nach Wellenlänge der Lichtquelle anders aus.
metal_source ist die Herkunft von n,k: "materials" (Standard, die gemessenen Tabellen der gemeinsamen Materialtabelle;
die 10 Metalle von glassmirror.MEASURED_METALS — auch Ni / Pt / Ti / W / Rh sind hier wählbar) oder
"table" (die grobe 5-Punkt-Tabelle). Das beobachtete Objekt liest dieselbe Tabelle wie die Linsengläser. ★ Am 2026-10-15
daran angepasst, dass der Standard von glassmirror die gemessene Tabelle wurde (bis dahin war der Standard die grobe Tabelle, und die 2 Standards widersprachen sich).
dielectric: bricht mit der Sellmeier-Dispersion von glass (raytrace.glass_catalog())
und absorbiert nach Beer–Lambert mit sigma_per_mm.
Glasnamen reichen bis zu den transparenten Materialien der gemeinsamen Materialtabelle (Gläser anderer Hersteller, Kristalle, Kunststoffe, Wasser).
Materialien, die keine Linsenmedien sind (Halbleiter wie Si und Ge), lassen sich ebenfalls
über das n von materials abrufen. Mit absorption_from_k=True wird aus dem Extinktionskoeffizienten k der Materialtabelle
α = 4πk/λ pro Wellenlänge addiert (der Grund, warum ein Si-Wafer bei 850 nm undurchsichtig und bei 1100 nm durchsichtig ist).
Auf dem spektralen Pfad (render_optscene(spectral=True) / layout_capture(mode="spectral")) liest lambert reflectance_curve (pairs(λ [nm], R), keine Extrapolation); fehlt sie, gilt der Mittelwert des RGB-albedo als wellenlängenunabhängig (bleibt als Annahme im Ergebnis). Metalle werden aus n,k der Materialtabelle (Johnson & Christy u. a.) per Fresnel gelöst, Dielektrika mit n(λ). Der RGB-Pfad (Standard) bleibt wie bisher.
Rückgabewert: ein dict, das das Obige validiert speichert (unverändert an die anderen scene_*-Ops übergeben).
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
• dataset_conventions — Konventionen für Trainingsdatensätze — COCO / YOLO / VOC und Fallstricke in der Sichtprüfung
• mv_cameras — Hersteller von Industriekameras (Sensorzuordnung, Zeilenkamera / TDI)
• mv_illumination_practice — Beleuchtung in der Praxis — Wellenlänge, Polarisation, Ansteuerung, Fremdlicht, Sicherheit
• mv_image_sensors — Industrielle Bildsensoren (vorwiegend aktuelle Produkte)
• virtual_machine_vision — Virtuelle Bildverarbeitung — Parameter erfassen und Objektmodell
• 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.
• poc_material_optical_library — py -3.11 examples/poc_material_optical_library.py
• poc_nir_silicon_transmission — py -3.11 examples/poc_nir_silicon_transmission.py
• poc_pocket_interreflection — py -3.11 examples/poc_pocket_interreflection.py
• studio_raytrace_scene — py -3.11 examples/studio_raytrace_scene.py
• virtual_machine_vision — py -3.11 examples/virtual_machine_vision.py
• vision_layout_from_catalog — py -3.11 examples/vision_layout_from_catalog.py
table als Eingabe)abcd_matrix · wavefront_stats · sfr_from_edge · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd
scene)scene_plane · scene_sphere · scene_box · scene_cylinder · surface_defect · surface_finish · random_defects · scene_difference
*Provenance: optscene.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.