Ruido Perlin

Vamos con una explicación (seguida por la implementación de rigor) del algoritmo de ruido más usado en todo el mundo; el ruido Perlin.

El modelo conceptual del ruido Perlin fue descubierto en 1982 por Ken Perlin como resultado de su trabajo de generación de texturas para la película Tron. Desde entonces, el ruido Perlin, y pequeñas variantes posteriores (como el ruido Simplex) son la base para generar efectos como fuego, humo, nubes… texturas como madera, mármol, granito… mapas de altura, etc, de forma totalmente automática. En esencia, nos permite generar patrones de forma muy similar a como lo suele hacer la naturaleza.

En esta entrada vamos a explicar todo el proceso, la naturaleza del ruido, a implementarlo, y finalmente a usarlo para generar terrenos en 3D como el de la siguiente imagen (y un visor interactivo para probarlos, al final de la entrada):

noise_final

RUIDO BLANCO

Primero, entendamos las características del ruido aleatorio para comprender en qué se diferencia el ruido Perlin de él. Si generamos un mapa 2D de ruido blanco clásico (valores (pseudo)aleatorios), obtenemos algo similar a la siguiente imagen:

noise

Exacto, es muy parecido a lo que veíamos en nuestras viejas televisiones cuando no habíamos seteado ningún canal; sólo que entonces era el resultado del ruido blanco electromagnético del ambiente, completamente caótico, y en este caso sólo son bits al azar.

¿Qué características importantes vemos en esa imagen?

1) Desde el punto de vista de la teoría de la información, la entropía es máxima. Así que esta imagen no puede comprimirse al codificarse sólo con los símbolos usados en su lenguaje (blanco/negro).

2) Desde un punto de vista físico, su densidad media es prácticamente constante (tiende fuertemente a serlo) para todos los fragmentos de dimensiones superiores a 1×1. Es decir, si hacemos un desenfoque gaussiano la imagen se volverá esencialmente plana, incluso con radios de tan sólo 2px.

RUIDO PERLIN (1 dimensión)

En el ruido Perlin las características son las opuestas, que es lo deseable cuando trabajamos en generación procedural o automática. Si entendemos cómo se crea el ruido, es fácil y lógico entender el por qué de esta naturaleza.

Así que empecemos:

Vamos a calcular el ruido perlin como la generación de onda n-dimensional compuesta por k octavas. Si pensamos en la función seno para representar una onda:

sin

Vemos como su amplitud va desde -1 a 1 (2 en total) y su longitud de onda es 6. Esta bien podría ser la primera componente de nuestra onda final, en el siguiente paso, queremos una onda de la misma naturaleza, pero con mayor frecuencia (menor longitud de onda) y menor amplitud. Por ejemplo:

graph2

La tercera y cualta deberían obedecer al mismo principio (suponiendo que sólo usáramos 4):

graph3

graph4

De esta forma, si sumamos las componentes anteriores, y en general cualesquiera en las que cada una aumenta la frecuencia y reduce la amplitud de forma progresiva, obtendremos algo como lo siguiente:

graph0

Esta onda unidimensional, que se asemeja al perfil de un paisaje montañoso cumple el siguiente principio, que tanto observamos en la naturaleza: A mayor escala, menor número de variaciones pero con más influencia, a menor escala, mayor número de variaciones pero con menor influencia. O dicho de otra forma, a altas frecuencias bajas amplitudes y viceversa.

Pero en la naturaleza los procesos no están formados a base de ondas periódicas como el seno que hemos usado hasta ahora. Debemos crear una onda pseudo-aleatoria simplemente eligiendo valores aleatorios en los “nodos”. Los nodos son los puntos en los que una onda periódica alcanzaría un máximo o mínimo, es decir, debemos introducir valores cada λ unidades de espacio (longitud de onda).

Ejemplo:

puntos generados aleatoriamente para formar una onda

puntos generadores aleatoriamente para generar una onda

Una vez generados los puntos, debemos interpolar entre los valores de los nodos para rellenar todo el dominio en el que se define la onda. Podemos usar aquí cualquier tipo de interpolación: linear, trigonométrica, Lagrange, B-splines… pero usualmente con una simple interpolación linear es suficiente. Los resultados finales no mejoran demasiado con interpolaciones más complejas (como los B-Splines, que sería la ideal) y que tienen un coste computacional muy alto. No obstante sois libres de usar la que mejor os parezca.

Nota: Tengo pendiente una entrada sobre interpolación, usando B-Splines (splines cúbicos) y Lagrange, que sí son muy útiles en otros cientos de aplicaciones.

interpolación lineal

interpolación lineal

interpolación por cosenos

interpolación por cosenos

interpolación cúbica

interpolación cúbica

Para utilizar una nomenclatura adecuada, a cada componente vamos a llamarla octava, y usaremos un caso típico en el que en cada octava la frecuencia se multiplica por dos y la amplitud si divide por dos (de hecho, es así cómo se definen las octavas en música).

Con todo esto, ya podemos empezar a generar nuestra primera onda de ruido Perlin real. Empezaremos con una frecuencia de 2 (dos cambios en todo el dominio) y una amplitud de 128 (para representarla en una imagen de 256*256 siendo el centro del eje de ordenadas el centro de la imagen.

frecuencia: 2 amplitud: 128

frecuencia: 2
amplitud: 128

frecuencia: 4 amplitud: 64

frecuencia: 4
amplitud: 64

frecuencia: 8 amplitud: 32

frecuencia: 8
amplitud: 32

frecuencia: 16 amplitud: 16

frecuencia: 16
amplitud: 16

frecuencia: 32 amplitud: 6

frecuencia: 32
amplitud: 6

frecuencia: 64 amplitud: 4

frecuencia: 64
amplitud: 4

frecuencia: 128 amplitud: 2

frecuencia: 128
amplitud: 2

El resultado de sumar estas 7 octavas es el siguiente:

Ruido Perlin con 7 octavas

Ruido Perlin final con 7 octavas

Y el código que he escrito para generarlas es el siguiente:

//=============
//Interpolation
//=============
var interpolate={}
interpolate.linear=function(x1,y1,x2,y2,x)
{
	return ((x-x1)*(y2-y1)/(x2-x1))+y1;
}
//=============
//Perlin Noise
//=============
var perlin={}
perlin.octave(frequency, amplitude, length)
{
	var wave=new Array(length);
	var step_length=Math.floor(length/frequency);
	for(var i=0;i<=length;i+=step_length)
	{
		//Create the nodes of the wave
		wave[i]=(amplitude/2)-(Math.random()*amplitude);
		//Interpolation between nodes
		if(i>=step_length)
		{
			for(var j=i-(step_length-1);j<i;j++)
			{
				var x1=i-(step_length);
				var x2=i;
				wave[j]=interpolate.linear(x1,wave[x1],x2,wave[x2],j);
			}
		}
	}
	return wave;
}

Como veis el código es muy sencillo. El objeto “interpolate” está preparado para expandirse añadiendo nuevos métodos de interpolación si fuese necesario. Para generar todas las octavas y sumarlas, usando una progresión de doble frecuencia/mitad amplitud, podríamos simplemente hacer algo ad hoc como lo siguiente:

var lenght=256;
var perlin_wave=new Array(lenght);
var n_octaves=7;
for(var i=0;i<perlin_wave.length;i++) //wave initialization
	perlin_wave[i]=0;
for(var i=1;i<=n_octaves;i++)
{
	var current_pow=Math.pow(2,i);
	var octave=perlin.octave(current_pow,lenght/current_pow,lenght);
	for(var j=0;j<perlin_wave.length;j++)
		perlin_wave[j]+=octave[j];
}

O bien, podemos crear un método dentro del objeto perlin con el código anterior si lo que queremos es tenerlo encapsulado.

Con esto ya tenemos nuestro generador de ruido Perlín en una dimensión. Aunque lo interesante viene para el caso en 2D.


Prueba a generar nuevas ondas con nuestra implementación haciendo clic en el botón
Generar una nueva onda

RUIDO PERLIN (2 dimensiones)

Para el caso de 2 dimensiones debemos pensar en la onda y sus octavas como mapas o texturas. Una octava 2D con frecuencia 2 creará dos valores aleatorios por dimensión, es decir, un total de 2×2=4 valores que estarán situados en las 4 esquinas del mapa. Si la amplitud es de 256 con valores entre -128 a 128 podemos normalizarla a valores entre 0 y 256 y dibujar en escala de grises (un gris para cada valor) la onda de forma muy gráfica y representativa.

Ejemplo:

image21

En este caso, hemos rellenado el dominio vacío de la onda, con el color del punto definido que manda sobre el cuadrante; dado que como hemos dicho, sólo los vértices del mapa tienen un valor establecido. Sin embargo, lo ideal es de nuevo usar algún método de interpolación para rellenar todo el dominio. De nuevo el más usado para este caso es la interpolación lineal aplicada a dos dimensiones (bilinear), que está perfectamente explicada en la wikipedia. De esta forma, obtenemos algo como lo siguiente:

image22

Usando estos principios, podemos empezar a generar octavas y crear nuestro ruido Perlin en 2D. Por ejemplo:

frecuencia: 2 amplitud: 128

frecuencia: 2
amplitud: 128

frecuencia: 4 amplitud: 64

frecuencia: 4
amplitud: 64

frecuencia: 8 amplitud: 32

frecuencia: 8
amplitud: 32

frecuencia: 16 amplitud: 16

frecuencia: 16
amplitud: 16

frecuencia: 32 amplitud: 8

frecuencia: 32
amplitud: 8

frecuencia: 64 amplitud: 4

frecuencia: 64
amplitud: 4

frecuencia: 128 amplitud: 2

frecuencia: 128
amplitud: 2

La suma de todas estas octavas da como resultado:

Ruido Perlin 2D final con 7 octavas

Ruido Perlin 2D final con 7 octavas

Esta imagen ya tiene semejanza con algo que parecen ser nubes o humo sobre un fondo, de hecho, si dejamos el canal B a 255 y el canal G como el máximo de (185,valor_de_la_onda), habremos creado un sencillo filtro que produce imágenes como la siguiente:

nubes fluorescentes

nubes fluorescentes lanshóricas

El código para el ruido Perlin en 2D que he escrito para generar los ejemplos anteriores es el siguiente:

//=============
//Interpolation
//=============
var interpolate={}
interpolate.linear=function(x1,y1,x2,y2,x)
{
	return ((x-x1)*(y2-y1)/(x2-x1))+y1;
}
interpolate.bilinear=function(x1,y1,x2,y2,v1,v2,v3,v4,tx,ty)
{
	//P1:{x1,y1,v1} - P2:{x2,y1,v2} - P3:{x1,y2,v3} - P4:{x2,y2,v4}
	//Target:{tx,ty}
	//NOTE: Bind each area with the oposite value
	var area_v1=Math.abs((tx-x1)*(ty-y1))*v4;
	var area_v2=Math.abs((tx-x2)*(ty-y1))*v3;
	var area_v3=Math.abs((tx-x1)*(ty-y2))*v2;
	var area_v4=Math.abs((tx-x2)*(ty-y2))*v1;
	var area_total=(x2-x1)*(y2-y1);
	return (area_v1+area_v2+area_v3+area_v4)/area_total;

}
//=============
var perlin={}
perlin.octave_2d=function(frequency, amplitude, length)
{
	var step_length=Math.floor(length/frequency);
	var wave=new Array(length+1);
	for(var i=0;i<=length;i++)
		wave[i]=new Array(length);
	for(var i=0;i<=length;i+=step_length)
	{
		for(var j=0;j<=length;j+=step_length)
		{
			//Create the nodes of the wave
			wave[i][j]=(amplitude/2)-(Math.random()*amplitude);
			//Interpolation between nodes
			if(i>=step_length && j>=step_length)
			{
				for(var a=i-(step_length);a<=i;a++)
				{
					for(var b=j-(step_length);b<=j;b++)
					{
						var x1=i-(step_length);
						var x2=i;
						var y1=j-(step_length);
						var y2=j;
						wave[a][b]=interpolate.bilinear(x1,y1,x2,y2,wave[x1][y1],wave[x2][y1],wave[x1][y2],wave[x2][y2],a,b);
					}
				}
			}
		}
	}
	return wave;
}
//=============
function wave2D(data)
{
	this.map=data;
	this.add=function(data)
	{
		for(var i=0;i<data.length;i++)
		{
			for(var j=0;j<data.length;j++)
				this.map[i][j]+=data[i][j];
		}
	}
	this.render=function(ctx)
	{
		for(var i=0;i<this.map.length;i++)
		{
			for(var j=0;j<this.map.length;j++)
			{
				//Normalize from 0 to 255
				var depth=Math.floor(128+this.map[i][j]);
				//LaNsHoRic clouds: ("+depth+","+Math.max(185,depth)+",255)
				ctx.fillStyle="rgb("+depth+","+depth+","+depth+")";
				ctx.fillRect(i,j,1,1);
			}
		}
	}
	this.toURL=function()
	{
		var canvas=new Canvas();
		canvas.width=canvas.height=this.map.length;
		var ctx=canvas.getContext("2d");
		this.render(ctx);
		return canvas.toDataURL();
	}
}

Con esto, podemos adaptar el código de generación anterior a lo siguiente:

var final_wave=new wave2D(perlin.octave_2d(1,256,256));
for(var i=1;i<8;i++) //7 octaves
{
	var current_pow=Math.pow(2,i);
	var octave=perlin.octave_2d(current_pow,256/current_pow,256);
	final_wave.add(octave);
}

Prueba a generar nuevos mapas con nuestra implementación haciendo clic en el botón
Generar un nuevo mapa

Podemos cambiar la forma en que aumenta la frecuencia y disminuye la amplitud para obtener diferentes resultados. Jugando con la progresión y los valores podemos obtener texturas como granito, nubes dispersas, humo denso, etc. O usar el ruido como perturbación de un mapa base, con esto podemos generar lava, madera, mármol, relámpagos, etc. Sólo es cuestión de ir jugando con valores y experimentar un poco.

El siguiente uso popular de los mapas de ruido Perlin como el que acabamos de generar, es como mapas de altura. De esta forma podemos generar terrenos de forma automática, que en base a nuestros parámetros de generación podrán ser más o menos montañosos, más escarpados, más suaves…

En el siguiente cuadro puedes ver como usando nuestro generador de ruido Perlin creamos terrenos en 3D. Puedes hacer clic con el ratón y arrastrar para rotar la cámara. La implementación del modelado en 3D y del visor del mapa de altura están fuera del contenido de la entrada, pero prometo preparar una hablando de ello si os interesa (notificádmelo).

Como resumen rápido, dividimos un plano en tantas secciones de como frecuencia f tiene la mayor octaba. El plano queda con f*f vértices que asociamos con los píxeles del mapa 2D generado, para elevarlos según el valor del mapa en ese punto. Así el plano queda deformado como en los siguientes ejemplos:


Haz clic y arrastra el ratón para visualizar el terreno.
Generar un nuevo terreno aleatorio

Si os sirve de ayuda no es necesario mención pero sí sería cortés un agradecimiento aunque fuese en un comentario 🙂


Si te gusta esta entrada... compártela! 😉
Tweet about this on TwitterShare on Facebook0Share on Google+0Share on Tumblr0Pin on Pinterest0Share on LinkedIn0Share on Reddit0

67 Comentarios

  1. ¡¡¡ G R A C I A S !!!

  2. Muy bueno!! Gracias!!

  3. Muchas gracias por el artículo 🙂

  4. Victor Burguet |

    gracias por aportar conocimiento.

  5. Best Nude Playmates & Centerfolds, Beautiful galleries daily updates
    http://xmenporncomic.hotblognetwork.com/?kasey

    tube porn keds porn dpi you porn animal mother of 2 porn best soft porn movie site

  6. New project started to be available today, check it out
    http://pornmovieshbolaportecity.amandahot.com/?kaylee
    teenage latina porn dump video olson porn big breasted porn movies gagging throat young rough free porn internet porn postings

  7. Double Bitcoin in 24 Hours System is a Legit Bitcoin Doubler System to double your investment after 24 hours. Double Bitcoin in 24 Hours System is fully automated system, once your investment confirms via blockchain, our system start work and provides you double payout automatically after 24 hours.

    Visit

    https://earnx2btc.com

    Thank you

  8. Neurontin is used for treating seizures associated with epilepsy.
    Buy cheap neurontin online and save your money. Only highest quality and secure payments. Free delivery and free pills for every order.
    Only 0.58 usd per pill!

  9. This is a unique place for fashionable women’s clothing and accessories.
    We offer our clients women’s clothing, jewelry, cosmetics and health products, shoes, bags and much more.
    https://fas.st/EkICNn

  10. можно ли узнать данные о человеке – банковские пробивы локо банка купить, пробив банка

  11. Past master Try Grub streeter at Your Disposal!
    Worth over quantity is a guide we at Attempt Utilization support. We potency not take as many paper writers as any other authentic disquisition novelist assistance, but our group is the cream-of-the-crop. On top-grade of that, we sign on writers based on their degrees, allowing us to amplify the overall return aptitude perspicaciousness! Having this variation allows clients to order any assignment that they could neediness from our hasty notepaper writing service; merely be solid to hand-pick the best person looking for your contribution!

    Take down My Give it Service that Earns You an “A”!
    If you are looking due to the fact that a legit attempt use capable of crafting an unrestricted talkative rag for a bloody immaculate price, then you eat loosely transpire b nautical tack to the right destination. We learnt that each customer drive take their own unmatched needs, so we thinks fitting makes certain to customize each shred to the the truth requirements! We be aware that as a student it is touchy to footing the whole shooting match in the to-do book. Past using our finished writing service, you no command longer have to ask yourself “Who can aid me with essay?!”.

    Master Tract Writers – linked, We Are Proud to Propose Them to You!
    Our essay freelancer employment has been fortunate to attract some of the paramount and fastest academic writers online. This is why when you sine qua non a publication writer, we are very proud to be skilful to tender you a settling on of writers, of whom we are very confident. With so tons competitors popping up every day, suitable a businesslike writers benefit has its price. Way, we plan to rent exclusive dissertation chirography stave that has the incentive to job seeking us. Having a dedicated body is a exotic trail to away unflinching that each’s deadlines are met. Under our recent directorship, we be struck by write the costs of perpetual our delivery and site. This has allowed us to offer higher rates for writers than other calligraphy services. Nonetheless, we can noiseless demand you with impost writings at competitive prices because the changes are coming free of our verge, and not your pocket.

    Our Trained Writers Are Our Pride
    Our company provides services from the best authors, this is confirmed by the feedback of our customers on sites such as Sitejabber or TrustPilot
    We are not like all other sites that promise you the choicest, but provide you with services of students from third crowd countries with straitened knowledge.
    We can present legitimate photos of our writers, you can communicate with him at any heyday within easy reach during you, we sort an plain-spoken rating of the performers so that they feel event with each other and compose your essays flush better.
    ?
    We are attracts and employs the pre-eminent and fastest composition writers online. Every scribbler in our band is favourably scholarly, knowledgeable, alert to particular, and dedicated to delivering at best quality pieces and always on time. So if you need a skilled notepaper pencil-pusher, our academic article maintenance is proud to put forward you a variety of the exceedingly best. We are self-confident that our writers choose deliver the most outstanding results. When you hire a scratch paper writer, we hear to bid as strong rates as tenable to our writers to imagine an ambience of growth and clear reward. We also strive to offer you with excise papers at affordable prices to frame sure you can afford our essay longhand service help. We endure great care of both you, our patron, and writers.

  12. Charlotteomisa |

    Artritis derrotada por el oceano – https://bit.ly/3kh6jP3

  13. Честный кредит в надежном банке https://z-v-t.ru/docs/ #кредит, #банк, #наличные,

  14. Beatriceomisa |

    Bajar de peso en una semana es facil – https://bit.ly/3D6R0kf

  15. Привет.
    Посоветуйте нормальную онлайн-типографию для изготовления брошюр
    Мы работали с одной типографией, качество, цены и скорость у них хорошее,
    но они находятся в Красноярске, а мне нужно в Москве.
    Вот печать блокнотов https://kraft-pt.ru/products/notepads

  16. ладный вебсайт трафик – pay per install

  17. El hongo se despide de ti – https://bit.ly/3j3I5YY

  18. Alexandraomisa |

    Eliminando parasitos del cuerpo – https://bit.ly/2UGRgFy

  19. Las articulaciones sanaran solas – https://bit.ly/3z6jS9T

  20. My new hot project|enjoy new website
    http://megremisporn.fetlifeblog.com/?maria

    teen porn babe videos lesbian tiffany sexy porn bitches porn partying make free webcam porn bi porn star

  21. Perdemos peso al instante – https://bit.ly/2W5gK05

  22. El hongo se despide de ti – https://bit.ly/3j3I5YY

  23. Belleza de la naturaleza – https://bit.ly/3mmXk1o

  24. Eliminando parasitos del cuerpo – https://bit.ly/2UGRgFy

  25. Есть отличный стротельный сайт

  26. Онлайн казино Пин Ап не обещает миллионы каждому, но оно несет ответственность перед каждым игроком и стабильно выплачивает выигрыши победителям, главное играть на официальном сайте!

  27. Free Porn Galleries – Hot Sex Pictures
    http://bbwsexywear.bloglag.com/?tamia

    amataur porn review free lesbian porn films unusula porn bear pordn tube lesbian valentine costume porn

  28. tadalafil daily dose https://tadalafilttab.com/ – tadalafil 5 mg tablet <a href=”https://tadalafilttab.com/ “>tadalafil coupon </a>

  29. cryptocurrency mixing supports Bitcoin cryptocurrency bearing no logs policy. It requires a minimum deposit of 0.001 BTC and the transaction fee is 0.5–3%. It supports multiple addresses of up to 10 and requires confirmation. No registration is required and it does offer a referral program. Letter of guarantee is provided. It is a simple service with a high level of anonymity. The cryptomixer mixing process is very simple and only takes a couple of minutes. You need to select one of the three supported cryptocurrencies (Bitcoin, Litecoin, Bitcoin Cash), enter the withdrawal address, set the transaction delay for any time up to 72 hours, send the coins to the specified address and wait for their delivery to the destination. This site is unlike the other three mixing pools. You can mix user’s coins: with incoming coins of other customers, private reserves of the service and investor coins. The service does not require registration. The mixing commission is not large and is taken from the mining commission, which is very convenient. The referral program at SmartMixer is one of the most profitable, during the first mixing operation you receive a smart code that is required to receive a discount on the commission, this discount can reach – 70%. After each transaction, the user receives a letter of guarantee. All data about it is deleted after a day, while maintaining the complete anonymity of the client. crypto mixers is one of the most pocket-friendly, easy to use and customizable Bitcoin laundry platforms in the industry. The user-interface is extremely simple and clean, anyone who has never before used any such service too can navigate around and tumble Bitcoins easily. No registration is required to mix Bitcoins on Blender.io Its “delay” feature lets you set delays from 1-24 hours which increases your anonymity by providing a gap between the deposited coins and the outgoing ones. As for the fee, it’s dynamic, meaning you get to choose the amount of fee you’d like to pay, the minimum fee being 0.5% and the maximum being 2.5% with an additional 0.0005%/address. It’s also one of the rare platforms which provides you with a mixing code which makes sure your previous coins do not get mixed with your newer deposits if you do multiple deposits to the tumbler. The minimum amount you can mix is 0.001BTC while there’s no specific maximum amount as their Bitcoin reserve seems to be quite large. It also has a No Logs Policy and all data is instantly deleted as soon as a transaction is complete; and as for the number of confirmations required it’s 3 for your deposit to be mixed by crypto mixers It supports 8 addresses for each mix so you can further increase your anonymity. In a nutshell, it gives you the power to choose, is fast, anonymous and totally worth a try. It also supports Segwit and bech32 Addresses, with some terms attached. For e.g. only witness version bech32 addresses are supported. Similarly, only the addresses starting with the number “3” are supported.

  30. essay format best essay writer <a href=”https://instantcollegeessay.com/ “>homework online </a> essaytyper https://instantcollegeessay.com/

  31. essay helper <a href=”https://writemyessay1day.com/ “>writes your essay for you </a> <a href=”https://writemyessay1day.com/ “>samedayessay </a>

  32. Eliminando parasitos del cuerpo – https://bit.ly/2UGRgFy

  33. Dirty Porn Photos, daily updated galleries
    http://pornballet.instakink.com/?penelope

    dad and son porn gay nikki porn star rock of love tearing shirts off porn cowlist porn 2009 jelsoft entreprises ltd teen porn sits

  34. Polla enorme de forma anonima – https://bit.ly/3D4w4dO

  35. 第一借錢網擁有全台最多的借錢資訊。資訊最齊全,當舖業,信貸業,在第一借錢網裏一應俱全

    https://168cash.com.tw/

  36. CoinEx es un intercambio global de monedas digitales.
    ?Encontraste el mejor? Comparte en los comentarios aqui: https://bit.ly/mailcoin

  37. Чтобы увеличить интервал между обращениями в автосервис, выбирайте качественные средства для регулярного ухода за основными узлами автомобиля. Присадки для бензина и дизельного топлива, которые защитят форсунки и клапаны двигателя от преждевременного износа, а также очистители и специальные средства для автосервисов.

    Компания известна как крупнейший разработчик инновационных смазочных материалов для профессионального применения. Особое место в линейке продукции занимают масла на базе эстеров (их доля в составе готового продукта может достигать 40-60%) и Нестеровой-керамические присадки.

    автомобильные новости

  38. https://treasureadventurewiki.com/User:Keplison

    android ios
    imvu hack 2022,/imvu free credits/ imvu credits free / 2022/ 2021
    imvu hack 2022,/imvu free credits/ imvu credits free / 2022/ 2021

  39. Belleza de la naturaleza – https://bit.ly/3mmXk1o

  40. Bajar de peso ahora es facil – https://bit.ly/3B1FQvm

  41. People in such cases say-My uncle would gasp, looking at himself. 🙂
    China and France possess expressed displeasure with the new defense contract between the United States, the Coalesced Sphere of influence and Australia – although looking for disparate reasons. Beijing in return wants to border on the Asia-Pacific Employment Pact.
    More message here click

  42. Corazon como un toro – https://bit.ly/3sF48s7

Responder

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Límite de tiempo se agote. Por favor, recargar el CAPTCHA por favor.