terrain op• 数据种类:mesh → mesh
• 调用: import fullseye as fs; fs.ledger.mesh_subdivide(V, F, *, levels: 'int' = 1, target_edge=None, max_faces: 'int' = 4000000)(要直接调用实现,import render3d; render3d.mesh_subdivide(V, F, *, levels: 'int' = 1, target_edge=None, max_faces: 'int' = 4000000);从台账取用则 ops3d.get("mesh_subdivide"))
用中点细分或自适应细分细化三角网格 → (V, F)。
可以是一致的中点细分(levels 遍,每遍 ×4 个面)或按目标边长的自适应细分(target_edge:中位边长 = target,边段 ≤ 1.5×target,面内 Delaunay 边 < 2×target)。
几何形状*不变* —— 每个新顶点都位于旧的小面上,因此表面积和封闭体积被精确保持(测试固定了这一点),且从不抽稀;只有小面的尺寸改变,因此之后的 mesh_displace_spectrum 可以承载短波长而不产生混叠。
自适应模式把每条边切成 n = round(length / target_edge)(≥ 1)段 —— 按*边*计数,因此相邻面之间保持一致(没有 T 形接点)—— 并在每个面内以面平面上间距为 target_edge 的六角格点填充,再按面做 2-D Delaunay(Qhull)三角化。因此内部的边 ≈ target_edge,*与源面的形状无关*(Gaskell 的 Itokawa 面最长/最短边比的中位数为 1.83,按面生成的格点图案会继承这种各向异性;反复的中点二分还会额外留下 2 倍的离散 (target/2, target])。在 Itokawa 模型上的实测(边 p5/中位数/p95 = 2.6/4.7/7.2 m,target 1.5 m):见 examples_3d/itokawa_regolith_hero.py —— 测试在渐变平面上固定 p95/p5 ≤ 1.5。max_faces(默认 MAX_SUBDIVIDE_FACES)是内存保护:若计划会超过它,调用会抛出 ValueError(fail-closed),而不是静默地细分不足。
确定性。Fail-closed:退化网格、levels < 0、非正的 target_edge / 上限 → ValueError。
有 2 种模式,按是否给出 target_edge 切换。
• target_edge=None(均匀):把所有边在中点切分的细分重复 levels 次(面数每 1 次变为 4 倍)。levels=0 原样返回输入。每次之前若 面数×4 > max_faces 则抛出 ValueError。
• 指定 target_edge(自适应):对每条边确定分段数 n = round(长度 / target_edge) (最少 1),由相邻面共享,因此不会出现 T 形接点。分段数会在内部上限 64 处 被静默截断,因此长度超过 target_edge 64 倍的边达不到目标。若没有任何边需要分割,则返回输入的副本。若面数估计 Σ(3 条边的分段数之和 + 平均分段数²) 超过 max_faces,则在计算前抛出 ValueError。此模式不使用 levels。
返回值 (V (N',3) float64, F (M',3) int64)。新顶点总是放在原来的面上,因此面积和体积不变(这不是平滑)。自适应模式按面使用 2-D Delaunay(scipy Qhull),因此在极端细长的面上质量会下降。细分后用 mesh_edge_lengths 确认边长分布,再传给 mesh_displace_spectrum。
• 示例数据目录(下载 URL / 许可证) —— 2-D 用 skimage.data(BSD/公有领域)加合成图,3-D 给出真实数据源(Stanford/PDS 等)的下载 URL。
• 算子来历与参考文献 —— 该算子族所依据的研究/方法出处。
• itokawa_regolith_hero — py -3.11 examples_3d/itokawa_regolith_hero.py
mesh 作为输入)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 · displacement_band_weights · mesh_displace_spectrum · bump_normals_fbm
*Provenance: render3d.py — 3D 算子登记表。本条目由 tools/opdocs.py md 自动生成(请勿手工编辑)。*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.