2009-09-19 29 views
14

Estoy buscando algunos algoritmos que me permitan generar un mapa de terreno 2D realista. Por realista quiero decir que esa persona considerará ese mapa como un mapa del terreno "normal", no creado artificialmente. No quiero crear un mapa fotorrealista. Algo similar a los mapas que se pueden ver en un atlas geográfico.Realista 2D generación de mapas de terreno

Hasta ahora estoy usando perlin noise para el mapa de altura y luego estoy agregando lagos, ríos, montañas, pantanos, etc. Es posible que mira cómo se ve en la imagen siguiente:

Terrain map http://www.freeimagehosting.net/uploads/1f1e9372bf.png

No estoy contento con él. No es realista, pero no puedo descubrir algo mejor por mi cuenta. El tiempo no es una cuestión, por lo que los algoritmos pueden ser muy computacionales.

Gracias por su tiempo.

Después de editar:

Creo que he encontrado un artículo que puede ser útil: http://portal.acm.org/citation.cfm?id=1255047.1255077

Sin embargo, no se puede obtener de forma gratuita, así que estoy todavía en busca de respuestas o ideas.

+4

No encuentro el artículo que quería, pero básicamente utilizaba un sistema de colinas basadas en localidad para generar islas agradables. Posiblemente esté relacionado con aquí: http://pcg.wikidot.com/articles Pero puedo revisarlos todos. – Pod

+0

+1 para el gran enlace. Gracias por los recursos Pod. Los encuentro realmente útiles. – Wodzu

+0

No dijiste por qué no es realista, califica lo que no te satisface en esas representaciones, los ríos, las fronteras, las formas ... no me gusta la proporción de verde a azul, demasiado verde no da ningún contraste, y el los ríos están lo suficientemente fijos ... por lo que al menos agregan más agua o información sobre la altura, como playas, deltas, picos, etc. y más costas. –

Respuesta

2

El terreno está creado por una miríada de causas diferentes en diferentes escalas de tiempo. Para realmente crear un terreno realista, tendrías que simular estos.

En el término "corto", la hidrosfera determina la mayoría de las características. Probablemente pueda comenzar con un terreno voxel/particle/heightmap/mesh que contenga características principales (cadenas montañosas, etc.) y tratarlo como inmutable, luego procesarlo posteriormente con una gran cantidad de simulaciones de agua. Tendrá que calcular dónde estarán los ríos y lagos, cómo erosionan el paisaje base y dónde forman depósitos. Si tuviera que codificar esto probablemente comenzaría con un mundo voxel 3D.

Esta sería una tarea colosal y estoy seguro de que hay muchos trucos disponibles para generar tipos de terreno específicos que demoran milisegundos en lugar de minutos. ¿Qué tipo de terreno estás buscando crear? ¿Montañoso? Tierras bajas? ¿Industrializado? ¿Bosque? ¿Desierto? ¿Archipiélago?

Resumen breve: si quiere un terreno que parezca realista para los humanos (que, después de todo, son expertos en este tipo de cosas), tendrá que crearlo simulando procesos geológicos reales.

5

He jugado antes con generación de terreno. Asumiendo que el objetivo es un mapa de bits, encontré una manera de hacer cosas como los ríos y, en general, hacer que se vea mejor: Erosión.

Una vez que el terreno generado por otros medios lo erosione un poco: necesita el mundo expresado como alturas de píxeles. Tome un lugar en el mapa y mueva una unidad de altura al vecino más bajo. Mueva el cursor a este vecino y repita hasta que no se mueva. Repita para otros píxeles.

Para que los ríos cuenten la cantidad de veces que pasas por una ubicación bajando bits. Los puntos que son más golpeados son los ríos.

Seguimiento: No estaba erosionando cada píxel tanto como simplemente una gran cantidad de píxeles aleatorios hasta que caducara lo suficiente. La razón por la que realmente se erosionan es que esto lleva los bits hacia abajo y llena los agujeros. Sin eso no puede haber ríos, ya que habrá muertos que atraparán el flujo: los píxeles que fluyen llenan los pequeños agujeros y crean canales de agua.

Lo siento, no puedo dar ninguna muestra, esto fue hace muchos años y, aunque el código anterior probablemente esté en algún lugar, no sé dónde buscar.

+0

Gracias Loren. No estoy seguro de que te haya entendido correctamente. ¿Debo erosionar cada píxel en el mapa? Esto es algo comparable a solo por un ejemplo que comienza en la cima de la colina local y que baja en una dirección determinada. Al decir "bajar" me refiero a buscar un píxel vecino con menos o igual altitud. Y continúe hasta que la condición no sea violada. Esto es lo que estoy haciendo ahora (pero no baje la altitud) y es posible que vea los resultados. Sería genial si pudiera ver algunas capturas de pantalla de tu generador. – Wodzu

+0

@Wodzu, creo que la sugerencia de Loren es la dirección correcta para usted. Y no, no tienes que erosionar cada píxel; pero debes mover un poco (desplazarlos, el sedimento también es importante para la forma). Ver http://markjstock.org/pages/builder.html imagen para 'erosionar'. – Unreason

1

Mi método en Terra3D era generar valores de altura aleatorios, y luego hacer 3 pases de suavizado con una pequeña remodelación escrita en el algoritmo. La remodelación hace que el terreno debajo de la línea de agua se desplace un poco hacia abajo y todo lo que está sobre la línea de agua se eleve un poco. El efecto es un montón de colinas y pequeños lagos. Y eso puede no ser lo que estás buscando exactamente.

Sin embargo, no estoy convencido de que el principio detrás de mi método no pueda usarse para obtener lo que desea. Puede que tenga que escribir algunas condiciones más en el algoritmo de remodelación/suavizado. Por ejemplo, reducir la cantidad de suavizado en el terreno a elevaciones más altas creará una apariencia de montaña rocosa. Y luego escribir un algoritmo de suavizado (o gaussiano) más complejo que se extienda aún más para las elevaciones más bajas podría unir esos lagos para formar ríos naturales.

Aquí está el código para la generación del terreno en Terra3D en caso de que esté interesado:

// GENERATE TERRAIN 
    for (i = 0; i < MAX; i++) 
    {  
    for (i2 = 0; i2 < MAX; i2++) 
    { 
     if (i<10 || i2<10 || i>MAX-10 || i2>MAX-10) 
     field[i][i2].y=0; 
     else 
     field[i][i2].y=(GLfloat(rand()%151)-75)/50+(field[i-1][i2-1].y+field[i-1][i2].y+field[i-1][i2+1].y+field[i-1][i2-2].y+field[i-1][i2+2].y)/5.05; 
    } 
    } 

    // SMOOTH/RESHAPE TERRAIN 
    for (int cnt = 0; cnt < 3; cnt++) 
    { 
    for (int t = 1; t < MAX-1; t++) 
    { 
     for (int t2 = 1; t2 < MAX-1; t2++) 
     { 
     field[t][t2].y = (field[t+1][t2].y+field[t][t2-1].y+field[t-1][t2].y+field[t][t2+1].y)/4; 

     if (cnt == 0) 
     { 
      if (field[t][t2].y < -1 && field[t][t2].y > -1-.5) field[t][t2].y -= .45, field[t][t2].y *= 2; 
      else if (field[t][t2].y > -1 && field[t][t2].y < -1+.5) field[t][t2].y += .5, field[t][t2].y /= 5; 
     } 
     } 
    } 
    } 

Es descuidado código que escribí hace unos 10 años. Terra3D fue un largo proceso de aprendizaje de experimentación y torpeza en la oscuridad para producir el tipo de efectos que estaba buscando. Pero tal vez ayude.

+1

¡Oh Dios mío, ese menú en tu sitio web era molesto! –

+1

Ah sí, creé ese menú cuando tenía 18 años. Jaja, baja el volumen un poco. ;) –

+0

Gracias Steve por su interés y por el código. ¡Todavía estoy trabajando en mi generador! Su código es bueno para un simulador de vuelo 3D ya que en este tipo de juegos el usuario está satisfecho con algunos lagos y montañas. Realmente no le importa mucho la estructura del terreno y su lógica. Sin embargo, estoy tratando de lograr algo diferente. Si abres un álbum geográfico y miras el terreno, ves que es aleatorio pero también cumple algunas reglas. f.e. un río cae de las montañas a algún lago o mar, o las montañas están dispuestas en algunos grupos. – Wodzu

1

Sé que esta es una pregunta muy antigua, pero estoy respondiendo esto para las personas futuras que busquen un buen generador de terreno, como yo. Utiliza la versión gratuita de World Machine 2. Es un generador de terreno que puede hacer exactamente lo que estás pidiendo y más. Ha sido utilizado por profesionales para generar imágenes, relieve mundial en 3D e incluso para mapas como lo que sugiere. Tenga en cuenta que la versión gratuita es solo para usos no comerciales.

+0

Por cierto, el sitio web es www.world-machine.com –

+0

Gratis es muy limitado en el tamaño del mapa Y genera el mapa una sola vez (o cuántas veces presiona el botón "generar"), que no es muy satisfactorio cuando quieres un mapa generado aleatoriamente en tu aplicación :) –

+0

Gracias Felipe M. La pregunta es antigua, pero todavía estoy interesado en cualquier ayuda. Te doy +1 por tu respuesta porque el generador de terreno para el que le diste el enlace produce un terreno de aspecto realmente agradable. Sin embargo, este terreno aún no tiene ningún sentido lógico;) Ok, puede generar una montaña y un poco de agua. Pero está generando un "clúster" de los mismos objetos. ¿Dónde están los lagos, ríos y otras montañas? Esos "objetos" deben colocarse en el mapa de forma natural, de la misma manera que lo haría la madre naturaleza :) Por ejemplo: el río fluye de una montaña a otra. – Wodzu

Cuestiones relacionadas