代码本色0章——Perlin噪声生成起伏地形

此博文依据代码本色第0章中的随机数与Perlin噪声运用写成,并观看了丹尼尔希夫曼关于perlin噪声的讲解,https://www.youtube.com/watch?v=D8UgRyRnvXU,大家可以看一看

参考案例

效果图

Perlin噪声

一个好的随机数生成器能产生互不关联且毫无规律的随机数。跟我们前面看到的一样,一定程度的随机性有利于有机体和生命活动的建模。然而,单独把随机性作为唯一指导原则是不够的,它并不完全符合自然界的特征,Perlin噪声将这一点考虑在内了,此算法可用于生成各种自然特效,包括云层、地形和大理石纹理。
Perlin噪声算法表现出了一定的自然性,因为它能生成符合自然排序(“平滑”)的伪随机数序列。
processing内置了Perlin噪声算法的实现:noise()函数。noise()函数可以有1~3个参数,分别代表,一维,二维,三维的随机数。

图(a)
图(b)
图(a)为noise函数,图(b)为random函数可见noise函数更为光滑,没有图(b)中小球跳跃的感觉,可见,noise函数可以是的图形更加平滑和连续。

void setup(){   size(400, 400); }
float t=3;
void draw(){   background(255); translate(100,100);    float n=map(noise(t),0,1,-100,100);   ellipse(n,180,16,16);  t+=0.1; } 

此代码看起来很简单,但是切记需要用,map()函数来约束noise的范围,关于map函数可以在官网reference找到,这里就不解释了。

地形绘制

首先观察上面的图,会发现一下规律:
1.起伏的地形由很多三角形组成,且三角形大小相同;
2.地形起伏随机;
从图上我们只能看出这么多信息。下面我们来实践

三角形区域创建

//

首先,第一步,我们先生成多个小网格,首先就会想到用rect()函数,于是生成了上面,但是我们发现,如果是这样,生成三角形就会有困难,因为效果图中绘制的三角形并不在直线上,因此我们想到processing自带的vertex()函数,于是图形又成了这样

//

int cols,rows;int density=20; void setup() {    size(600, 400);    int w=600;    int h=800;    cols=w/density;    rows=h/density;}  void draw() {    background(0);   stroke(255);    noFill();    for(int x=0;x<cols;x++)    {      beginShape(TRIANGLE_STRIP);     for(int y=0;y<rows-1;y++)      {        vertex(y*density,x*density);        vertex(y*density,(x+1)*density);      }      endShape();    }
} 

//

完成上面的步骤之后,我们会发现这还只是在二维平面上的,我们要怎么样转成三维的呢?其实只要在size()里面加入P3D这个参数即可,所以图形又变成了这样。

///
这个地方要注意的是,成为三维图形之后,需要调整角度,即用rotate()函数将图形转一转,同时还需要调整图形显示的地方才可以看见,不然就是一条线或者一片黑。同时随时改变三角形的顶点,即可生成如下效果。

/

//
为了使用方便我们新建一个二维矩阵,存储变化的点。
代码如下:

  float[][] terrain;  void setup() {    size(600, 600,P3D);    cols=w/density;    rows=h/density;     terrain=new float[cols][rows];  }    void draw() {      for(int x=0;x<cols;x++)    {      for(int y=0;y<rows;y++)        terrain[x][y]=map(noise(x,y),0,1,-50,50);    }    background(0);    stroke(255);    noFill();    translate(width/2,height/2);    rotateX(PI/4);    translate(-w/2,-h/2);    for(int x=0;x<cols;x++)    {      beginShape(TRIANGLE_STRIP);      for(int y=0;y<rows-1;y++)     {       vertex(y*density,x*density,terrain[x][y]);        vertex(y*density,(x+1)*density,terrain[x][y+1]);      }      endShape();    }
}  

之后呢,我们需要让此地形起伏慢一点并且,能够运动起来,我们选择其中的因此,可知我们只需改变noise()的x,y值即可,以y为例,我们每次绘制的时候都变化0.1(加减都可);

jump-=0.1;
float yoff=0;
for(int y=0;y<rows;y++)
{
float xoff=jump;
for(int x=0;x<cols;x++)
{
terrain[x][y]=map(noise(xoff,yoff),0,1,-100,100);
xoff+=0.2;
}
yoff+=0.2;
} 

上面的代码段加载draw函数中,这样才能动起来

至此,我们就完成了地形构造。改变其中的density可以改变地形的平缓度,改变下off,yoff,可以让地形沿着不同的方向生成,大家感兴趣可以自己试一试!
为了方便大家,以下贴出所有代码。

int cols,rows;
int density =20;
int w=2000;
int h=1600;
float[][] terrain;
float jump=0;
void setup()
{
size(600,600,P3D);
cols=w/density;
rows=h/density;
terrain=new float[cols][rows];
}
void draw()
{
jump-=0.1;
float yoff=jump;
for(int y=0;y<rows;y++)
{
float xoff=0;
for(int x=0;x<cols;x++)
{
terrain[x][y]=map(noise(xoff,yoff),0,1,-100,100);
xoff+=0.2;
}
yoff+=0.2;
}
background(0);
stroke(255);
noFill();
translate(width/2,height/2+50);
rotateX(PI/3);
translate(-w/2,-h/2);
for(int y=0;y<rows-1;y++)
{
beginShape(TRIANGLE_STRIP);
for(int x=0;x<cols;x++)
{
vertex(x*density,y*density,terrain[x][y]);
vertex(x*density,(y+1)*density,terrain[x][y+1]);
}
endShape();
}        } 

代码本色0章——Perlin噪声生成起伏地形相关推荐

  1. 代码本色——雪梨的Processing探索·Chapter 0:随机游走

    概述 Chapter 0为我们介绍了随机数.概率和噪声在运动当中起到的变化作用,下面就让我们来好好的了解下这些数学名词,究竟可以起到怎样的公用,最后再让我们来发挥想象进行这些知识的运用创作. 原理介绍 ...

  2. 基于《代码本色》的processing学习与拓展

    目录 1. 第0章 引言 2. 第1章 向量 3. 第2章 力 4. 第3章 振荡 5. 第4章 粒子系统 1. 第0章 引言 <代码本色>在这一章节的主要内容是模拟随机游走. 讲了利用r ...

  3. Unity 使用柏林噪声(Perlin Noise)生成网格地图

    前言 最近在尝试制作一个基于网格地图的RPG游戏,所以想着自己生成一个网格地图. 但是网格地图的生成有很多的方式,大多数的方式都达不到我的要求,我需要一个地图可以随机生成各种地形,也可以储存一些地形数 ...

  4. Apollo6.0代码Lattice算法详解——Part5: 生成横纵向轨迹

    Apollo6.0代码Lattice算法详解--Part5: 生成横纵向轨迹 0.前置知识 1.涉及主要函数 2.函数关系 3.部分函数代码详解 3.1 lattice_planner.cc中代码部分 ...

  5. 实时体积云渲染(地平线):二.Perlin噪声和Worley噪声

    实时体积云渲染(地平线):二.Perlin噪声和Worley噪声 Perlin噪声 Perlin噪声同样是网格点噪声的一种,不同于之间在网格点生成随机值的白噪声,Perlin噪声在网格点生成一个随机的 ...

  6. perlin噪声函数

    http://www.cnblogs.com/mikewolf2009/articles/1608087.html http://freespace.virgin.net/hugo.elias/mod ...

  7. FISHFOOD——代码本色

    目录 游戏内容 1.开始界面 1. 设定了 **字体**.**大小**.**颜色**.**位置**: 2. 点击 **START** 开始游戏: 2.过度场景 1.得分情况 2.生命值 3.背景泡泡 ...

  8. Unity记录3.4-地图-柏林噪声生成 1D 地图及过渡地图

    文章首发及后续更新:https://mwhls.top/4489.html,无图/无目录/格式错误/更多相关请至首发页查看. 新的更新内容请到mwhls.top查看. 欢迎提出任何疑问及批评,非常感谢 ...

  9. Unity记录3.3-地图-柏林噪声生成 2D 地图

    文章首发及后续更新:https://mwhls.top/4486.html,无图/无目录/格式错误/更多相关请至首发页查看. 新的更新内容请到mwhls.top查看. 欢迎提出任何疑问及批评,非常感谢 ...

最新文章

  1. python的运行窗口-在 Python 窗口中执行工具
  2. 信息安全系统设计基础第二周学习总结
  3. 开源项目管理软件 禅道
  4. ‘小会计’的转行之旅
  5. Spring中配置数据源的4种形式 ---转
  6. php中的字典数据类型,python中字典数据类型常用操作
  7. 大学计算机python教材答案_大学计算机python答案
  8. Nodejs http request 报错 “ETIMEDOUT“,“ECONNRESET“ , “ENOTFOUND“,“ECONNREFUSED”,“EHOSTUNREACH“
  9. python方差分析样本量太大_十五、方差分析--使用Python进行单因素方差分析(ANOVA)...
  10. 如何让 MacBook 最适化 macOS Big Sur 和 Monterey 电池
  11. 使用python爬取电子书_怎样用python3爬取电子书网站所有下载链接
  12. python opencv入门 鼠标绘图(4)
  13. 计算机网络技术毕业生实习报告_计算机网络技术实习报告范文
  14. 15个很有趣的开源项目推荐
  15. 阿里云服务器代金券如何领取?阿里云高防GPU云服务器有优惠吗?
  16. 关于input框的兼容性问题
  17. 关于低代码技术方案调研
  18. 支持向量机SVM--sklearn.svm.SVC【机器学习笔记简摘】
  19. Pandas第三部分Day5练习题
  20. 申报书写作之如何区分研究内容和研究方法

热门文章

  1. Objective-C:神在细节之中
  2. freebsd双线代理服务器架设
  3. 计算机学院的优秀标语搞怪,幽默搞笑的学校寝室、宿舍标语集锦
  4. 智能手机怎样才能不会被定位追踪?
  5. android开发 spinner,Spinner的三种用法
  6. 下载java免安装包_下载并获取免安装版的JDK、JRE和源码包
  7. python作品简单手工做法_一次性纸杯手工制作灯笼制作方法图解教程
  8. php中的四舍五入,php中四舍五入取整函数详细介绍
  9. ctrl c复制浏览器html,桌面神器!按两下Ctrl+C,网页、文件一键收藏
  10. 南邮计算机网络复习试题,14南邮专硕数据结构试卷回忆(复习方法+前车之鉴)...