【互动媒体创意编程0】柏林噪声生成的随机地形

这篇博客介绍了如何利用Processing库中的柏林噪声生成随机地形。作者通过详细讲解随机游走和泊松噪声的概念,展示了如何将二维平面转化为动态的三维地形。通过调整噪声参数和利用rotate()函数改变视角,实现了地形的滚动效果。最后,提供了完整的代码示例。

【互动媒体创意编程0】柏林噪声生成的随机地形

前言

重接从结课以来陆陆续续一边学一边写的大作业。
这大概是最近时间里写得最舒服的一科作业了。除了偶尔有的bug,整体来说难度都不高,并且写出来真的非常好看也非常有意思。
《代码本色》是我从大一的时候就知道的一本书,但知道最近才真正仔仔细细去看一遍。现在我将前面五章内容的作业写到一个文档中,因为它们之间彼此有一些联系,也可以从相互之间得到一些启发。
我在构思的前期花费了很多时间。相关的想法网上有很多,但是都不是很有趣。因此我花费了很多时间在油管上找了一些实例,参考了一些,也仿写了一些。(有一些想法真的是很妙呀。)

第0章:随机游走和泊林噪声

这是模仿youtube上的一个代码挑战编写的程序。先来看效果:

在这里插入图片描述
比较显而易见的是,这样的地形很显然是由一块平整地形进行局部节点拔高形成的。
在二维平面中,我们很容易能够将整块画布切分为一定密度的网格,只需要计算它的行和列,并连接成线即可。
不过,我们如果想要一块可以动的地形,那么就必然不可能通过画线来实现这样的网格,除非我们计算每一个节点的位置,然而这样的做法很显然是没有必要的。
processing为用户定义了绘制特定图形的方法,即beginShape()、vertex()以及endShape()。通过这三个函数,我们将能够利用计算好的节点位置批量生成图形。在这里,这个方法显现出了巨大的优势。
在这里插入图片描述

代码也很简单:

int cols,rows;  
int density =20; 
color currentColor;
int scl = 20;

void setup(){
   
   
  size(900,600,P3D);  
  int w = 900;
  int h = 600;
  cols = w/scl;
  rows = h/ scl;
}  


void draw()  {
   
            
  background(0);     
  stroke(255);     
  noFill();        

  for(int y=0;y < rows;y++){
   
         
    beginShape(TRIANGLE_STRIP);            
    for(int x=0; x
### 使用 Python 实现基于柏林噪声地形生成 以下是使用 Perlin 噪声生成地形的一个完整代码示例。此代码利用了 `noise` 库来生成二维数组中的高度值,这些值可以表示地形的高度。 #### 安装依赖库 为了简化开发过程,推荐使用第三方库 `noise` 来生成 Perlin 噪声。可以通过以下命令安装该库[^2]: ```bash pip install noise ``` #### 地形生成代码示例 下面是一个完整的 Python 脚本,展示如何使用 Perlin 噪声生成地形并将其可视化为灰度图像。 ```python import numpy as np from PIL import Image import noise def generate_perlin_noise(width, height, scale=10.0, octaves=6, persistence=0.5, lacunarity=2.0): """ 生成基于 Perlin 噪声的二维数组。 参数: width (int): 输出网格宽度。 height (int): 输出网格高度。 scale (float): 控制噪声频率的比例因子。 octaves (int): 噪声层次的数量。 persistence (float): 后续八度的影响程度。 lacunarity (float): 频率增加的速度。 返回: list[list[float]]: 表示 Perlin 噪声的二维列表。 """ terrain = [] for y in range(height): row = [] for x in range(width): value = noise.pnoise2(x / scale, y / scale, octaves=octaves, persistence=persistence, lacunarity=lacunarity, repeatx=width, repeaty=height, base=0) row.append(value) terrain.append(row) return terrain def normalize_and_convert_to_image(terrain_data, size): """ 将 Perlin 噪声数据标准化到 [0, 255] 并转换为图像对象。 参数: terrain_data (list[list[float]]): Perlin 噪声数据。 size (tuple[int]): 图像尺寸 (宽, 高)。 返回: Image.Image: 可视化的灰度图像。 """ normalized = np.array(terrain_data).reshape(size) normalized -= normalized.min() # 归一化到 [0, max-min] normalized /= normalized.max() image_array = (normalized * 255).astype(np.uint8) return Image.fromarray(image_array) if __name__ == "__main__": WIDTH, HEIGHT = 512, 512 # 设置输出图像大小 SCALE = 100.0 # 缩放比例控制细节密度 OCTAVES = 6 # 层数越多越复杂 PERSISTENCE = 0.5 # 持久性影响后续层的重要性 LACUNARITY = 2.0 # 孔隙率决定每层之间的频率变化 perlin_terrain = generate_perlin_noise(WIDTH, HEIGHT, SCALE, OCTAVES, PERSISTENCE, LACUNARITY) terrain_image = normalize_and_convert_to_image(perlin_terrain, (WIDTH, HEIGHT)) terrain_image.save("perlin_terrain.png") # 保存生成地形图 terrain_image.show() # 显示图片 ``` 以上脚本会生成一张名为 `perlin_terrain.png` 的文件,并显示出来。这张图片展示了由 Perlin 噪声生成地形,其中较亮的部分代表较高的海拔区域,而较暗的部分则对应较低的区域。 --- ### 关键参数解释 - **Scale**: 控制噪声的空间频率。较大的数值会使地形更加平滑,较小的数值会产生更复杂的细节[^1]。 - **Octaves**: 决定叠加多少层噪声。层数越高,地形越复杂且具有更多细节。 - **Persistence**: 这个值决定了每一层对最终结果的影响权重。通常取值范围在 `(0, 1)` 之间[^1]。 - **Lacunarity**: 控制每层噪声之间的频率差异。默认值为 `2.0`,意味着每次迭代都会使频率加倍[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值