原理

Perlin Noise属于晶格(grid) 噪声,其将空间分成一个个晶格(单位长度),输入的位置点配合晶格顶点处的随机梯度,生成噪声。常用于游戏中的地形生成等。

以二维Perlin Noise为例

P是输入点,周围四个红色圈代表其所在晶格的四个顶点。(u, v)是p点在这个晶格内的局部坐标(u,v范围在0~1),红色向量代表晶格顶点处的随机梯度向量,绿色向量代表四个顶点到输入点的距离向量。

接着通过这两个向量的点乘得到该顶点对P点的影响权重,四个顶点对应四个权重,w1, w2, w3, w4。

w1----------w2

|                  |

|                  |

w3----------w4

再对4个权重做插值,插值函数可以直接用线性函数 w1*(1-u)+w2*u,但实际上会选用更复杂的插值函数保证一阶和二阶导数的连续性:

x1=Lerp(w1, w2, u);

x2=Lerp(w3, w4, u);

y1=Lerp(x1, x2, v);

这里需要做3次插值(2次水平方向,1次竖直方向)。以上就是全部流程,通过输入一个二维坐标,输出一个浮点噪声值。

还有一个问题是如何得到一个顶点的随机梯度向量,其实应该说伪随机梯度向量,因为算法中同一个顶点每次生成的梯度是相同的。

Perlin使用的方法是预先生成一组伪随机梯度值,对二三维来说是梯度向量,保存在G[256](一维),G2[256][2](二维),G3[256][3](三维)中。对于一维情况可以直接根据顶点坐标去G中取值,对二三维情况需要一个数组Q,将0~255下标随机放在其中。对于输入的顶点坐标这样取值:

G2[Q[x]+ y]       ——二维
G3[Q[Q[x] + y] +z]   ——三维

以上就完成了随机取梯度值的方法。Perlin在这里有一个改进,在三维中,P点周围的最近8个点构成了一个立方体,P点到立方体的每条边的的向量有12个,柏林使用这12个随机梯度向量替代了原先的256个梯度向量。

也就是从上面12个向量中挑一个。

实现

上面实现中,Fade()方法是插值函数,它保证了一二阶导数的连续性。permutation[256]保存了0~255的随机排列。

效果

转载于:https://www.cnblogs.com/hankeyyh/p/7247529.html

Perlin Noise相关推荐

  1. Perlin Noise algorithms(备忘)

    代码 //--------------------------------------------------------------------------------------- // Perl ...

  2. 用DDA Convolution和Perlin Noise来模拟水粉画笔触

    在西方,水彩画和水粉画是可以统称为Watercolor的,水粉画通常也称为不透明水彩画或树胶水彩画(Gouache),两者既有相似之处,又有所区别.水粉画是以水作为媒介,这一点,它与水彩画是相同的.所 ...

  3. 噪音 - Perlin Noise

    转载自:http://www.cnblogs.com/babyrender/archive/2008/10/27/BabyRender.html 说起perlin noise, 最初也就是在课上大概了 ...

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

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

  5. 【Ray Tracing The Next Week 超详解】 光线追踪2-4 Perlin noise

     Preface 为了得到更好的纹理,很多人采用各种形式的柏林噪声(该命名来自于发明人 Ken Perlin) 柏林噪声是一种比较模糊的白噪声的东西:(引用书中一张图) 柏林噪声是用来生成一些看似杂乱 ...

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

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

  7. 柏林噪声(Perlin Noise)

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

  8. python perlin noise

    python 利用 noise 生成纹理. # -*- coding: utf-8 -*- """ Created on Mon Apr 23 20:04:41 2018 ...

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

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

最新文章

  1. mysql备份psb文件怎么打开_Navicat for MySQL 数据备份教程
  2. BZOJ 1194: [HNOI2006]潘多拉的盒子 [DP DFA]
  3. 国外计算机音乐专业,音乐留学干货 | 国外电子音乐专业留学如何?
  4. 基于docker搭建svn-server
  5. 面绘制经典算法:MarchingCube实现(控制台篇)
  6. Linux下ntpdate时间同步
  7. dig指定服务器查询域名解析时间
  8. 批量插入数据到mysql_批量插入数据到 MySQL的几种方式
  9. 如何使用makefile编译不同平台的目标文件(makefile的参数传递)
  10. 李沐分享斯坦福2021秋季新课:实用机器学习
  11. LOJ.114.K大异或和(线性基)
  12. 关于yii2学习笔记:gii的使用
  13. eclipse 与my eclipse区别,IDE
  14. Broadcasting in Python
  15. 图形文件的自由转换:DXF转PLT、DWG转其它格式......
  16. 工作也能用 Tinder 配对?一家叫 Palaround 的公司就在做这门生意
  17. 慧都科技邀您品鉴“2021重庆高效加工与智能化升级峰会”
  18. 移动端高度兼容iPhoneX
  19. Android Studio WiFi 之 获取 WiFi 名称、IP、Mac
  20. 武汉理工大学计算机考研复试资料,武汉理工大学计算机考研复试

热门文章

  1. angularjs跨页面传参遇到的一些问题
  2. Oracle数据库merge into的使用,存在则更新,不存在则插入
  3. Liferay Dynamic CSS Filter方法的研究 - 总体过程
  4. XenDesktop 5之痛---Database Transaction Log速增
  5. 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(四)
  6. 理解Android的手势识别
  7. UInput使用注意事项
  8. studying and learning
  9. Maven 私服的简单使用
  10. 两种遮罩层的关闭方法