render_beauty — 3D render op

• Data kinds: mesh → rgbimage

• Call: import fullseye as fs; fs.ledger.render_beauty(V, F, *, pose=None, intrinsics=None, size: 'int' = 512, ss: 'int' = 2, light: 'Sequence[float]' = (0.3, 0.4, 1.0), albedo: 'Sequence[float]' = (0.8, 0.8, 0.85), material: 'str' = 'plastic', matcap=None, ambient: 'float' = 0.12, ao: 'bool' = True, ground_shadow: 'bool' = True, tonemap: 'str' = 'reinhard', background: 'Sequence[float]' = (0.1, 0.11, 0.13), exposure: 'float' = 1.0, shininess: 'Optional[float]' = None, ao_samples: 'int' = 32, shadow_res: 'int' = 512, penumbra: 'float' = 2.5, shadow_samples: 'int' = 12, shadow_pcf: 'int' = 1, brdf: 'str' = 'phong', brdf_params=None, shadow_method: 'str' = 'map', sun_angular_diameter_deg: 'float' = 0.0, self_illumination: 'float' = 0.0, albedo_variation: 'float' = 0.0, albedo_scale=None, seed: 'int' = 0, smooth_normals: 'bool' = False, bump=None, vertex_normals=None, vertex_albedo=None, surface: 'str' = 'none', surface_params=None) -> 'np.ndarray' (implementation को सीधे call करना हो तो import render_beauty; render_beauty.render_beauty(V, F, *, pose=None, intrinsics=None, size: 'int' = 512, ss: 'int' = 2, light: 'Sequence[float]' = (0.3, 0.4, 1.0), albedo: 'Sequence[float]' = (0.8, 0.8, 0.85), material: 'str' = 'plastic', matcap=None, ambient: 'float' = 0.12, ao: 'bool' = True, ground_shadow: 'bool' = True, tonemap: 'str' = 'reinhard', background: 'Sequence[float]' = (0.1, 0.11, 0.13), exposure: 'float' = 1.0, shininess: 'Optional[float]' = None, ao_samples: 'int' = 32, shadow_res: 'int' = 512, penumbra: 'float' = 2.5, shadow_samples: 'int' = 12, shadow_pcf: 'int' = 1, brdf: 'str' = 'phong', brdf_params=None, shadow_method: 'str' = 'map', sun_angular_diameter_deg: 'float' = 0.0, self_illumination: 'float' = 0.0, albedo_variation: 'float' = 0.0, albedo_scale=None, seed: 'int' = 0, smooth_normals: 'bool' = False, bump=None, vertex_normals=None, vertex_albedo=None, surface: 'str' = 'none', surface_params=None) -> 'np.ndarray', registry से लेना हो तो ops3d.get("render_beauty"))

उपयोग

mesh को सभी quality layers मिलाकर 1 "शानदार still 3D" image में render करता है → RGB (size, size, 3) float [0,1]।

Arguments:

• V, F vertices (N,3) और triangles (M,3)।

• pose 4x4 object->camera (render3d.look_at)। None होने पर auto_view।

• intrinsics 3x3 pinhole K (target size के लिए, अंदर ss गुना scale किया जाता है)।

• size output की एक भुजा की लंबाई (वर्गाकार)। ss supersampling गुणक (पूर्णांक >= 1)।

• light world coordinates में light source की दिशा (scene→light source)। shading और ground shadow दोनों में साझा।

• albedo object का reflectance रंग RGB। material 'plastic' | 'metal' | 'matcap'।

• matcap material='matcap' होने पर ज़रूरी lit-sphere texture (h,w[,C])।

• ambient ambient light गुणांक। ao ambient occlusion लगाना है या नहीं।

• ground_shadow ground plane + ground shadow को bake करना है या नहीं।

• tonemap 'reinhard' | 'aces' | 'none'। background background रंग RGB।

• exposure tone mapping से पहले का exposure। shininess चमक (None होने पर material का default)।

• ao_samples / shadow_res / penumbra / shadow_samples quality और speed की tuning (ground shadow की कोमलता आदि)। penumbra light source की angular radius [degree] है, और penumbra की चौड़ाई लगभग "occluder की ऊँचाई × tan(penumbra)" होती है। default 2.5 degree पर, ज़मीन से 1 unit ऊँचाई वाले object का penumbra सिर्फ़ 1 से 2 pixel होता है (2026-09-02 को मापा गया: 320px की image में penumbra 283/102400 pixel था, और values के सिर्फ़ shadow_samples+1 यानी 7 स्तर थे)। कोमल shadow चाहिए तो इसे लगभग 10 degree तक बढ़ाएँ, और स्तर न दिखें इसके लिए shadow_samples भी साथ में बढ़ाएँ।

• shadow_pcf shadow map पढ़ते समय मिलाए जाने वाले neighbourhood की radius [texel] (default 1 = 3x3)। सिर्फ़ 1 point पढ़ने पर shadow की सीमा texel पर quantize होकर सीढ़ी जैसी बन जाती है। मापा गया (सिर्फ़ ज़मीन पर मापा गया पड़ोसी pixels का अधिकतम बदलाव):

default 2.5 degree, 12 rays, pcf=0 के बराबर पर 0.667,

12 degree, 24 rays, pcf=1 पर 0.176 (1/6 से बड़े स्तर 123→2)।

• brdf object का reflectance नियम। 'phong' (default = पहले की तरह Lambert diffuse + cos^n specular) / 'lambert' / 'lommel_seeliger' / 'hapke' (planetary photometry, render_shade.brdf_shade)। phong के अलावा बाकी में specular बंद होता है, और albedo को mean 1 पर normalise किए गए रंग-tint के रूप में गुणा किया जाता है (brightness brdf_params का single-scattering albedo w तय करता है; दो बार गुणा नहीं होता)।

• brdf_params dict (w, g, B0, h, roughness_deg, multiple_scattering)।

• shadow_method 'map' (default = shadow map + PCF) / 'raycast' (render_shadow.shadow_raycast, न सीढ़ी, न acne)।

• sun_angular_diameter_deg raycast में light source का apparent angular diameter (Sun 0.53°)। penumbra की चौड़ाई "occluder तक की दूरी × tan(diameter/2)" होती है = asteroid पर कुछ cm (hard shadow)।

• self_illumination terrain से एक बार के reflection के approximation का गुणांक (default 0)। bounce = गुणांक × albedo रंग × (1 − AO) × रोशन faces की औसत radiance ―― यह approximation मानता है कि hemisphere के ढके हुए हिस्से जितना पड़ोसी terrain दिखता है, और वह terrain औसत brightness से चमकता है (यह interreflection का सटीक हल नहीं है; ao=True ज़रूरी)। अंतरिक्ष में ambient light नहीं होती, इसलिए ambient=0 के साथ यही shadow का निचला स्तर तय करता है।

• bump dict(wavelengths, amplitudes[, seed, nyquist, fade, complement_edges]) → object pixels के shading normals को render3d.bump_normals_fbm (value-noise height field के gradient) से perturb करता है। geometry (depth/shadow/AO) नहीं बदलती। complement_edges=True होने पर हर pixel के ठीक नीचे mesh की local edge length को barycentric interpolation से दिया जाता है, और displacement के band gate का सिर्फ़ complement ही bump बनता है (एक ही wavelength दो बार नहीं जोड़ी जाती)।

fail-closed: गलत shape, non-finite, खाली, ss<1, अमान्य material/tonemap, अमान्य रंग/light/exposure पर ValueError। deterministic (कोई random नहीं)।

पृष्ठभूमि guides (इस op के पीछे की physics और conventions)

• blender_interop — Blender के साथ उपयोग — shape बनाएँ, fullseye से मापें (सावधानियाँ: axes, units, ground truth)

संदर्भ (sample data, साहित्य)

• 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 के स्रोत।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• anatomical_hand — py -3.11 examples_3d/anatomical_hand.py

• render_beauty — py -3.11 examples_3d/render_beauty.py

वे अगले ops जिनसे type जुड़ता है (rgbimage को input के रूप में लेते हैं)

fuse_to_voxel

इसी category के (render)

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


*Provenance: render_beauty.py — 3D operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.