terrain op• Datenarten: mesh → mesh
• Aufruf: import fullseye as fs; fs.ledger.mesh_displace_fbm(V, F, amplitude: 'float', *, scale=None, octaves: 'int' = 4, lacunarity: 'float' = 2.0, gain: 'float' = 0.5, seed: 'int' = 0) (die Implementierung direkt: import render3d; render3d.mesh_displace_fbm(V, F, amplitude: 'float', *, scale=None, octaves: 'int' = 4, lacunarity: 'float' = 2.0, gain: 'float' = 0.5, seed: 'int' = 0); aus dem Register: ops3d.get("mesh_displace_fbm"))
Raut ein Mesh auf, indem Vertices mit geseedetem fBm-Rauschen entlang ihrer Normalen verschoben werden → (V, F).
amplitude ist die maximale Verschiebung in den eigenen Einheiten des Meshs (das Itokawa-STL ist in km, also 0.003 = 3 m); jeder Vertex bewegt sich höchstens um amplitude (|fBm| ≤ 1, durch Tests gesichert). scale ist die Grundwellenlänge (Standard = Diagonale der Bounding Box / 12); octaves/lacunarity/gain formen das Spektrum (multifraktale Grate entstehen aus den standardmäßigen 4 Oktaven). Deterministisch für ein gegebenes seed; amplitude=0 gibt die Eingabe unverändert zurück. Die Flächennormalen des verschobenen Meshs tragen die passende Schattierungsstörung (es wird keine separate Bump Map vorgetäuscht). Fail-closed bei entarteten Meshes / nicht endlichen Argumenten.
Verschiebt jeden Vertex x_i entlang seiner flächengewichteten Vertexnormalen n_i nach x_i + amplitude · fBm(x_i) · n_i. fBm ist fbm_noise (Gitter-Value-Noise mit festem Seed; octaves Stufen werden mit der lacunarity-fachen Frequenz und der gain-fachen Amplitude überlagert und durch die Amplitudensumme geteilt, sodass [-1, 1] entsteht). Das Flächenarray F bleibt unverändert; Rückgabewert ist (V' (N,3) float64, Kopie von F).
• amplitude: maximale Verschiebung in Mesh-Einheiten (0 oder mehr). Negativ oder nicht endlich löst ValueError aus; bei 0 wird eine Kopie der Eingabe unverändert zurückgegeben (kein Rauschen berechnet).
• scale: Grundwellenlänge des Rauschens (Mesh-Einheiten). None = Diagonale der Bounding Box / 12. 0 oder weniger löst ValueError aus.
• octaves ∈ [1, 16], lacunarity > 0, gain ∈ (0, 1]; außerhalb des Bereichs wird ValueError ausgelöst.
• Normalen werden aus dem Umlaufsinn der Flächen gebildet, daher wird ein konsistent nach außen orientiertes Mesh angenommen. Vertices, deren Normale wegen Fläche null nicht bestimmbar ist, bewegen sich nach +Z (Ersatzwert von _vertex_normals).
Um die Amplitude pro Wellenlänge anzugeben oder Aliasing auf groben Meshes zu vermeiden, mesh_displace_spectrum (bandbegrenzt) verwenden. Um die Rauheit nicht in die Geometrie, sondern nur in die Schattierung zu legen, bump_normals_fbm.
• 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)terrain_region_mask · mesh_scatter_boulders · mesh_edge_lengths · mesh_subdivide · displacement_band_weights · 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.