lensrender op• Data kinds: कोई नहीं → table (केवल arguments से तय होने वाला op — यह कोई image या data input नहीं लेता)
• Call: import fullseye as fs; fs.ledger.lens_scene(objects=None, lights=None, sources=None, background=0.0, ambient=None, shadows=True) -> 'dict' (implementation को सीधे call करना हो तो import lensrender; lensrender.lens_scene(objects=None, lights=None, sources=None, background=0.0, ambient=None, shadows=True) -> 'dict', registry से लेना हो तो opsoptics.get("lens_scene"))
render_scene_through_lens के लिए एक सरल 3-D दृश्य (planes, spheres, meshes, lights) बनाना और जाँचना -> dict (scene table)।
> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।
*objects* is a list of dicts. {"type": "plane", "z_mm": -1000, "size_mm": (w, h), "albedo": ...} is a plane facing the lens (point_mm and normal / up tilt it; with size_mm it is the rectangle around the point, without it it is infinite) whose albedo may be a texture (H, W) or (H, W, 3) mapped onto the rectangle with bilinear sampling (row 0 at the top, up is the picture's up). {"type": "sphere", "center_mm": (x, y, z), "radius_mm": r} and {"type": "mesh", "vertices_mm": (V, 3), "faces": (F, 3)} (Moller-Trumbore, flat shading) take the same material keys:
albedo (a number, an (R, G, B) triple at the effective wavelengths 0.61 / 0.54 / 0.465 um, or {"nm", "value"}), specular (the weight ks of a normalised Blinn-Phong lobe, whose albedo is about ks), shininess and emission (spectral radiance of a self-luminous surface, W m^-2 sr^-1 nm^-1). *lights*: {"type": "directional", "to_light": (x, y, z), "irradiance_W_m2_nm": E} (E at normal incidence) or {"type": "point", "position_mm": ..., "intensity_W_sr_nm": I}; shadow rays are traced when *shadows* is true. *ambient* is a spectral irradiance (default 0, or 0.05 in the demo scene) that lights every surface without shadows; *background* is the spectral radiance a ray that hits nothing sees. *sources* are bright points seen by the camera, {"position_mm": (x, y, z), "intensity_W_sr_nm": I}: they are splatted by forward ray tracing (point sources cannot be found by random rays from the sensor), do not occlude and cast no shadows. With nothing given the table is a demo: a 2 mm checkerboard plane, a glossy sphere, one directional light and a little ambient light. Unknown keys, a degenerate triangle, a negative albedo or a tabulated spectrum outside its range are refused.
optics के सभी ops गणना से पहले input की जाँच करते हैं (कुछ भी चुपचाप पास नहीं होता):
• Unit argument के नाम में ही लिखी होती है — _mm / _um / _deg / _mrad। mm और µm की गड़बड़ी crash नहीं करती, बल्कि "सही दिखने वाला पर गलत उत्तर" देती है, इसलिए नाम से इसे रोका जाता है। मान के आकार से unit का अनुमान बिल्कुल नहीं लगाया जाता।
• String से ValueError — float('50') सफल हो जाता है, इसलिए बिना parse किया config value length के रूप में निकल जाता (मापा गया: thin_lens('50', '200') सही दिखने वाला 66.667 mm लौटा रहा था)। bool को भी True == 1 वाले implicit promotion के रूप में अस्वीकार किया जाता है।
• complex / masked array से ValueError (केवल real-valued slots; imaginary part को चुपचाप छोड़ना या mask हटाना अस्वीकार)। हर input पर NaN/Inf से ValueError।
• शून्य से भाग और उससे जुड़े मामलों को नाम लेकर अस्वीकार किया जाता है: focal length 0, radius of curvature 0, refractive index <= 0, पूरी तरह opaque aperture (सब 0, इसलिए normalisation 0/0), ऐसा PSF जिसका योग <= 0 हो, S0 = 0 वाला Stokes vector, और front focal point पर रखा object (image अनंत पर)।
• केवल 2 ops non-finite value लौटाते हैं, और वह भी contract के रूप में लिखा हुआ: depth_of_field hyperfocal distance से आगे far_mm = inf (hyperfocal distance की परिभाषा यही है) और gaussian_beam waist पर wavefront_radius_mm = inf (plane wavefront की radius of curvature)। दोनों साथ में एक finite साथी (far_is_infinite / curvature_per_mm) भी लौटाते हैं। इसके अलावा कोई भी चुपचाप आया NaN/Inf अंदर ही पकड़ा जाता है और ValueError देता है — "float64 overflow हुआ" और "उत्तर अनंत है" अलग-अलग दावे हैं, इसलिए पहले को दूसरे का चेहरा पहनाकर नहीं लौटाया जाता।
• Size की सीमा: generate होने वाले grid के लिए optics.MAX_GRID (4096), दिए गए field/PSF/aperture के लिए optics.MAX_FIELD_ELEMENTS (2^24), ABCD element chain के लिए optics.MAX_SYSTEM_ELEMENTS (1024), Zernike के लिए MAX_ZERNIKE_TERMS (512) / MAX_ZERNIKE_ORDER (40) / MAX_ZERNIKE_BASIS (2^25)। छोटे argument से बहुत बड़ा internal allocation होने वाले रास्तों (मापा गया: n_max=40 × 4096² पर 108 GB) को fail-closed ढंग से बंद किया गया है।
• भौतिक रूप से असंभव states भी अस्वीकार: degree of polarisation > 1 वाला Stokes vector, ऋणात्मक transmittance, ऋणात्मक intensity, और n-|m| odd जैसे अमान्य Zernike indices।
• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।
• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।
• Algorithm का मानक स्रोत (लेखक, वर्ष) और उपयोग ऊपर की family usage guide में दिए गए हैं।
• plenoptic_capture_pipeline — py -3.11 examples/plenoptic_capture_pipeline.py
• poc_photograph_through_prescription — py -3.11 examples/poc_photograph_through_prescription.py
• poc_plenoptic_camera — py -3.11 examples/poc_plenoptic_camera.py
table को input के रूप में लेते हैं)abcd_matrix · wavefront_stats · sfr_from_edge · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd
lensrender)exit_pupil_samples · trace_sensor_rays · scene_radiance · render_scene_through_lens · bokeh_shape · render_ghost_overlay · render_compare_prescriptions
*Provenance: lensrender.py — OPTICS operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.