mesh_subdivide — 3D terrain op

• Datenarten: mesh → mesh

• Aufruf: import fullseye as fs; fs.ledger.mesh_subdivide(V, F, *, levels: 'int' = 1, target_edge=None, max_faces: 'int' = 4000000) (die Implementierung direkt: import render3d; render3d.mesh_subdivide(V, F, *, levels: 'int' = 1, target_edge=None, max_faces: 'int' = 4000000); aus dem Register: ops3d.get("mesh_subdivide"))

Verwendung

Verfeinert ein Dreiecksnetz → (V, F) per Mittelpunktunterteilung oder adaptiver Tessellierung.

Entweder gleichmäßige Mittelpunktunterteilung (levels Durchgänge, ×4 Flächen je Schritt) oder adaptive Tessellierung auf eine Ziel-Kantenlänge (target_edge:

Median-Kante = Ziel, Kantensegmente ≤ 1.5×Ziel, Delaunay-Kanten in der Fläche < 2×Ziel).

Die Geometrie ist *unverändert* — jeder neue Vertex liegt auf einer alten Facette, daher bleiben Oberfläche und eingeschlossenes Volumen exakt erhalten (Tests fixieren das) und nichts wird jemals ausgedünnt; nur die Facettengröße ändert sich, sodass ein späteres mesh_displace_spectrum kurze Wellenlängen ohne Aliasing tragen kann.

Der adaptive Modus teilt jede Kante in n = round(length / target_edge) (≥ 1) Segmente — eine Anzahl pro *Kante*, daher konform zwischen Nachbarn (keine T-Knoten) — und füllt jede Fläche mit einem hexagonalen Gitter mit Abstand target_edge in der Flächenebene, trianguliert durch eine 2-D-Delaunay pro Fläche (Qhull). Das Innere hat daher Kanten ≈ target_edge, *unabhängig von der Form der Ausgangsfläche* (die Itokawa-Flächen von Gaskell haben ein medianes Verhältnis längste/kürzeste Kante von 1.83, sodass ein Gittermuster pro Fläche diese Anisotropie erben würde; wiederholte Mittelpunkthalbierung hinterlässt zusätzlich eine Streuung um den Faktor 2 (target/2, target]). Gemessen am Itokawa-Modell (Kante p5/Median/p95 = 2.6/4.7/7.2 m, Ziel 1.5 m): siehe examples_3d/itokawa_regolith_hero.py — der Test fixiert p95/p5 ≤ 1.5 auf einer abgestuften Ebene. max_faces (Standard MAX_SUBDIVIDE_FACES) ist ein Speicherschutz: würde der Plan ihn überschreiten, löst der Aufruf ValueError aus (fail-closed), statt stillschweigend zu grob zu verfeinern. Deterministisch. Fail-closed: degeneriertes Mesh, levels < 0, nicht positive target_edge / Obergrenzen → ValueError.

Es gibt 2 Modi; umgeschaltet wird danach, ob target_edge angegeben ist.

• target_edge=None (gleichmäßig): wiederholt die Unterteilung, die alle Kanten im Mittelpunkt teilt, levels-mal (die Flächenzahl vervierfacht sich mit jedem 1 Durchgang, Faktor 4). levels=0 gibt die Eingabe unverändert zurück. Wenn vor einem Durchgang face_count×4 > max_faces gilt, folgt ValueError.

• target_edge angegeben (adaptiv): für jede Kante wird die Segmentzahl n = round(length / target_edge) (mindestens 1) bestimmt und mit den Nachbarflächen geteilt, sodass keine T-Knoten entstehen. Die Segmentzahl wird stillschweigend begrenzt auf das interne Maximum 64; Kanten, die länger als das 64-Fache von target_edge sind, erreichen das Ziel nicht. Muss keine Kante geteilt werden, wird eine Kopie der Eingabe zurückgegeben. Überschreitet die Flächenschätzung Σ(sum of the 3 edges' segment counts + mean segment count²) den Wert max_faces, folgt vor der Berechnung ValueError. levels wird in diesem Modus nicht verwendet.

Rückgabewert (V (N',3) float64, F (M',3) int64). Neue Vertices liegen immer auf den ursprünglichen Flächen, daher ändern sich Fläche und Volumen nicht (keine Glättung). Der adaptive Modus verwendet pro Fläche eine 2-D-Delaunay (scipy Qhull), daher sinkt die Qualität bei extrem langgestreckten Flächen. Nach der Unterteilung mit mesh_edge_lengths die Kantenlängenverteilung prüfen und an mesh_displace_spectrum übergeben.

Referenzen (Beispieldaten, Literatur)

• 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.

Ausführbare Beispiele (verifizierte Samples, die diesen Operator wirklich aufrufen)

• itokawa_regolith_hero — py -3.11 examples_3d/itokawa_regolith_hero.py

Typkompatible Folge-Operatoren (nehmen mesh als Eingabe)

mesh_to_voxel · mesh_to_points · to_points · fuse_to_voxel · ambient_occlusion · cast_shadow · supersample_mesh · render_beauty

Gleiche Kategorie (terrain)

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