Implementação de mapa / terreno de blocos com diferentes alturas de blocos vizinhos

10

Ahoy!

Estou procurando algumas informações sobre mapas de blocos, ou melhor, como é chamado um tipo específico de mapa de blocos.

Estou interessado no tipo de implementação usada no tycoon da montanha-russa ou na série de jogos do tycoon de transporte e tenho estudado o terreno do campo vetorial e o mapa do mapa de altura, mas não sei se eles são adequados para o que eu estou procurando desenvolve.

Tem sido difícil encontrar informações decentes, já que a maioria das pessoas se refere a elas como um mapa isométrico de blocos, mas estou procurando criar algo em 3D com uma perspectiva ortográfica fixa. Entendo que o armazenamento subjacente do mapa de blocos não tem nada a ver com a forma como ele é renderizado, mas não pretendo criar um mapa de blocos 2D como os jogos pokemon / zelda da velha escola, mais parecidos com o diablo com a capacidade de incluir falésias salientes e terrenos inclinados.

Estou apenas tentando encontrar os termos certos para pesquisar no google e no stackoverflow por recursos para me ajudar a decidir qual caminho seguir.

Até agora, consegui detalhar um mapa básico de blocos sem usar o componente height / y armazenado em um VBO e renderizado como uma estrutura de arame. Parece bom até agora, mas imagino que encontrarei problemas ao tentar manipular um único vértice para criar falésias e declives sem afetar um ladrilho vizinho.

Existe um tipo específico de implementação em que eu deveria estar analisando? Eu pensei que tinha rachado quando encontrei uma quantidade razoável se informações sobre terreno de campo vetorial, mas não tenho certeza se isso renderia os resultados corretos também.

Se alguém puder esclarecer isso para mim, por favor, a ajuda seria muito apreciada :)

Atualizar

Incluí uma imagem para esclarecimentos adicionais sobre o que eu gostaria de alcançar:

Mapa de azulejos 2.5D

Imagem emprestada de Como criar blocos isométricos inclinados (altura)

Esta imagem mostra o tipo de terreno que gostaria de gerar, mas não inclui os "penhascos" ou os tipos de terreno pendentes que estou interessado em modelar. No entanto, levanta algumas outras questões que eu não havia considerado, a saber;

  • Como 'camadas' como a água (canto superior esquerdo da imagem) seriam tratadas para incluir o solo visível embaixo da água?
  • Como as "bordas" do mapa seriam atendidas para que a terra / lama fosse renderizada para representar o mundo como uma entidade não plana?
  • O armazenamento subjacente a esse tipo de terreno poderia ser usado para modelar a física, como uma bola rolando ladeira abaixo ou a velocidade de movimento de um jogador atravessando uma ladeira?

Eu tinha uma idéia de que cada ladrilho do terreno poderia ser modelado com 8 vértices, onde os 4 vértices principais cobrem o próprio ladrilho real e os 4 vértices restantes são usados ​​para modelar os lados / paredes de cada ladrilho. Os dois problemas que vejo nesta implementação são: a) o mapa do mundo é essencialmente dobrado em tamanho eb) dado que nem todos os ladrilhos incluirão "paredes", alguns acabarão com vértices redundantes que não são usados.

Eu gostaria de criar um editor de terreno que permita que cada bloco seja deformado, além de incluir a capacidade de alterar o terreno durante o jogo. Isso por si só coloca questões adicionais como; Um VBO pode ser usado para armazenar e renderizar o terreno enquanto está sendo modificado em tempo real e também é possível modificar vértices sem afetar os ladrilhos vizinhos?

Estou com a impressão de que estou complicando demais as coisas ou passando por uma paralisia na análise, pois estou deixando de escrever qualquer código para resolver o problema sem ter uma ideia clara de como conseguiria o que quero.

Mais uma vez, estou realmente procurando um empurrão na direção certa com isso. Existe um tipo específico de implementação de mapa de mosaico / terreno que atenderia à deformação de um mapa 3D tanto por um editor de mapas quanto durante o jogo ou eu tenho que rolar sozinho, por assim dizer? Não estou tentando reinventar a roda aqui, mas estou lutando para encontrar algum recurso, pois não tenho certeza do que procurar.

Se alguém puder fornecer informações, recursos ou trechos de código, isso seria muito apreciado, pois estou ansioso para sujar as mãos e começar a produzir algo diferente do wireframe plano que tenho atualmente.

Obrigado pela leitura!

CaptainRedmuff
fonte

Respostas:

2

Se eu fosse você, investigaria os voxels, mais especificamente a renderização do cubo do tipo Minecraft . Ao contrário dos mapas de altura, eles podem lidar com saliências, cavernas, edifícios com vários andares, etc.

Você armazenaria seu terreno em uma matriz 3D de números inteiros, onde os números são mapeados para um determinado tipo de terreno: 0 = ar, 1 = sujeira, 2 = água, etc. Em seguida, para criar a malha a ser renderizada, você crie as faces de um cubo para cada voxel não vazio.

Este tutorial é uma ótima explicação de como fazer isso em C ++ usando o Ogre3D. Eu presumo que você precisaria ter um nível um pouco mais baixo no OpenGL.

Depois de criar os cubos, você deseja suavizar as bordas para criar o tipo de terreno fluido mostrado na sua imagem. Eu acredito que o PolyVox (também em C ++) faz isso; você pode dar uma olhada no código deles. Eu acho que você basicamente faz em 3D o que a imagem mostra em 2D: calcula a média das posições do cubo ao redor para saber onde colocar cada vértice.

EDITAR:

  • Gere as faces dos cubos adjacentes à água como se o ladrilho da água estivesse vazio e torne as faces da água transparentes.
  • As faces na "borda" podem ser geradas como faces normais, se você considerar voxels fora do mundo vazios.
  • Física: você provavelmente pode alimentar a malha renderizada no seu mecanismo de física como um objeto estático.
  • Editor de mapa: você deseja editar os dados subjacentes do voxel, não a malha em si! (A malha deve espelhar os dados, portanto, a edição dos voxels deve produzir alterações em sua malha.) Convém procurar Modelo, Visualização, Controlador (MVC), se você não estiver familiarizado.

Se você tiver mais perguntas, fique à vontade para deixar um comentário. Bem-vindo ao gamedev.SE!

Wackidev
fonte
Esta é uma solução muito complicada que, para um problema relativamente simples. Muitos jogos fizeram o que o OP está pedindo sem a complexidade dos voxels.
Sean Middleditch 15/05
Concordo que os voxels podem ser complicados. Você poderia vincular a esses jogos? Estou interessado em ouvir como eles fizeram isso.
Wackidev 15/05
Eu estava brincando com a ideia de usar voxels. Essa implementação implicaria que todos os cubos são de dimensões unitárias ou um único cubo poderia ser extrudado? Suponho que o mundo precisaria ser armazenado em camadas para permitir água e outros ladrilhos que possam "se sobrepor" ao longo do plano y.
CaptainRedmuff
Sim, normalmente os voxels têm tamanho de unidade. Suponho que alguém possa extrudá-los, mas acho que isso tornaria as coisas mais complicadas. Não sei se estou entendendo o que você quer dizer com camadas. Você está se referindo a telhas de água com altura variável?
Wackidev 16/05
Algo nesse sentido. Eu estava pensando mais em simplesmente definir um "piso" que poderia ser um cubo extrudado que, em seguida, tem um cubo de água no topo definido pelo plano no qual os dois se cruzam. Talvez eu tenha acabado complicando as coisas novamente. Vou ler um pouco mais sobre voxels e ver aonde isso me leva.
CaptainRedmuff
6

Este: http://30.media.tumblr.com/tumblr_m06qv6OREt1r2qjpao1_500.png é um exemplo de mapa que fiz há algum tempo.

Eu tinha um XML representando o mapa e diferentes tipos de blocos. Cada tipo teria alguns atributos:

  • Altura
  • Posição
  • Tipo de mesclagem: que tipo de mesclagem esse bloco faria ALL(se ele mesclar com qualquer bloco ao seu redor), EQUAL(mesclar apenas com blocos do mesmo tipo), NONE(nunca mesclar).
  • Altura da mesclagem: a altura máxima para inclinações (boa para saliências), digamos que você queira que um bloco seja mesclado apenas com blocos da mesma altura ou com uma diferença de 1, o valor seria um.

Eu lia todos os ladrilhos e os criava na cena. Primeiro, apenas levando em consideração a posição. Cada peça tinha que saber sua vizinha, então eu tive que percorrer o mapa duas vezes, uma vez para criar tudo e mais uma vez para mover cada vértice para a posição correta.

Embora meus modelos sejam hexágonos, o conceito é o mesmo, você precisaria de um cubo para representar seu bloco, movendo os vértices da base para o nível mais baixo e suavizando a parte superior do cubo com os cubos ao seu redor. Você também verificaria se dois lados dos cubos foram mesclados para que você possa remover esse lado do cubo (se eles não forem mesclados, provavelmente é um penhasco ou algo assim).

Sobre física, depende do seu objetivo. Se você está fazendo algo como um magnata de montanha-russa, não precisa realmente deles. Você pode apenas verificar a altura do jogador entre cada peça e decidir a velocidade de caminhada. Você poderia fazer o mesmo com um objeto que se move sozinho (como a bola), verificar as peças ao redor (ou o ângulo atual da peça) e decidir uma direção / velocidade. Se você precisar de física realista (como gravidade, atrito, etc.), seria necessário usar um mecanismo de física e a representação 3D do cubo no mecanismo.

Camadas também são possíveis, mas você precisaria de algo como minecraft (com suavização dos cubos na camada mais alta). Se você precisar apenas de camadas de água, poderá ter uma "nascente de água" em um ladrilho e fazer com que seu código preencha todos os espaços ao redor dele que estejam na mesma altura ou menos (uma solução recursiva seria adequada aqui).

Um editor de terreno também seria simples: se seu código for flexível o suficiente, você poderá aplicar as transformações em um único bloco (o que você está alterando) ou em uma lista de blocos (se estiver usando um 'pincel' para selecione e mova-os). O mesmo código pode ser usado para modificar o terreno do jogo. E sim, você pode alterar os vértices no VBO, também é possível alterar os vértices sem afetar os outros (isso também depende de você codificar dessa maneira).

Luke B.
fonte
+1 Obrigado pela sua contribuição. Você levanta um bom argumento sobre as camadas em relação à "nascente de água" que eu nunca havia considerado antes. Vou olhar para modificar o VBO on the fly agora que eu sei que é possível :)
CaptainRedmuff