代码本色0章——Perlin噪声生成起伏地形
代码本色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噪声生成起伏地形相关推荐
- 代码本色——雪梨的Processing探索·Chapter 0:随机游走
概述 Chapter 0为我们介绍了随机数.概率和噪声在运动当中起到的变化作用,下面就让我们来好好的了解下这些数学名词,究竟可以起到怎样的公用,最后再让我们来发挥想象进行这些知识的运用创作. 原理介绍 ...
- 基于《代码本色》的processing学习与拓展
目录 1. 第0章 引言 2. 第1章 向量 3. 第2章 力 4. 第3章 振荡 5. 第4章 粒子系统 1. 第0章 引言 <代码本色>在这一章节的主要内容是模拟随机游走. 讲了利用r ...
- Unity 使用柏林噪声(Perlin Noise)生成网格地图
前言 最近在尝试制作一个基于网格地图的RPG游戏,所以想着自己生成一个网格地图. 但是网格地图的生成有很多的方式,大多数的方式都达不到我的要求,我需要一个地图可以随机生成各种地形,也可以储存一些地形数 ...
- Apollo6.0代码Lattice算法详解——Part5: 生成横纵向轨迹
Apollo6.0代码Lattice算法详解--Part5: 生成横纵向轨迹 0.前置知识 1.涉及主要函数 2.函数关系 3.部分函数代码详解 3.1 lattice_planner.cc中代码部分 ...
- 实时体积云渲染(地平线):二.Perlin噪声和Worley噪声
实时体积云渲染(地平线):二.Perlin噪声和Worley噪声 Perlin噪声 Perlin噪声同样是网格点噪声的一种,不同于之间在网格点生成随机值的白噪声,Perlin噪声在网格点生成一个随机的 ...
- perlin噪声函数
http://www.cnblogs.com/mikewolf2009/articles/1608087.html http://freespace.virgin.net/hugo.elias/mod ...
- FISHFOOD——代码本色
目录 游戏内容 1.开始界面 1. 设定了 **字体**.**大小**.**颜色**.**位置**: 2. 点击 **START** 开始游戏: 2.过度场景 1.得分情况 2.生命值 3.背景泡泡 ...
- Unity记录3.4-地图-柏林噪声生成 1D 地图及过渡地图
文章首发及后续更新:https://mwhls.top/4489.html,无图/无目录/格式错误/更多相关请至首发页查看. 新的更新内容请到mwhls.top查看. 欢迎提出任何疑问及批评,非常感谢 ...
- Unity记录3.3-地图-柏林噪声生成 2D 地图
文章首发及后续更新:https://mwhls.top/4486.html,无图/无目录/格式错误/更多相关请至首发页查看. 新的更新内容请到mwhls.top查看. 欢迎提出任何疑问及批评,非常感谢 ...
最新文章
- python的运行窗口-在 Python 窗口中执行工具
- 信息安全系统设计基础第二周学习总结
- 开源项目管理软件 禅道
- ‘小会计’的转行之旅
- Spring中配置数据源的4种形式 ---转
- php中的字典数据类型,python中字典数据类型常用操作
- 大学计算机python教材答案_大学计算机python答案
- Nodejs http request 报错 “ETIMEDOUT“,“ECONNRESET“ , “ENOTFOUND“,“ECONNREFUSED”,“EHOSTUNREACH“
- python方差分析样本量太大_十五、方差分析--使用Python进行单因素方差分析(ANOVA)...
- 如何让 MacBook 最适化 macOS Big Sur 和 Monterey 电池
- 使用python爬取电子书_怎样用python3爬取电子书网站所有下载链接
- python opencv入门 鼠标绘图(4)
- 计算机网络技术毕业生实习报告_计算机网络技术实习报告范文
- 15个很有趣的开源项目推荐
- 阿里云服务器代金券如何领取?阿里云高防GPU云服务器有优惠吗?
- 关于input框的兼容性问题
- 关于低代码技术方案调研
- 支持向量机SVM--sklearn.svm.SVC【机器学习笔记简摘】
- Pandas第三部分Day5练习题
- 申报书写作之如何区分研究内容和研究方法
热门文章
- Objective-C:神在细节之中
- freebsd双线代理服务器架设
- 计算机学院的优秀标语搞怪,幽默搞笑的学校寝室、宿舍标语集锦
- 智能手机怎样才能不会被定位追踪?
- android开发 spinner,Spinner的三种用法
- 下载java免安装包_下载并获取免安装版的JDK、JRE和源码包
- python作品简单手工做法_一次性纸杯手工制作灯笼制作方法图解教程
- php中的四舍五入,php中四舍五入取整函数详细介绍
- ctrl c复制浏览器html,桌面神器!按两下Ctrl+C,网页、文件一键收藏
- 南邮计算机网络复习试题,14南邮专硕数据结构试卷回忆(复习方法+前车之鉴)...