2012-06-12 12 views
5

Uso el ruido Perlin para el generador mundial en 2D (cómo en Terraria). Encontré una implementación que me conviene. Necesito generar partes del mundo, pero esta realización solo puede generar una vez en todo el mundo.Cómo modificar el ruido Perlin [ver ejemplo en el hilo]

Realización - http://sirisian.com/javascriptgame/tests/valuenoise2.html me volvió a escribir a AS3, modificando ligeramente (+ código principal) - http://codepad.org/crMEQ2DD

Por favor, ayudar a modificar el código para que era posible generar una parte de ruido:

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); 

Intenté varias opciones, pero las diferentes partes de ruido no están conectadas.

Y si tiene una implementación de Perlin Noise, que es adecuada para el generador mundial, puede dármela.

Gracias!

+0

Hola, veo que esta es una vieja pregunta. Puedo ayudar, pero no estoy seguro de entender completamente la pregunta. Hay ruido perlin en Actionscript3: nuevo BitmapData (ancho, alto) .perlinNoise (..) – zehelvion

Respuesta

2

Flash ya contiene una implementación de ruido Perlin, a través del método BitmapData.perlinNoise(). Lo que puede hacer si necesita obtener el ruido como un vector de números (a diferencia de un mapa de bits renderizable) es usar el método BitmapData.getVector() que devuelve todos los píxeles como un vector de enteros de 32 bits, donde los cuatro bytes representan alfa , rojo, verde y azul respectivamente.

He empleado este mismo patrón en un proyecto yo mismo, con gran éxito. A continuación se muestra la función que escribí y usé.

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; 
    } 
} 

Esta función básicamente sólo crea un alto mapa de bits de 1 píxel (ancho definido como la longitud del vector), inicia ruido Perlin escala de grises en ese mapa de bits, opcionalmente se aplica un desenfoque y luego escala los valores de acuerdo con el argumento de la función escala .

La escala se realiza calculando primero el valor promedio (utilizando solo el canal azul, ya que todos los canales serán idénticos debido a que el ruido es en escala de grises). Los valores se normalizan entre -1 y 1, donde el promedio ser 0 y escalado por el factor de escala suministrado.

La función se puede utilizar de la siguiente manera, para recuperar los valores de 1000:

_noise = new Vector.<Number>(1000, true); 
PerlinNoiseUtil.initNoiseVector(_noise, 300, 10, randomDev * periodTime, 10); 

Espero que esto ayude!

Cuestiones relacionadas