terrain op• Data kinds: mesh → mesh
• Call: import fullseye as fs; fs.ledger.mesh_displace_spectrum(V, F, wavelengths=(0.06, 0.03, 0.015, 0.0075, 0.00375), amplitudes=(0.003, 0.00176, 0.00103, 0.0006, 0.00035), *, seed: 'int' = 0, nyquist: 'float' = 2.0, fade: 'float' = 1.0, weights=None, local_edge=None) (implementation को सीधे call करना हो तो import render3d; render3d.mesh_displace_spectrum(V, F, wavelengths=(0.06, 0.03, 0.015, 0.0075, 0.00375), amplitudes=(0.003, 0.00176, 0.00103, 0.0006, 0.00035), *, seed: 'int' = 0, nyquist: 'float' = 2.0, fade: 'float' = 1.0, weights=None, local_edge=None), registry से लेना हो तो ops3d.get("mesh_displace_spectrum"))
vertices को उनके normals के साथ घोषित amplitude spectrum से खिसकाता है, band-limited।
band limit प्रति vertex है; (V, F) लौटाता है।
displacement_i = Σ_k A_k · n_k(x_i) · gate_k(i) · w_k(i), जहाँ हर (wavelength_k, amplitude_k) जोड़ी के लिए एक seeded value-noise octave n_k ∈ [−1, 1] है (mesh इकाई — Itokawa STL km में है, इसलिए default 60 m पर 3 m है, जो A ∝ λ^0.77 के अनुसार घटकर 3.75 m पर 0.35 m होता है), gate = *इसी* mesh पर displacement_band_weights (nyquist × local edge से छोटा octave लागू नहीं होता — वह facet noise में alias हो जाएगा; उसे इसके बजाय bump_normals_fbm को भेजें) और weights = वैकल्पिक (N,) प्रति vertex या (K, N) प्रति octave प्रति vertex factor, [0,1] में (उदाहरण:
source model का synthetic-relief weight 1 − gate)। किसी vertex पर अधिकतम displacement अधिकतम Σ_k A_k होता है (tests इसे पक्का करते हैं)। mesh_displace_fbm (एक amplitude, octave ratio 2, कोई band limit नहीं) के विपरीत हर octave का amplitude स्पष्ट रूप से दिया जाता है। seed के तहत deterministic। shapes / non-finite / ऋणात्मक मानों पर fail-closed।
प्रक्रिया: (1) displacement_band_weights से gate (K,N) बनाएँ, (2) weights हो तो उससे गुणा करें, (3) हर octave k के लिए seed-fixed value noise n_k(x) ∈ [-1,1] (wavelength λ_k, lattice offset octave संख्या से बदलता है) का मान निकालें और Σ_k A_k · gate_k · n_k को normal दिशा का displacement बनाएँ, (4) area-weighted vertex normals के साथ vertices को खिसकाएँ। return value (V' (N,3) float64, copy of F)।
• wavelengths / amplitudes: समान लंबाई (1 से 32) के धनात्मक क्रम। mesh इकाई। संख्या मेल न खाए, खाली हो, 33 या अधिक हों, amplitude ऋणात्मक हो या amplitudes=None हो तो ValueError। amplitude 0 वाले octaves का मूल्यांकन छोड़ दिया जाता है।
• nyquist / fade / local_edge: band gate की settings (displacement_band_weights के समान)।
• weights: (N,) हो तो सभी octaves के लिए साझा, (K,N) हो तो प्रति octave factor। मान [0, 1] तक सीमित हैं; सीमा से बाहर या shape मेल न खाए तो ValueError।
• seed: समान seed होने पर bump_normals_fbm के साथ वही lattice साझा होती है (जो octaves geometry वहन नहीं कर सकती उन्हें shading की ओर निरंतर रूप से सौंपा जा सकता है)।
mesh_displace_fbm से अंतर यह है कि amplitude हर octave के लिए स्पष्ट दिया जाता है, और प्रति vertex edge length के आधार पर band काटा जाता है। coarse mesh को छोटी wavelengths देने पर भी aliasing नहीं होती, वे बस अनदेखी हो जाती हैं।
• 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 के स्रोत।
• itokawa_regolith_hero — py -3.11 examples_3d/itokawa_regolith_hero.py
mesh को input के रूप में लेते हैं)mesh_to_voxel · mesh_to_points · to_points · fuse_to_voxel · ambient_occlusion · cast_shadow · supersample_mesh · render_beauty
terrain)mesh_displace_fbm · terrain_region_mask · mesh_scatter_boulders · mesh_edge_lengths · mesh_subdivide · displacement_band_weights · bump_normals_fbm
*Provenance: render3d.py — 3D operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.