mesh_displace_spectrum — 3D terrain op

• 数据种类:mesh → mesh

• 调用: import fullseye as fs; fs.ledger.mesh_displace_spectrum(V, F, wavelengths=(0.06, 0.03, 0.015, 0.0075, 0.00375), amplitudes=(0.003, 0.00176, 0.00103, 0.0006, 0.00035), *, seed: 'int' = 0, nyquist: 'float' = 2.0, fade: 'float' = 1.0, weights=None, local_edge=None)(要直接调用实现,import render3d; render3d.mesh_displace_spectrum(V, F, wavelengths=(0.06, 0.03, 0.015, 0.0075, 0.00375), amplitudes=(0.003, 0.00176, 0.00103, 0.0006, 0.00035), *, seed: 'int' = 0, nyquist: 'float' = 2.0, fade: 'float' = 1.0, weights=None, local_edge=None);从台账取用则 ops3d.get("mesh_displace_spectrum"))

用法

以明确给出的振幅谱、带限地沿法线位移顶点。

带限按顶点进行;返回 (V, F)。

displacement_i = Σ_k A_k · n_k(x_i) · gate_k(i) · w_k(i),其中每个 (wavelength_k, amplitude_k) 对各有一个带 seed 的 value-noise 八度 n_k ∈ [−1, 1](网格单位 —— Itokawa 的 STL 以 km 为单位,因此默认在 60 m 处为 3 m,按 A ∝ λ^0.77 下降到 3.75 m 处的 0.35 m),gate = 在*本*网格上的 displacement_band_weights (短于 nyquist × local edge 的八度不施加 —— 它会混叠成

小面噪声;请改交给 bump_normals_fbm),weights = 可选的 (N,) 每顶点或 (K, N) 每八度每顶点、取值于 [0,1] 的系数(例如源模型的合成起伏权重 1 − gate)。顶点处的峰值位移至多为 Σ_k A_k(测试固定了这一点)。与 mesh_displace_fbm(单一振幅、八度比 2、无频带限制)不同,每个八度的振幅都是显式的。在 seed 下确定。对形状/非有限/负值 fail-closed。

步骤:(1) 用 displacement_band_weights 生成 gate (K,N),(2) 若有 weights 则乘上它,(3) 对每个八度 k 评估 seed 固定的 value noise n_k(x) ∈ [-1,1](波长 λ_k,格点偏移随八度编号变化),把 Σ_k A_k · gate_k · n_k 作为沿法线方向的位移,(4) 沿面积加权的顶点法线移动顶点。返回值 (V' (N,3) float64, F 的副本)。

• wavelengths / amplitudes:长度相同(1〜32 个)的正数序列。网格单位。个数不一致、空、33 个以上、负振幅、amplitudes=None 时抛出 ValueError。振幅为 0 的八度跳过评估。

• nyquist / fade / local_edge:频带门控的设置(与 displacement_band_weights 相同)。

• weights:(N,) 时为所有八度共用的系数,(K,N) 时为各八度各自的系数。值限于 [0, 1],超出范围或形状不一致时抛出 ValueError。

• seed:相同的 seed 与 bump_normals_fbm 共享同一格点(几何无法承载的八度可以连续地交给阴影一侧)。

与 mesh_displace_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)

mesh_displace_fbm · terrain_region_mask · mesh_scatter_boulders · mesh_edge_lengths · mesh_subdivide · displacement_band_weights · bump_normals_fbm


*Provenance: render3d.py — 3D 算子登记表。本条目由 tools/opdocs.py md 自动生成(请勿手工编辑)。*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.