displacement_band_weights — 3D terrain op

• Data kinds: mesh → matrix

• Call: import fullseye as fs; fs.ledger.displacement_band_weights(V, F, wavelengths=(0.06, 0.03, 0.015, 0.0075, 0.00375), *, nyquist: 'float' = 2.0, fade: 'float' = 1.0, local_edge=None) -> 'np.ndarray' (implementation को सीधे call करना हो तो import render3d; render3d.displacement_band_weights(V, F, wavelengths=(0.06, 0.03, 0.015, 0.0075, 0.00375), *, nyquist: 'float' = 2.0, fade: 'float' = 1.0, local_edge=None) -> 'np.ndarray', registry से लेना हो तो ops3d.get("displacement_band_weights"))

उपयोग

हर octave, हर vertex का band gate (K, N), [0,1] में।

जहाँ mesh wavelength को geometry के रूप में उठा सकता है वहाँ 1, और जहाँ aliasing होगी वहाँ 0।

स्थानीय edge length e वाला vertex (जुड़े edges का mean, mesh_edge_lengths, या दिया गया हो तो local_edge (N,)) wavelength λ को केवल तभी वहन करता है जब λ ≥ nyquist·e हो; gate λ = nyquist·e पर 0 से λ = (nyquist+fade)·e पर 1 तक रैखिक रूप से बढ़ता है (fade=0 → hard cut)। Itokawa pipeline इसे दो तरह से उपयोग करती है: (i) *render होने वाले* mesh पर यह तय करने के लिए कि किन octaves को displace किया जा सकता है (बाकी bump normals को जाते हैं); (ii) *source* model पर यह मापने के लिए कि असली data पहले से कौन-सी wavelengths वहन करता है — उसका complement 1 − gate synthetic relief का weight है (जहाँ data बारीक है वहाँ 0, जहाँ मोटा है वहाँ 1), इसलिए घने क्षेत्रों पर दोहरा texture नहीं चढ़ता। deterministic।

गणना ratio = λ_k / e_i के लिए है: fade == 0 हो तो gate = (ratio ≥ nyquist) का binary मान, अन्यथा gate = clip((ratio − nyquist) / fade, 0, 1)। return value float64 (K, N) है (K = wavelengths की संख्या, N = vertices की संख्या)।

• wavelengths: mesh इकाई में wavelengths का क्रम (खाली, non-positive, non-finite हो तो ValueError)। mesh_displace_spectrum को दिया गया वही क्रम दें।

• nyquist: wavelength/edge length अनुपात की निचली सीमा जिसे "geometry के रूप में वहन योग्य" माना जाता है (default 2 = 1 wavelength पर 2 edges)। 0 या कम हो तो ValueError।

• fade: transition की चौड़ाई (edge length के गुणज)। 0 पर hard threshold। ऋणात्मक हो तो ValueError।

• local_edge: जब प्रति vertex edge length (N,) स्वयं दी जाए (mesh_edge_lengths के per='vertex' के समकक्ष)। लंबाई मेल न खाए, non-positive या non-finite हो तो ValueError। None हो तो

भीतर mesh_edge_lengths call किया जाता है।

mesh_displace_spectrum इस function को भीतर call करता है, इसलिए आमतौर पर इसे सीधे call करने की ज़रूरत नहीं। सीधे उपयोग तब होता है जब source data पहले से जो wavelengths वहन करता है उन्हें मापकर 1 − gate को weights के रूप में दिया जाता है (ताकि बारीक जगहों पर synthetic relief दोबारा न चढ़े), और जब bump_normals_fbm को भेजा जाने वाला शेष भाग तय करना हो।

संदर्भ (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 करते हैं)

• itokawa_regolith_hero — py -3.11 examples_3d/itokawa_regolith_hero.py

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

fuse_to_voxel

इसी category के (terrain)

mesh_displace_fbm · terrain_region_mask · mesh_scatter_boulders · mesh_edge_lengths · mesh_subdivide · mesh_displace_spectrum · 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.