gpt4 book ai didi

actionscript-3 - 如何修改柏林噪声 [请参阅线程中的示例]

转载 作者:行者123 更新时间:2023-12-04 06:39:15 25 4
gpt4 key购买 nike

我在 2D 中使用 Perlin Noise 作为世界生成器(在 Terraria 中如何)。我找到了一个适合我的实现。我需要生成世界的一部分,但这种实现只能生成一次整个世界。

实现- http://sirisian.com/javascriptgame/tests/valuenoise2.html
我把它改写成 AS3,稍微修改(+ 主代码)- http://codepad.org/crMEQ2DD

请帮助修改代码,以便可以生成噪声部分:

PerlinNoise.randomize(65735);
...
var noises:Vector.<Number> = PerlinNoise.getNoise(0, 0, 100, 100, 6, 6, 1.0, 20);
...
var noises:Vector.<Number> = PerlinNoise.getNoise(100 /*<--x offset*/, 0, 100, 100, 6, 6, 1.0, 20);

我尝试了几个选项,但不同的噪音部分没有对接。

如果你有一个适用于世界生成器的 Perlin Noise 的实现,你可以给我。

谢谢!

最佳答案

Flash 已经包含 Perlin 噪声的实现,通过 BitmapData.perlinNoise()方法。如果您需要将噪声作为数字向量(而不是可渲染位图)获取,那么您可以使用 BitmapData.getVector()方法将所有像素作为 32 位整数向量返回,其中四个字节分别表示 alpha、红色、绿色和蓝色 channel 。

我自己在一个项目中采用了这种模式,取得了巨大的成功。下面是我编写和使用的函数。

public static function initNoiseVector(output : Vector.<Number>, baseX : Number, numOctaves : Number, scale : Number, blur : uint = 0) : void
{
var i : uint;
var len : uint;
var sum : uint;
var avg : uint;
var perlin : BitmapData;
var noise : Vector.<uint>;

len = output.length;

perlin = new BitmapData(len, 1);
perlin.perlinNoise(baseX, 1, numOctaves, 0, true, false, 7, true);

if (blur > 0)
perlin.applyFilter(perlin, perlin.rect, new Point(), new BlurFilter(blur, 1, 3));

noise = perlin.getVector(perlin.rect);

// Calculate average
sum = 0;
for (i=0; i<len; i++) {
// Mask out blue channel
sum += noise[i]&0xff;
}
avg = sum/len;

for (i=0; i<len; i++) {
var speed : Number;

// Convert perlin noise color to value between -1 and 1
speed = ((noise[i]&0xff) - avg) / avg;
output[i] = speed * scale;
}
}

这个函数基本上只是创建一个 1px 高的位图(宽度定义为向量的长度),在该位图中启动灰度 Perlin 噪声,可选地应用模糊,然后根据 scale 函数参数缩放值。

缩放是通过首先计算平均值来完成的(仅使用蓝色 channel ,因为由于噪声是灰度级,所有 channel 将相同。)然后将这些值归一化在 -1 和 1 之间,其中平均值将为 0,并且按提供的比例因子缩放。

然后可以通过以下方式使用该函数来检索 1000 个值:
_noise = new Vector.<Number>(1000, true);
PerlinNoiseUtil.initNoiseVector(_noise, 300, 10, randomDev * periodTime, 10);

希望这可以帮助!

关于actionscript-3 - 如何修改柏林噪声 [请参阅线程中的示例],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10995469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com