You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成带低值偏向的Simplex噪声以优化岛屿生成?

实现带低值偏向的分散型Simplex噪声岛屿生成

以下是几个在不损失Simplex噪声平滑性的前提下,实现岛屿分散、数量减少且带低值偏向的实用方案:

1. 非线性低值偏向映射

Simplex噪声原生输出在[-1,1]区间,高低值分布相对均匀。通过非线性函数将噪声值向低值(海洋)偏移,压缩高值(岛屿)的占比,同时完全保留平滑特性:

def low_bias_normalize(noise_val, bias_strength=2.0):
    # 先将噪声值映射到[0,1]区间
    normalized = (noise_val + 1.0) / 2.0
    # 应用低值偏向:放大低值权重,高值区域被压缩
    biased = 1.0 - (1.0 - normalized) ** bias_strength
    return biased

bias_strength参数越大,低值偏向越显著,岛屿会变得更少、更孤立。调整这个值可以直接控制岛屿的稀疏程度。

2. 大尺度掩码噪声叠加

用低频、大尺度的Simplex噪声作为"分布掩码",过滤主噪声的高值区域。大尺度噪声的平滑度高,能生成大范围的无岛屿区域,自然拉开岛屿间距:

def masked_simplex_islands(x, y, detail_scale=80.0, mask_scale=400.0, bias=2.5):
    # 主噪声:负责岛屿的细节纹理
    main_noise = simplex_noise.simplex2(x/detail_scale, y/detail_scale)
    # 掩码噪声:控制岛屿的整体分布范围
    mask_noise = simplex_noise.simplex2(x/mask_scale, y/mask_scale)
    
    # 对掩码噪声应用低值偏向,再与主噪声相乘
    biased_mask = low_bias_normalize(mask_noise, bias)
    final_noise = main_noise * biased_mask
    
    # 最终映射回[0,1]区间供阈值判断
    return (final_noise + 1.0) / 2.0

掩码噪声的尺度越大,岛屿的分布范围越分散,不会出现连片的情况,同时两种噪声的平滑性完全保留。

3. 距离衰减的阈值优化

在生成初始噪声图后,通过计算岛屿区域到海洋的距离,对过近的岛屿边缘进行衰减处理,强制保证最小间距:

import numpy as np
from scipy.ndimage import distance_transform_edt

def enforce_island_spacing(noise_map, threshold=0.6, min_island_distance=25):
    # 标记海洋区域(低于阈值)
    ocean_mask = noise_map < threshold
    # 计算每个点到最近海洋的距离
    distance_to_ocean = distance_transform_edt(ocean_mask)
    
    # 对距离小于最小间距的岛屿区域进行线性衰减
    decay_region = distance_to_ocean < min_island_distance
    noise_map[decay_region] *= (distance_to_ocean[decay_region] / min_island_distance)
    
    return noise_map

这个方法不会破坏原有噪声的平滑性,只是弱化了过近的岛屿边缘,最终只保留间距足够的核心岛屿区域。

4. Voronoi种子+Simplex细节的混合方案

如果需要严格控制岛屿数量和间距,可以用Voronoi噪声生成均匀分布的种子点,再用Simplex噪声为种子点生成平滑的岛屿边缘:

def seeded_island_generator(x, y, island_count=15, detail_scale=60.0):
    # 生成随机分布的岛屿种子点
    seed_points = np.random.rand(island_count, 2) * 1000  # 假设地图范围为0-1000
    # 计算当前点到最近种子的距离
    nearest_seed_dist = np.min(np.sqrt((seed_points[:,0]-x)**2 + (seed_points[:,1]-y)**2), axis=0)
    # 用Simplex噪声扰动距离值,生成自然平滑的岛屿边缘
    simplex_disturb = simplex_noise.simplex2(x/detail_scale, y/detail_scale) * 0.15
    # 反转距离值并做归一化,实现"种子附近为岛屿"的效果
    final = 1.0 - np.clip((nearest_seed_dist / np.max(nearest_seed_dist)) + simplex_disturb, 0, 1)
    return final

通过调整island_count可以直接控制岛屿数量,detail_scale控制岛屿边缘的平滑度,完全不会出现岛屿连接的问题,同时保留Simplex噪声的自然质感。

内容的提问来源于stack exchange,提问作者ItsCre3per

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 17:43:23