terrain op• 数据种类:mesh → matrix
• 调用: import fullseye as fs; fs.ledger.displacement_band_weights(V, F, wavelengths=(0.06, 0.03, 0.015, 0.0075, 0.00375), *, nyquist: 'float' = 2.0, fade: 'float' = 1.0, local_edge=None) -> 'np.ndarray'(要直接调用实现,import render3d; render3d.displacement_band_weights(V, F, wavelengths=(0.06, 0.03, 0.015, 0.0075, 0.00375), *, nyquist: 'float' = 2.0, fade: 'float' = 1.0, local_edge=None) -> 'np.ndarray';从台账取用则 ops3d.get("displacement_band_weights"))
逐倍频、逐顶点的频带门 (K, N),取值 [0,1]。
网格能把该波长作为几何承载处为 1,会混叠处为 0。
局部边长为 e 的顶点(相接边的平均,mesh_edge_lengths,或给出时的 local_edge (N,))仅当 λ ≥ nyquist·e 时才承载波长 λ;门控从 λ = nyquist·e 处的 0 线性升到 λ = (nyquist+fade)·e 处的 1 (fade=0 → 硬截断)。Itokawa 流水线以两种方式使用它:(i) 在*渲染用* 网格上决定哪些八度可以位移(其余交给凹凸法线);(ii) 在 *源*模型上测量真实数据已经承载了哪些波长 —— 其补集 1 − gate 就是合成起伏的权重(数据精细处为 0,粗糙处为 1),因此密集区域不会被重复加纹理。确定性。
计算针对 ratio = λ_k / e_i:若 fade == 0 则为 gate = (ratio ≥ nyquist) 的二值,否则为 gate = clip((ratio − nyquist) / fade, 0, 1)。返回值为 float64 (K, N)(K = 波长数,N = 顶点数)。
• wavelengths:网格单位的波长序列(空、非正、非有限时抛出 ValueError)。传入与 mesh_displace_spectrum 相同的序列。
• nyquist:视为“可作为几何承载”的波长/边长比的下限(默认 2 = 1 个波长对应 2 条边)。0 及以下抛出 ValueError。
• fade:过渡宽度(边长的倍数)。0 为硬阈值。负值抛出 ValueError。
• local_edge:自行给出每个顶点的边长 (N,) 时使用(相当于 mesh_edge_lengths 的 per='vertex')。长度不一致、非正、非有限时抛出 ValueError。若为 None,
则在内部调用 mesh_edge_lengths。
mesh_displace_spectrum 在内部调用本函数,因此通常无需直接调用。直接
使用的情形是:测量源数据已承载的波长并把 1 − gate 作为 weights 传入(不在精细处重复叠加合成起伏)时,以及决定交给 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
matrix 作为输入)terrain)mesh_displace_fbm · terrain_region_mask · mesh_scatter_boulders · mesh_edge_lengths · mesh_subdivide · 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.