Crea globos planetarios de procedimiento

Distorsi贸n, ruido continuo y c贸mo trabajar con ellos.

imagen

Generamos un planeta


Una de las formas m谩s simples de generar un planeta es utilizar el ruido. Si decidimos elegirlo, tenemos un par de opciones posibles. Veamos cada uno y determinemos lo mejor:

  • Perlin Noise es la opci贸n m谩s f谩cil. El ruido de Perlin fue desarrollado por Ken Perlin en 1983, tiene un par de inconvenientes: artefactos visuales y una velocidad bastante baja en comparaci贸n con otras opciones al generar im谩genes grandes.
  • Ruido simple (ruido simple) - fue desarrollado por Ken Perlin en 2001 como un intento de eliminar los defectos del ruido Perlin; Esta es una soluci贸n muy valiosa y r谩pida, pero tiene un serio inconveniente: el uso del ruido tridimensional simple est谩 protegido por una patente, lo que lo hace bastante costoso.
  • Open Simplex Noise : KDotJPG se desarroll贸 con un objetivo simple: crear una versi贸n moderna y gratuita de ruido simplex, relativamente r谩pida y sin distorsiones.

De estos tres, personalmente prefiero Open Simplex Noise, que uso en mis proyectos personales. Vale la pena se帽alar que en la implementaci贸n actual de OpenSimplexNoise , se requerir谩 trabajo adicional para obtener un f谩cil acceso a la escala, octavas y generadores . Hay mucha informaci贸n en Internet sobre lo que hace cada uno de estos elementos, y le recomiendo que lo estudie. Sin embargo, en mi art铆culo no hablar茅 sobre esto.


As铆 es como se ve Open Simplex Noise con 16 octavas.

Ruido continuo


El ruido es interminable, lo que significa que si solo creamos un lienzo con una relaci贸n de aspecto de 2: 1 para obtener una proyecci贸n igualmente espaciada , no se colocar谩 en bucle cuando se superponga en la esfera (expreso mi gratitud a este incre铆ble sitio web), sino en la costura horizontal y en los polos Grandes diferencias.

imagen

Ruido creado sin costuras.

imagen

Observe las enormes costuras que aparecieron cuando el ruido se aplic贸 a la esfera.

Hay muchas formas de arreglar esto; Por ejemplo, en esta excelente publicaci贸n de Red Blob Games [ traducci贸n en Habr茅] fue suficiente generar una isla usando una funci贸n que recibe la distancia al centro como una variable y establece la altura 0 en los bordes para minimizar las costuras.

Sin embargo, esto no es lo que necesitamos. Queremos generar un planeta con la posibilidad de la existencia de los polos norte y sur, y para esto necesitaremos c谩lculos matem谩ticos m谩s complejos.

Recubrimiento esf茅rico


Un m茅todo que puede generar planetas esf茅ricos es convertir las coordenadas cartesianas de nuestro lienzo en coordenadas esf茅ricas, generar ruido en funci贸n de estas coordenadas y luego convertir el ruido de nuevo en coordenadas cartesianas y aplicarlo al lienzo.

Sin embargo, esta implementaci贸n tiene sus limitaciones, cuyas causas se muestran en una publicaci贸n incre铆ble de Ron Valstar . Lo m谩s importante, las formas de los continentes en este caso se ven extremadamente extra帽as y distorsionadas, y por lo tanto no usaremos esta opci贸n.

imagen

Superposici贸n de ruido esf茅rico. Las formas extra帽as y las distorsiones hacen que los continentes sean bastante feos.

imagen

Pero al menos no hay m谩s costuras.

Recubrimiento c煤bico


Como resultado, utilic茅 el segundo m茅todo, tomado de una publicaci贸n de Ron Valstar y una serie de art铆culos de acko Making Worlds . Describen la generaci贸n de un globo a trav茅s de la generaci贸n de un cubo y su "inflaci贸n", como si fuera un globo, hasta que fue un ejemplo de la forma de una esfera.


Imagen tomada de acko.net. Explica el concepto de un mapa c煤bico de forma simple y visualizada.

Ahora solo necesitamos generar seis caras, lo cual es bastante simple, hay muchas formas de hacerlo.

Al final, decid铆 crear una matriz y llenarla con datos. Convert铆 las coordenadas 2D del lienzo a las coordenadas 3D del cubo, y luego gener茅 ruido para cada una de estas coordenadas 3D, de modo que las guard茅 en el valor de coordenadas 2D correspondiente.

//Z STATIC for(int y = 0; y < cubeFaceSize; y++) { for(int x = 0; x < cubeFaceSize * 2; x++) { //Generates FRONT if(x < cubeFaceSize) { cubeMap[cubeFaceSize+x][cubeFaceSize+y] = noise.noise3D(x, y, 0); } //Generates BACK else { cubeMap[cubeFaceSize*3+(x-cubeFaceSize)][cubeFaceSize+y] = noise.noise3D(cubeFaceSize-(x-cubeFaceSize), y, cubeFaceSize); } } } //X STATIC for(int y = 0; y < cubeFaceSize; y++) { for(int x = 0; x < cubeFaceSize * 2; x++) { //Generates LEFT if(x < cubeFaceSize) { cubeMap[x][cubeFaceSize+y] = noise.noise3D(0, y, cubeFaceSize-x); } //Generates RIGHT else { cubeMap[cubeFaceSize*2+(x-cubeFaceSize)][cubeFaceSize+y] = noise.noise3D(cubeFaceSize, y, x-cubeFaceSize); } } } //Y STATIC for(int y = 0; y < cubeFaceSize * 2; y++) { for(int x = 0; x < cubeFaceSize; x++) { //Generates TOP if(y < cubeFaceSize) { cubeMap[cubeFaceSize+x][y] = noise.noise3D(x, 0, cubeFaceSize-y); } //Generates BOTTOM else { cubeMap[cubeFaceSize+x][cubeFaceSize*2+(y-cubeFaceSize)] = noise.noise3D(x, cubeFaceSize, y-cubeFaceSize); } } } 

De esta manera, podemos crear un mapa c煤bico que se puede convertir f谩cilmente en una proyecci贸n igualmente espaciada utilizando el maravilloso c贸digo escrito por Bartosz .

imagen

Algoritmo generado mapa c煤bico.

imagen

Transformaci贸n equidistante de un mapa c煤bico.

imagen

Un globo de mapa c煤bico representado en maptoglobe.com .

Como puede ver, un mapa equidistante tiene formas mucho m谩s hermosas, y cuando se superpone en una esfera, crea resultados similares a la superposici贸n esf茅rica, sin todos sus inconvenientes. Por cierto, la proyecci贸n equidistante se puede convertir f谩cilmente mediante diferentes programas, por ejemplo, NASA G.Projector , en casi cualquier tipo de tarjeta.

En conclusi贸n


Generar un planeta entero puede parecer una tarea desalentadora, y aunque el ruido cuando se usa correctamente es una herramienta bastante poderosa, tiene sus propios problemas que las personas han enfrentado durante muchos siglos, como la superposici贸n de un globo sobre un lienzo 2D con una distorsi贸n m铆nima.

La soluci贸n que propuse crea planetas muy generados que no tienen en cuenta las placas tect贸nicas, los r铆os, las cadenas de islas e incluso las monta帽as, y, por lo tanto, solo se pueden usar como demostraci贸n o como base para simulaciones m谩s complejas.

De hecho, solo crea una matriz de valores en un cierto rango de valores. Para im谩genes en escala de grises, esto es 0-255. Los valores se convierten en un p铆xel que crea una imagen similar a la primera imagen en escala de grises, o en una imagen en el rango de -11000 a 8000 para simular una diferencia de altura en el mundo real, despu茅s de lo cual los p铆xeles se colorean de acuerdo con los intervalos de altura (por ejemplo, valores de 0 5 son de color arena para simular la costa) .

Al construir el universo, Dios us贸 las matem谩ticas de nivel superior.

- Paul Dirac

Source: https://habr.com/ru/post/448324/


All Articles