Planetas de procedimiento, mapas de altura y texturas

19

Actualmente estoy trabajando en un generador de planeta procesal OpenGL. Espero usarlo para un juego de rol espacial, que no permitirá a los jugadores bajar a la superficie de un planeta, así que he ignorado todo lo relacionado con ROAM. En este momento estoy dibujando un cubo con VBO y mapeando en una esfera.

Estoy familiarizado con la mayoría de las técnicas de generación de mapas de altura fractales y ya he implementado mi propia versión del desplazamiento del punto medio (no es tan útil en este caso, lo sé).

Mi pregunta es, ¿cuál es la mejor manera de generar procedimentalmente el mapa de altura. He examinado libnoise, que me permite crear mapas de altura / texturas disponibles, pero por lo que puedo ver, necesitaría generar una red como esta .

Dejando el mosaico obvio.

¿Alguien podría aconsejarme sobre la mejor ruta a seguir?

Cualquier aporte seria muy apreciado.

Henryprescott
fuente

Respuestas:

18

En primer lugar, no estoy seguro de por qué desea implementar un mapa de altura (es decir, desplazamiento de geometría) si las personas no podrán aterrizar, simplemente parece más eficiente mapearlo o algo así.

Dicho esto, lo que quieres es convertir de una arbitraria (x, y, z)a una (u, v)coordenada, lo cual es trivial. No se necesita cubemap.

texto alternativo

texto alternativo

  1. Cada (u, v)texel tiene una altura (mapa de altura RGB = height) y una posición (x, y, z) = pos.
  2. Encuentra y normalizar la posición, NORMAL(x, y, z) = N.
  3. Nuevo vértice = pos+N*height.

Esto funcionará mejor con una mayor teselación. Utilice también el libnoisemapeo esférico adecuado para su mapa de altura, que se verá más o menos así (pero en blanco y negro):

texto alternativo

David Titarenco
fuente
1

El mapeo de altura de desplazamiento del punto medio es un buen lugar para comenzar. OP, ¿por qué crees que no lo es?

OP es bueno para modelar la superficie del planeta como un mapa de cubos, porque cualquier mapa plano (por ejemplo, proyección de mercator) tendrá distorsiones que son feas y complicadas, matemáticamente.

Si fuera OP, me olvidaría de la geometría del planeta a gran escala al principio. Haría un mapa de cubos donde cada cara es 2 ** N + 1 píxeles (2,3,5,9,17,33 ...) y cada texel codifica una altura [0..N) donde 0 es la altitud de la trinchera más baja esperada y N es la altitud de la montaña más alta esperada del planeta.

Luego calcularía alturas aleatorias para los ocho vértices del cubo y los propagaría a los seis cuadrados del mapa del cubo, de modo que cada vértice aparezca tres veces.

Mientras genero recursivamente alturas fractales para los puntos medios de los bordes, me aseguraré de propagar los vértices del borde de la cara a la otra cara que los comparte.

Una vez que termine, tengo un mapa de cubos donde todos los texels del borde se duplican y todos los texels de la esquina se triplican. No es necesario convertirlo en un mapa normal: usaría el algoritmo en el documento de Morten Mikkelsen para representar las normales directamente desde el mapa de altura en tiempo de ejecución.

En el tiempo de ejecución, probablemente renderice un quad que cubra la proyección del planeta en la pantalla y realice una prueba de intersección de esfera de rayos en el sombreador de píxeles para determinar si golpeé el planeta y dónde. Claro que supera el rasterizado de un modelo de esfera altamente teselada, y también obtiene un borde suave y agradable.

bmcnett
fuente
1

El ruido de desplazamiento del punto medio, con el desplazamiento máximo escalado por la longitud absoluta del píxel, puede producir un mapa de ruido esférico rápidamente. Las tablas de colores que toman la altitud, la pendiente y la luz solar o la longitud como parámetros pueden usarse para sombrear el planeta automáticamente.

bjk
fuente