简单聊聊 Perlin 噪声(上篇)

2020-08-28 09:37:49 浏览数 (1)

程序开发中总会用到随机方法,一般的随机方法虽然通用,但是产生的随机数又因为过于"随机",不适合用来生成平滑连续的随机数据(譬如自然地形的高度),这个时候我们便需要使用特殊的随机方法了, Perlin 噪声便是一种能够产生平滑(随机)数值的随机方法.

Value 噪声

为了更容易的理解 Perlin 噪声,我们先从较简单的 Value 噪声看起:

首先我们考虑 一维 情况(即通过一维坐标来获取随机值),如果我们仅使用一般随机方法的话,得到的随机数值是这样的:

可以看到数据杂乱无章,远不能说是平滑连续,有什么办法可以改进呢?

一种朴素的想法就是在整数坐标处仍然使用一般随机方法来生成随机值,但是对于处在(相邻)两个整数坐标之间的点(即浮点坐标点),则使用线性插值的方式(在这两个整数坐标点对应的随机值之间线性插值)来生成随机值,最后得到的随机数值是这样的:

可以看到数据比起之前已经平滑连续了不少,但是在整数坐标处仍然不够平滑连续(整数坐标处不可导(自然也不连续)),而这是由于我们之前采用了线性插值的方式来生成随机值造成的,改善的方式也比较明晰,就是改用非线性插值的方式来生成整数坐标间的随机值.

上述的非线性插值公式还可以进一步改进,基本思想就是使(相邻)端点(整数坐标)处更加"平滑连续"(即在(相邻)端点(整数坐标)处二阶导数相同(连续)):

t' = 6t^5 - 15t^4 10t^3 \ r = (1 - t')u t'v

基于改进的公式,我们得到的随机数值是这样的:

至此,我们便得到了 一维 的 Value 噪声.

未完待续

0 人点赞