terrain op• 数据种类:mesh → mesh
• 调用: 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)(要直接调用实现,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);从台账取用则 ops3d.get("mesh_displace_fbm"))
用带 seed 的 fBm 噪声沿法线位移顶点,使网格变粗糙 → (V, F)。
amplitude 是以网格自身单位计的峰值位移(糸川的 STL 以 km 为单位,因此 0.003 = 3 m);每个顶点最多移动 amplitude(|fBm| ≤ 1,由测试断言)。scale 是基本波长(默认 = 包围盒对角线 / 12); octaves/lacunarity/gain 决定频谱形状(多重分形的脊来自默认的 4 个倍频程)。给定 seed 时结果确定;amplitude=0 原样返回输入。位移后网格的面法线带有相应的着色扰动(不另外伪造 bump map)。对退化网格 / 非有限参数 fail-closed。
将各顶点 x_i 沿面积加权顶点法线 n_i 移动到 x_i + amplitude · fBm(x_i) · n_i。fBm 是 fbm_noise(seed 固定的格点 value noise,将 octaves 级按 lacunarity 倍频率、gain 倍振幅叠加,再除以振幅和得到 [-1, 1])。不改变面数组 F,返回值为 (V' (N,3) float64, F 的副本)。
• amplitude:以网格单位计的最大位移(0 以上)。负值、非有限值抛出 ValueError,为 0 时原样返回输入的副本(不计算噪声)。
• scale:噪声的基本波长(网格单位)。None = 包围盒对角线 / 12。0 以下抛出 ValueError。
• octaves ∈ [1, 16]、lacunarity > 0、gain ∈ (0, 1],超出范围抛出 ValueError。
• 法线由面的环绕顺序生成,因此假定网格一致朝外。因面积为零而无法确定法线的顶点向 +Z 移动(_vertex_normals 的替代值)。
若要按波长指定振幅、或在粗网格上避免混叠,请使用 mesh_displace_spectrum(带频带限制)。若不把粗糙度放入几何而只加在着色上, 请用 bump_normals_fbm。
• 示例数据目录(下载 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)terrain_region_mask · mesh_scatter_boulders · mesh_edge_lengths · mesh_subdivide · 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.