C/C++编程笔记:游戏开发中的噪声算法详解,游戏编程常用技术(18)

这种方法是思想是 , 由于我们想要每个维度都是无缝的 , 也就是当该维度的值从0变成1的过程中 , 0和1之间比较是平滑过渡的 , 这让我们想起了“圆” , 绕圆一周就是对该维度的采样过程 , 这样就可以保证无缝了 。

因此 , 对于二维噪声中的x轴 , 我们会在四维空间下的xz平面上的一个圆上进行采样 , 而二维噪声的y轴 , 则会在四维空间下的yw平面上的一个圆上进行采样 。 这个转化过程很简单 , 我们只需要使用三角函数sin和cos即可把二维采样坐标转化到单位圆上 。 同样 , 三维空间的也是类似的 , 我们会在六维空间下计算 。 这种方法不仅适用于Perlin噪声 , 像Worley噪声这种也同样是适合的 。

Unity Wiki里二维可平铺的Simplex噪声的实现:

其中 , xyOffset是指在四维空间某个平面上的偏移 , 即这个单位圆是以xyOffset为圆心的 。

该方法缺点是计算量大大增加 , 一般噪声的复杂度为O(2n)(Simplex噪声例外 , 是O(n2)) , 是指数增加的 , 因此比较适合预计算 , 例如程序化生成噪声纹理 。

推荐阅读