cast_shadow — 3D render op

• Datenarten: mesh × vector → image2d

• Aufruf: import fullseye as fs; fs.ledger.cast_shadow(V, F, light, *, pose=None, intrinsics=None, width: 'int' = 256, height: 'int' = 256, directional: 'bool' = True, penumbra: 'float' = 0.0, samples: 'int' = 16, shadow_res: 'int' = 512, bias=None, pcf: 'int' = 0) -> 'np.ndarray' (die Implementierung direkt: import render_shadow; render_shadow.cast_shadow(V, F, light, *, pose=None, intrinsics=None, width: 'int' = 256, height: 'int' = 256, directional: 'bool' = True, penumbra: 'float' = 0.0, samples: 'int' = 16, shadow_res: 'int' = 512, bias=None, pcf: 'int' = 0) -> 'np.ndarray'; aus dem Register: ops3d.get("cast_shadow"))

Verwendung

Berechnet Schlag-/Weichschatten eines Meshes und liefert eine Sichtbarkeitskarte (H,W) ∈ [0,1].

1=vollständig beleuchtet / 0=vollständiger Schatten. Hintergrundpixel ohne Empfangsfläche sind 1.0.

Argumente:

• V, F Vertices (N,3) und Dreiecke (M,3). Ein leeres Mesh kann keinen Schatten werfen und wird daher abgewiesen.

• light (3,)-Vektor. Bei directional=True die Richtung des Parallellichts (Szene → Lichtquelle), bei False die Weltposition einer Punktlichtquelle.

• pose/intrinsics Kamera. Wenn weggelassen, ergänzt durch render3d.auto_view.

• penumbra Winkelradius (Grad) einer Flächenlichtquelle. 0 ergibt harte Schatten; je größer, desto breiter der Halbschatten.

• samples Anzahl der Halbschatten-Samples (nur bei penumbra>0 verwendet, Fibonacci-Scheibe).

• shadow_res Auflösung von 1 Seite der shadow map.

• bias Tiefen-Bias des Schattentests (Welteinheiten). None setzt ihn automatisch aus texel-Größe und Neigung (unterdrückt acne / peter-panning).

• pcf Radius [texel] der Nachbarschaft, die beim Auslesen der shadow map gemischt wird. 0 (Standard) ist der 1 nächste Punkt = wie bisher. Bei 1 werden die 3x3- Entscheidungen gemittelt (nicht die Tiefen —— ein Mitteln der Tiefen ebnet Vorne und Hinten ein und erzeugt Flächen, die es nicht gibt). Es mildert, dass die Grenze auf texel quantisiert zur Treppe wird, ohne die shadow map zu erhöhen.

Das Verfahren ist shadow mapping (Williams 1978): Tiefe von der Lichtquelle mit render_mesh holen, die Empfangsflächenpunkte der Kameraseite in den Lichtraum projizieren und Tiefen vergleichen. fail-closed: entartete Meshes, ungültige Lichtquellen und nicht positive Größen/Auflösungen lösen ValueError aus.

Hintergrundwissen (Physik und Konventionen hinter diesem Operator)

• blender_interop — Zusammen mit Blender — Form bauen, mit fullseye messen (Fallstricke: Achsen, Einheiten, Referenzdaten)

Referenzen (Beispieldaten, Literatur)

• 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.

Ausführbare Beispiele (verifizierte Samples, die diesen Operator wirklich aufrufen)

• render_beauty — py -3.11 examples_3d/render_beauty.py

• render_shadow — py -3.11 examples_3d/render_shadow.py

Typkompatible Folge-Operatoren (nehmen image2d als Eingabe)

fuse_to_voxel · fit_poly_surface · eval_poly_surface · surface_form_error · background_flatten · polar_unwrap · fit_zernike · matcap_shade

Gleiche Kategorie (render)

project_points · render_point_depth · render_volume_projection · render_shaded · ambient_occlusion · phong_shade · matcap_shade · supersample_mesh


*Provenance: render_shadow.py — 3D 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.