Implementación del mapa de mosaico / terreno con diferentes alturas de mosaicos vecinos

10

Ahoy!

Estoy buscando información sobre mapas de mosaicos, o más bien, cómo se llama un tipo específico de mapa de mosaicos.

Estoy interesado en el tipo de implementación utilizada en el magnate de la montaña rusa, o en la serie de juegos de magnate del transporte y he estado investigando el terreno del campo vectorial y el terreno del mapa de altura, pero no estoy seguro de que sean adecuados para lo que estoy buscando desarrollar.

Ha sido difícil encontrar información decente, ya que la mayoría de las personas se refieren a ella como un mapa de mosaico isométrico, pero estoy buscando crear algo en 3D con una perspectiva ortográfica fija. Entiendo que el almacenamiento subyacente del mapa de mosaicos no tiene nada que ver con cómo se representa, pero no estoy buscando crear un mapa de mosaicos 2D como los juegos de pokemon / zelda de la vieja escuela, más en la línea de diablo con la capacidad de incluir acantilados colgantes y terreno inclinado.

Solo estoy tratando de encontrar los términos correctos para buscar en google y stackoverflow recursos que me ayuden a decidir qué camino seguir.

Hasta ahora, he logrado desarrollar un mapa de mosaico básico sin usar el componente de altura / y almacenado en un VBO y representado como una estructura alámbrica. Esto se ve bien hasta ahora, pero imagino que tendré problemas al tratar de manipular un solo vértice para crear acantilados y pendientes sin afectar a un mosaico vecino.

¿Hay algún tipo específico de implementación que debería investigar? Pensé que lo había descifrado cuando encontré una buena cantidad de información sobre el terreno del campo vectorial, pero tampoco estoy seguro de que esto arroje los resultados correctos.

Si alguien puede arrojar algo de luz sobre esto por favor, la ayuda sería muy apreciada :)

Actualizar

He incluido una imagen para obtener más aclaraciones sobre lo que me gustaría lograr:

Mapa de mosaico 2.5D

Imagen tomada de Cómo crear mosaicos isométricos inclinados (altura)

Esta imagen muestra el tipo de terreno que me gustaría generar pero no incluye los "acantilados" o los tipos de terreno sobresalientes que estoy interesado en modelar. Sin embargo, plantea algunas otras preguntas que no había considerado, a saber;

  • ¿Cómo se manejarían las 'capas' como el agua (arriba a la izquierda de la imagen) para incluir el suelo visible debajo del agua?
  • ¿Cómo se atenderían los "bordes" del mapa para que la tierra / barro represente al mundo como una entidad no plana?
  • ¿Podría usarse el almacenamiento subyacente para este tipo de terreno para modelar la física, como una pelota rodando por una colina o las velocidades de movimiento de un jugador que atraviesa una pendiente?

Tenía la idea de que cada mosaico del terreno podría modelarse con 8 vértices donde los 4 vértices principales cubren el mosaico real y los 4 vértices restantes se usan para modelar los lados / paredes de cada mosaico. Los dos problemas que veo con esta implementación son que a) el mapa mundial tiene un tamaño esencialmente doble yb) dado que no todos los mosaicos incluirán "paredes", algunos mosaicos terminarán con vértices redundantes que no se utilizan.

Me gustaría crear un editor de terreno que permita que cada ficha se deforme y que incluya la posibilidad de cambiar el terreno durante el juego. Esto en sí mismo plantea preguntas adicionales como; ¿Se puede usar un VBO para almacenar y renderizar el terreno mientras se modifica sobre la marcha y también, es posible modificar los vértices sin afectar las fichas vecinas?

Tengo la impresión de que estoy complicando demasiado las cosas o me encuentro con parálisis de análisis, ya que no estoy escribiendo ningún código para resolver el problema sin tener una idea clara de cómo lograr lo que quiero.

Nuevamente, realmente estoy buscando un empujón en la dirección correcta con esto. ¿Existe un tipo específico de implementación de mapa de mosaico / terreno que se adapte a un mapa 3D que se deformará tanto por un editor de mapas como durante el juego o tengo que rodar el mío, por así decirlo? No estoy tratando de reinventar la rueda aquí, pero estoy luchando por encontrar recursos dado que no estoy seguro de qué buscar.

Si alguien puede proporcionar información, recursos o fragmentos de código, eso sería muy apreciado ya que estoy ansioso por ensuciarme las manos y comenzar a producir algo más que la estructura plana que tengo actualmente.

¡Gracias por leer!

CaptainRedmuff
fuente

Respuestas:

2

Si fuera usted, buscaría vóxeles, más específicamente el renderizado de cubos de tipo Minecraft . A diferencia de los mapas de altura, pueden manejar voladizos, cavernas, edificios con múltiples pisos, etc.

Almacenaría su terreno en una matriz 3D de enteros, donde los números se asignan a un determinado tipo de terreno: 0 = aire, 1 = tierra, 2 = agua, etc. Luego, para crear la malla para renderizar, debería crea las caras de un cubo para cada vóxel no vacío.

Este tutorial es una gran explicación de cómo hacer esto en C ++ usando Ogre3D. Supongo que tendrías que ir un poco más bajo en OpenGL.

Después de crear los cubos, querrás suavizar los bordes para crear el tipo de terreno fluido que se muestra en tu imagen. Creo que PolyVox (también en C ++) hace esto; puedes echar un vistazo a su código. Creo que básicamente haces en 3D lo que muestra la imagen en 2D: promedia las posiciones del cubo circundante para saber dónde colocar cada vértice.

EDITAR:

  • Genere las caras para los cubos adyacentes al agua como si la baldosa de agua estuviera vacía, y haga que las caras del agua sean transparentes.
  • Las caras en el "borde" se pueden generar como caras normales, si considera que los vóxeles fuera del mundo están vacíos.
  • Física: probablemente puede alimentar la malla renderizada a su motor de física como un objeto estático.
  • Editor de mapas: ¡Desearía editar los datos voxel subyacentes, no la malla en sí! (La malla debería reflejar los datos, por lo que editar los vóxeles debería producir cambios en su malla). Es posible que desee buscar Modelo, Vista, Controlador (MVC) si no está familiarizado con él.

Si tiene más preguntas, no dude en dejar un comentario. Bienvenido a gamedev.SE!

Wackidev
fuente
Esta es una solución muy complicada que para un problema relativamente simple. Muchos juegos han hecho lo que el OP pide sin la complejidad de los vóxeles.
Sean Middleditch
Estoy de acuerdo en que los vóxeles pueden ser complicados. ¿Podrías vincular a estos juegos? Estoy interesado en saber cómo lo hicieron.
Wackidev
Estaba jugando con la idea de usar voxels. ¿Esta implementación implicaría que todos los cubos son de dimensiones unitarias, o podría extruirse un solo cubo? Supongo que el mundo necesitaría ser almacenado en capas para permitir el agua y otros mosaicos que pueden "superponerse" a lo largo del plano y.
CaptainRedmuff
Sí, típicamente los vóxeles son del tamaño de la unidad. Supongo que uno podría extruirlos, pero creo que eso solo lo haría más complicado. No estoy seguro de entender lo que quieres decir con las capas. ¿Te refieres a las baldosas de agua de altura variable?
Wackidev
Algo en ese sentido. Estaba pensando más en simplemente definir un "piso" que podría ser un cubo extruido que luego tiene un cubo de agua en la parte superior definido por el plano donde se cruzan los dos. Quizás haya terminado de complicar las cosas otra vez. Leeré un poco más sobre vóxeles y veré a dónde me lleva.
CaptainRedmuff
6

Esto: http://30.media.tumblr.com/tumblr_m06qv6OREt1r2qjpao1_500.png es un ejemplo de un mapa que he hecho hace algún tiempo.

Tenía un XML que representaba el mapa y diferentes tipos de mosaicos. Cada tipo tendría algunos atributos:

  • Altura
  • Posición
  • Tipo de fusión: qué tipo de fusión haría este mosaico ALL(si se fusionara con cualquier mosaico a su alrededor), EQUAL(solo se fusiona con mosaicos del mismo tipo), NONE(nunca fusionar).
  • Altura de combinación: la altura máxima para pendientes (buena para voladizos), supongamos que desea que una ficha se fusione solo con fichas en la misma altura o una diferencia de 1, el valor sería uno.

Luego leía todos los mosaicos y los creaba en la escena. Primero solo teniendo en cuenta la posición. Cada mosaico tenía que saber que era vecino, así que tuve que recorrer el mapa dos veces, una para crear todo y una vez más para mover cada vértice a la posición correcta.

Aunque mis modelos son hexes, el concepto es el mismo, necesitaría un cubo para representar su mosaico, luego movería los vértices de la base al nivel más bajo y 'suavizaría' la parte superior del cubo con los cubos a su alrededor. También verificaría si dos lados de los cubos se fusionaron para que pueda eliminar ese lado del cubo (si no se fusionan, probablemente sea un acantilado o algo así).

Sobre física, depende de tu objetivo. Si estás haciendo algo como el magnate de la montaña rusa, realmente no los necesitas. Podrías verificar la altura del jugador entre cada ficha y decidir la velocidad de caminata. Puede hacer lo mismo para un objeto que se mueve solo (como la pelota), puede verificar las fichas (o el ángulo actual de la ficha) y decidir una dirección / velocidad. Si necesita una física realista (como la gravedad, la fricción, etc.) tendría que usar un motor de física, y podría usar la representación 3D del cubo en el motor.

Las capas también son posibles, pero necesitaría algo como Minecraft (con suavizado en los cubos en la capa más alta). Si solo necesita capas para el agua, puede tener un "manantial de agua" en un mosaico y hacer que su código llene cada espacio a su alrededor que esté a la misma altura o más bajo (una solución recursiva encajaría bien aquí).

Un editor de terreno también sería simple, si su código es lo suficientemente flexible, puede aplicar las transformaciones a un único mosaico (el que está cambiando), oa una lista de mosaicos (si está usando un 'pincel' para seleccionar y moverlos). Se puede usar el mismo código para modificar el terreno en el juego. Y sí, puedes cambiar los vértices en el VBO, también es posible cambiar los vértices sin afectar a otros (también depende de que codifiques así).

Lucas B.
fuente
+1 Gracias por tu aporte en esto. Usted plantea un buen punto sobre las capas con respecto al "manantial de agua" que no había considerado antes. Buscaré modificar el VBO sobre la marcha ahora que sé que es posible :)
CaptainRedmuff