在与Diamond Square合作后,我正在玩Perlin Noise。我遵循了Hugo Elias的实现,该实现基本上是用x,y作为输入来生成一系列函数以抛出每个坐标值。
我的PHP代码在这里:
我有两个问题:
如何使用该算法在数组中生成高度图?我并没有完全理解它,只是将伪代码移植到PHP,但是在读取算法“神奇地”为给定的每个x,y点(显然,不必读取其)的转换值后,执行了最后一个函数(map_perlined)相邻的值),当用作随机函数时,我得到这个mt_rand(-100,100)/100;
这在使用密码时:(1.0-(($n*($n*$n*15731+789221)+1376312589)&0x7fffffff)/1073741824.0;
顺便说一句,可以在PHP中“按原样”实现吗?):
因此,总结三个问题:
- 我的代码正确吗?
- 可以按代码中所述将random函数移植到PHP吗?它不会抛出任何错误,但是结果不存在。
- 我实际上如何使用该算法?
更新
好的,为Gustavson论文中显示的代码添加了一个PHP端口,正如其他编码人员所说,它仅生成一个八度。是否还有其他有用的站点/论文/指南,说明如何结合使用多个八度音阶,幅度,频率等来控制噪声功能?在Gustavson的论文中仅显示了结果,而不是算法的实际实现,也许我遗漏了一些东西?
更新2
@NATHAN
我做了类似的事情:
$persistence = 0.5;
for ($j = 0; $j < $size; $j++) {
for ($i = 0; $i < $size; $i++) {
for ($o = 0; $o < 8; $o++) {
$frequency = pow(2,$o);
$amplitude = pow($persistence, $o);
$value += SimplexNoise($i*$frequency, $j * $frequency) * $amplitude;
}
//$value = SimplexNoise($i, $j) + 0.5 * SimplexNoise($i, $j) + 0.25 * SimplexNoise($i, $j);
$this->mapArray[$i][$j] = new Cell($value);
在将值归一化为0..1之后,我得到了一个相当沉闷的高度图,例如:
我如何播种地图?也许我需要实现的是带有第三个值的3d版本随机高度?但是,如果是这样,我必须找出考虑邻居值的方法,而这些值将以菱形平方算法结尾,而这正是我不想做的。
更新3
更多Perlin工作。我还没有找到一种方法可以将噪声引导到我的结果中。检查以下八度和最终结果:
八度I至IV
总结
每个八度几乎相同。检查代码:
$persistence = 0.5;
for ($j = 0; $j < $size; $j++) {
for ($i = 0; $i < $size; $i++) {
$value = 0;
for ($o = 0; $o < 4; $o++) {
$frequency = pow(2,$o);
$amplitude = pow($persistence, $o);
$value += improved_noise($i*$frequency, $j*$frequency, 0.5)*$amplitude;
}
$this->map[$i][$j] = new Cell($value);
结果归一化。您将使用什么对噪声的产生产生重大影响?我看到了一些例子,其中改变幅度会产生柔软或粗糙的表面,但是即使幅度很大,差异也很小。