render op• Data kinds: mesh → rgbimage
• Call: import fullseye as fs; fs.ledger.render_regolith(V, F, *, pose=None, intrinsics=None, size: 'int' = 512, ss: 'int' = 2, sun: 'Sequence[float]' = (0.3, 0.4, 1.0), w: 'float' = 0.42, g: 'float' = -0.35, B0: 'float' = 0.87, h: 'float' = 0.01, roughness_deg: 'float' = 26.0, sun_angular_diameter_deg: 'float' = 0.53, shadow_samples: 'int' = 4, ao_samples: 'int' = 32, tint: 'Sequence[float]' = (1.0, 0.97, 0.93), self_illumination: 'float' = 1.0, exposure='auto', albedo_variation: 'float' = 0.12, seed: 'int' = 0, smooth_normals: 'bool' = True, background: 'Sequence[float]' = (0.0, 0.0, 0.0), bump=None, vertex_normals=None, vertex_albedo=None, exposure_target: 'float' = 0.45) -> 'np.ndarray' (to call the implementation directly, import render_beauty; render_beauty.render_regolith(V, F, *, pose=None, intrinsics=None, size: 'int' = 512, ss: 'int' = 2, sun: 'Sequence[float]' = (0.3, 0.4, 1.0), w: 'float' = 0.42, g: 'float' = -0.35, B0: 'float' = 0.87, h: 'float' = 0.01, roughness_deg: 'float' = 26.0, sun_angular_diameter_deg: 'float' = 0.53, shadow_samples: 'int' = 4, ao_samples: 'int' = 32, tint: 'Sequence[float]' = (1.0, 0.97, 0.93), self_illumination: 'float' = 1.0, exposure='auto', albedo_variation: 'float' = 0.12, seed: 'int' = 0, smooth_normals: 'bool' = True, background: 'Sequence[float]' = (0.0, 0.0, 0.0), bump=None, vertex_normals=None, vertex_albedo=None, exposure_target: 'float' = 0.45) -> 'np.ndarray'; from the registry, ops3d.get("render_regolith"))
Render an asteroid's regolith physically based (Hapke + ray-cast shadows at the Sun's angular diameter + zero ambient) → RGB (size,size,3).
A composition of render_beauty:
• Reflectance law = Hapke (w, g, B0, h, roughness_deg; defaults are typical S-type values for Itokawa).
• Shadow = render_shadow.shadow_raycast (apparent diameter sun_angular_diameter_deg, default 0.53° = the Sun. The penumbra is a few cm by geometry, so in effect a hard shadow). No ground (pedestal) is placed.
• Ambient light 0 (there is no skylight in space). Only the single-bounce terrain approximation self_illumination sets the floor of the shadows.
• Tone = linear (matching AMICA's 8bit images: exposure × clip). exposure='auto' is the exposure that puts the 99.5th percentile of the object pixels at 0.95 (deterministic). exposure='median' is the exposure that puts the median of the lit faces (median of the object pixels at or above 30 % of the 99.5 % point) at exposure_target (default 0.45) -- the fix for the hero of 2026-09-03 that came out as an "overexposed white potato" (aligning the 99.5 % point lets the median of a Lommel-Seeliger surface, bright right up to the limb, climb above 0.7). The clip rate is measured by the caller (the hero requires < 0.5 %).
• smooth_normals=True: smooths the shading by Phong interpolation of vertex normals (geometry and shadows unchanged).
• albedo_variation: spatial variation of the albedo (default 12 %, the bright/dark terrain of Saito et al. 2006).
• bump: the bump of render_beauty (shading-normal perturbation for sub-facet relief).
tint is a colour tint normalised to mean 1. fail-closed: arguments are validated by the lower-level ops; exposure is 'auto' / 'median' or a positive number. Deterministic (no randomness).
• blender_interop — Using Blender alongside — build the shape, measure it with fullseye (pitfalls: axes, units, ground truth)
• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).
• Operator provenance and references — the sources of the research/methods this op family came from.
• itokawa_regolith_hero — py -3.11 examples_3d/itokawa_regolith_hero.py
rgbimage as input)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. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.