terrain op• Datenarten: mesh → matrix
• Aufruf: 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' (die Implementierung direkt: 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'; aus dem Register: ops3d.get("displacement_band_weights"))
Bandgatter je Oktave und Vertex (K, N) in [0,1].
Es ist 1, wo das Mesh die Wellenlänge als Geometrie tragen kann, 0 dort, wo sie Aliasing erzeugen würde.
Ein Vertex mit lokaler Kantenlänge e (Mittel der anliegenden Kanten, mesh_edge_lengths, oder local_edge (N,), falls angegeben) trägt die Wellenlänge λ nur, wenn λ ≥ nyquist·e; das Gate steigt linear von 0 bei λ = nyquist·e auf 1 bei λ = (nyquist+fade)·e (fade=0 → harter Schnitt). Die Itokawa-Pipeline nutzt es auf zwei Arten: (i) auf dem *gerenderten* Mesh, um zu entscheiden, welche Oktaven verschoben werden dürfen (der Rest geht an Bump-Normalen); (ii) auf dem *Quell*-Modell, um zu messen, welche Wellenlängen die echten Daten schon tragen — das Komplement 1 − gate ist das Gewicht des synthetischen Reliefs (0, wo die Daten fein sind, 1, wo sie grob sind), sodass dichte Bereiche nicht doppelt texturiert werden. Deterministisch.
Berechnet wird für ratio = λ_k / e_i: bei fade == 0 der Binärwert gate = (ratio ≥ nyquist), sonst gate = clip((ratio − nyquist) / fade, 0, 1). Rückgabewert ist float64 (K, N) (K = Anzahl Wellenlängen, N = Anzahl Vertices).
• wavelengths: Folge von Wellenlängen in Mesh-Einheiten (leer, nicht positiv oder nicht endlich löst ValueError aus). Dieselbe Folge wie an mesh_displace_spectrum übergeben.
• nyquist: Untergrenze des Verhältnisses Wellenlänge/Kantenlänge, ab der etwas als "als Geometrie tragbar" gilt (Standard 2 = 2 Kanten pro 1 Wellenlänge). 0 oder weniger löst ValueError aus.
• fade: Übergangsbreite (Vielfaches der Kantenlänge). 0 ergibt einen harten Schwellwert. Negativ löst ValueError aus.
• local_edge: wenn man die Kantenlänge pro Vertex (N,) selbst angibt (entspricht per='vertex' von mesh_edge_lengths). Längenabweichung, nicht positive oder nicht endliche Werte lösen ValueError aus. Bei None wird intern mesh_edge_lengths aufgerufen.
mesh_displace_spectrum ruft diese Funktion intern auf, daher muss man sie normalerweise nicht direkt aufrufen. Direkt verwendet man sie, wenn man die Wellenlängen misst, die die Quelldaten bereits tragen, und 1 − gate als weights übergibt (damit auf feinen Stellen kein synthetisches Relief doppelt aufgetragen wird), und wenn man den Rest bestimmt, der an bump_normals_fbm geht.
• 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
matrix als Eingabe)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. Diese Notiz wird von tools/opdocs.py md erzeugt (nicht von Hand bearbeiten).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.