terrain op• Datenarten: mesh → mesh
• Aufruf: 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) (die Implementierung direkt: 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); aus dem Register: ops3d.get("mesh_displace_spectrum"))
Verschiebt Vertices entlang ihrer Normalen mit einem angegebenen Amplitudenspektrum, bandbegrenzt.
Die Bandbegrenzung gilt pro Vertex; gibt (V, F) zurück.
displacement_i = Σ_k A_k · n_k(x_i) · gate_k(i) · w_k(i) mit einer geseedeten Value-Noise-Oktave n_k ∈ [−1, 1] pro Paar (wavelength_k, amplitude_k) (Mesh-Einheiten — das Itokawa-STL ist in km, daher ist der Standard 3 m bei 60 m, fallend mit A ∝ λ^0.77 auf 0.35 m bei 3.75 m), gate = displacement_band_weights auf *diesem* Mesh (eine Oktave kürzer als nyquist × local edge wird nicht angewendet — sie würde zu Facettenrauschen aliasen; leiten Sie sie stattdessen an bump_normals_fbm) und weights = optionaler Faktor (N,) pro Vertex oder (K, N) pro Oktave und Vertex in [0,1] (z. B. das Gewicht des synthetischen Reliefs 1 − gate des Quellmodells). Die maximale Verschiebung an einem Vertex beträgt höchstens Σ_k A_k (Tests fixieren das). Anders als mesh_displace_fbm (eine Amplitude, Oktavverhältnis 2, keine Bandbegrenzung) ist die Amplitude jeder Oktave explizit. Deterministisch unter seed. Fail-closed bei Formen / nicht endlichen / negativen Werten.
Ablauf: (1) gate (K,N) mit displacement_band_weights erzeugen, (2) falls weights angegeben, damit multiplizieren, (3) für jede Oktave k ein Value Noise mit festem Seed n_k(x) ∈ [-1,1] (Wellenlänge λ_k, Gitterversatz je nach Oktavnummer) auswerten und Σ_k A_k · gate_k · n_k als Verschiebung entlang der Normale nehmen, (4) die Vertices entlang der flächengewichteten Vertexnormalen bewegen. Rückgabewert (V' (N,3) float64, copy of F).
• wavelengths / amplitudes: positive Folgen gleicher Länge (1 bis 32 Einträge). Mesh-Einheiten. Abweichende Anzahl, leer, 33 oder mehr Einträge, negative Amplitude oder amplitudes=None lösen ValueError aus. Oktaven mit Amplitude 0 werden nicht ausgewertet.
• nyquist / fade / local_edge: Einstellungen des Band-Gates (wie bei displacement_band_weights).
• weights: (N,) ist ein für alle Oktaven gemeinsamer Faktor, (K,N) ein Faktor pro Oktave. Die Werte sind auf [0, 1] beschränkt; außerhalb des Bereichs oder bei Formabweichung ValueError.
• seed: derselbe Seed teilt dasselbe Gitter mit bump_normals_fbm (Oktaven, die die Geometrie nicht tragen kann, lassen sich nahtlos an die Schattierung weitergeben).
Der Unterschied zu mesh_displace_fbm: die Amplitude wird pro Oktave explizit angegeben, und das Band wird pro Vertex nach Kantenlänge beschnitten. Gibt man einem groben Mesh kurze Wellenlängen, entsteht kein Aliasing; sie werden einfach ignoriert.
• Katalog der Beispieldaten (Download-URLs / Lizenzen) — 2-D nutzt skimage.data (BSD/Public Domain) plus synthetische Bilder, 3-D nennt Download-URLs echter Datenquellen (Stanford, PDS, …).
• Herkunft und Literatur der Operatoren — die Quellen der Forschung/Verfahren, auf denen diese Operatorfamilie beruht.
• itokawa_regolith_hero — py -3.11 examples_3d/itokawa_regolith_hero.py
mesh als Eingabe)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. Diese Notiz wird von tools/opdocs.py md erzeugt (nicht von Hand bearbeiten).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.