时间:2017/1/26 大三上学年寒假

每次寒假都挺闲的,恰好最近家里网又不太稳定,不能LOL!于是想趁这个机会,利用OpenGL,尝试着写一个仿造的《Minecraft》。但是,思来想去发现Minecraft的地形生成算法实在难以下手,因为地形需要具有:随机但又连续、复杂但又自然的效果。

凑巧在github上偶尔看到一个项目,一个大神写的minecraft,做的非常非常好。然后在他的说明文档里,注意到这个算法PerlinNoise。于是,决定写几篇博客,来总结一下关于PerlinNoise的知识。

这里也附上我使用Qt+OpenGL实现的minecraft的结果。

相关文章:

[1]博客 - [数学][转载]柏林噪声 :http://www.cnblogs.com/Memo/archive/2008/09/08/1286963.html

[2]gitbub - A simple Minecraft clone written in C using modern OpenGL (shaders). https://github.com/fogleman/Craft

[3] 我的另一篇博客《我的世界minecraft》:http://blog.csdn.net/mahabharata_/article/details/55505403

我实现的《myMinecraft》的截图:

我实现的Minecraft演示程序的下载链接:

http://download.csdn.net/detail/mahabharata_/9756981

下面这个PerlinNoise演示程序的下载链接,大家可以自己调整参数来设计自己的柏林噪声~~~

http://download.csdn.net/detail/mahabharata_/9800578

柏林噪声Perlin Noise:

关于柏林噪声的原理和算法在参考文献[1]的博客中,已经描述的非常详细。我在阅读Perlin的论文和其它博客后,先写了一个一维PerlinNoise的演示程序~。在写完这个演示程序之后,发现原来不懂的东西,现在变得直观多了!!下面写一下在演示程序中,总结的一些柏林噪声的规律。

首先上一下PerlinNoise演示程序的截图~(很简陋,一晚上写的),大家可以自己下载下来这个程序去简单模拟一下~

1. 持续度Persistence [ float ]:我设定的范围是(0,1]。

持续度越大,频率frequency越大,振幅amplitude也越大(反应在图像上,直观的表现为:波动更剧烈,更尖锐)。

2. 倍频Octaves [ int ]:我设定的范围是[0,99]

倍频越大,频率和振幅也有所增加(图像波动变大)

3.  噪声点间距Delta [ float ],在文章中没说到的一个值,简单的说就相当于我们数学求导中的dx,在这里相邻噪声数据的间隔。我第一次设定为1,显然生成的噪声波动很剧烈。之后较多采用的一个值是0.001,产生的数据就规律多了~上图说话!

上面Perlin Noise演示程序采用的柏林噪声的2D版([x,y]->z):

float persistence = 0.50;
int Number_Of_Octaves = 4;double Noise(int x,int y)    // 根据(x,y)获取一个初步噪声值
{int n = x + y * 57;  n = (n<<13) ^ n;return ( 1.0 - ( (n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0);
}double SmoothedNoise(int x, int y)   //光滑噪声
{double corners = ( Noise(x-1, y-1)+Noise(x+1, y-1)+Noise(x-1, y+1)+Noise(x+1, y+1) ) / 16;double sides = ( Noise(x-1, y) +Noise(x+1, y) +Noise(x, y-1) +Noise(x, y+1) ) / 8;double center = Noise(x, y) / 4;return corners + sides + center;
}
double Cosine_Interpolate(double a,double b, double x)  // 余弦插值
{double ft = x * 3.1415927;double f = (1 - cos(ft)) * 0.5;return a*(1-f) + b*f;
}double InterpolatedNoise(float x,float y)   // 获取插值噪声
{int integer_X = int(x);float  fractional_X = x - integer_X;int integer_Y = int(y);float fractional_Y = y - integer_Y;double v1 = SmoothedNoise(integer_X, integer_Y);double v2 = SmoothedNoise(integer_X + 1, integer_Y);double v3 = SmoothedNoise(integer_X, integer_Y + 1);double v4 = SmoothedNoise(integer_X + 1, integer_Y + 1);double i1 = Cosine_Interpolate(v1, v2, fractional_X);double i2 = Cosine_Interpolate(v3, v4, fractional_X);return Cosine_Interpolate(i1, i2, fractional_Y);
}double PerlinNoise(float x,float y)    // 最终调用:根据(x,y)获得其对应的PerlinNoise值
{double total = 0;double p = persistence;int n = Number_Of_Octaves;for(int i=0; i<n; i++){double frequency = pow(2,i);double amplitude = pow(p,i);total = total + InterpolatedNoise(x * frequency, y * frequency) * amplitude;}return total;
}

[算法]柏林噪声 Perlin Noise相关推荐

  1. 3D数学之柏林噪声(Perlin Noise)

    好了,转入正题. 其实它的原理并不是很难,但是由于网上实现的版本太多太杂,真要实现起来竟然不知从何处下手,而且自己写的时候会遇到各种各样的问题.最终写出来了,所以很欣然. 先看下,我在网上找的一些资料 ...

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

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

  3. Unity 动态网格地图的生成:基于Perlin Noise创建地形

    前言: 在前面的文章中,写了一个简单的网格地图生成脚本,不过是基于二维空间来完成的.为了更好的拓展该脚本,同时去了解学习大世界地图加载的一些知识,这段时间会通过一个系列的文章做一个类似于我的世界那样的 ...

  4. html 生成image java makenoise,[图形学] 柏林噪声 (perlin noise)

    参考论文:<An Image Synthesizer> Ken Perlin 如果你是游戏玩家,你也许曾在游戏风景中驻足,并仔细观察草木和岩石的贴图,并感叹于它那看似杂乱而又自然的纹脉.你 ...

  5. 木木的Unity学习笔记(四)—— Unity中的柏林噪声(Perlin Noise)

    木木的Unity学习笔记(四)-- Unity中的柏林噪声 柏林噪声是一个非常强大算法,经常用于程序生成随机内容,在游戏和其他像电影等多媒体领域广泛应用.算法发明者Ken Perlin也因此算法获得奥 ...

  6. 柏林噪声(Perlin Noise)

    什么是柏林噪声? 说起噪声大家可能会想起这个: 但是这个噪声看起来很不自然,而且现实中的自然噪声并不长这个样子,比如起伏的山脉,大理石的纹理,天空的云彩,这些噪声虽然看起来杂乱无章,其实它们都有着内在 ...

  7. 【转载】柏林噪声算法

    转载自:https://www.cnblogs.com/leoin2012/p/7218033.html   原作者:立航 柏林噪声是一个非常强大算法,经常用于程序生成随机内容,在游戏和其他像电影等多 ...

  8. 一篇文章搞懂柏林噪声算法,附代码讲解

    本文目的是以一种通俗简单的方式介绍Ken Perlin的改进版柏林噪声算法,讲解代码采用c#编写,开源免费使用.如果你只是想看完整代码,点击这里. 柏林噪声是一个非常强大算法,经常用于程序生成随机内容 ...

  9. 柏林噪声算法制作地图+小地图

    以上是效果展示 1,柏林噪声算法做地图代码 using System.Collections; using System.Collections.Generic; using UnityEngine; ...

最新文章

  1. maven的pom报plugins错误的解决方法.
  2. python官方推荐的三本书-如果只能推荐3本关于python的书,你会推荐哪3本?
  3. 关于addr=u32(r.recvuntil(‘\xf7‘)[-4:])的解释
  4. Linux bind-utils
  5. Hybris里类似ABAP Netweaver的DDIC - 如何做data type的extension
  6. 从零开始来看一下Java泛型的设计
  7. SpringMVC 的执行流程
  8. 华为畅享20 Pro测评:5G双模六频段+90Hz刷新率屏幕
  9. 汉邦监控录像数据恢复软件---蓝梦软件BestRecoveryForHBMS
  10. wget下载太慢问题
  11. 单元格下拉全选快捷键_wps表格怎么选中单元格,快捷键是什么?
  12. Hadoop架构与原理:Hadoop系统架构原理解析
  13. 用python画一只加拿大电鳗
  14. jmeter的apple to sample是什么意思02
  15. 未能联接game center服务器,苹果game center无法连接服务器怎么办呢?
  16. iterable、iterator和iter()
  17. 基于音频指纹的听歌识曲系统
  18. 搜狗有一个超良心的功能 Ctrl+shift+E
  19. 第 01 章:开篇介绍,我要带你撸 Spring 啦!
  20. Java是剑客-飘逸;.NET是刀客-霸道

热门文章

  1. 基于ssm的酒店预定管理系统
  2. 《FFmpeg Basics》中文版-07-翻转和旋转视频
  3. 求高精度幂 java_JAVA高精度_求高精度幂
  4. 精美摘抄,献给每一位有理想的大学生!
  5. 达人评测 联想小新 Air 14/15 2021 酷睿版怎么样
  6. java poi 读取excel 图片_Poi读取excel插图的方法和操作步骤
  7. python使用selenium爬取联想官网驱动(一):获取遍历各驱动的下载网址
  8. linux查看文件占用空间
  9. 推荐几个pdf转换成word转换器使用
  10. gdt描述_GDT解释