Estou projetando um jogo parcialmente composto por exploração de planetas. Quero usar a geração pseudo-aleatória para eles, regenerando a partir de uma semente definida quando precisar carregá-los, em vez de armazenar todos os detalhes, o que seria muito pesado. Então, armazenarei em um arquivo a semente aleatória e as modificações feitas pelo jogador, se houver.
O jogador deve poder ver o planeta em órbita (com nível muito baixo de detalhes, depois descer ao chão, aumentando lentamente o nível de detalhes da região em que está pousando e descarregando os que estão do outro lado). do planeta, que ficam fora do campo de visão do jogador.
Se eu tivesse que fazê-lo em um terreno plano, faria facilmente com um sistema de blocos quadrados. Mas o problema aqui é que os planetas são - quase - esferas.
Então, qual seria a melhor maneira de carregar detalhes do solo (relevo e objetos aterrados) em torno de um ponto preciso?
Eu já pensei em duas soluções, mas ambas têm um ponto fraco:
1. Cortando a esfera em pedaços quadrados.
Uma vez que o jogador esteja próximo o suficiente do solo, só preciso melhorar os detalhes dos quadrados mais próximos a partir de sua posição.
Se não for suficiente, ainda posso cortar cada quadrado em sub-quadrados para carregar quando os jogadores estiverem no chão ou realmente perto do chão.
Mas, como você pode ver na figura, existe um problema se o jogador tentar pousar em um poste: os quadrados se tornam retângulos muito finos ou até triângulos para a última linha e, além do fato de que seriam muitos para carregar, geração pareceria distorcida.
2. Partindo de um icosaedro.
Aqui, eu poderia aumentar o mosaico do triângulo em torno da posição do jogador quando ele / ela estiver chegando perto.
Mas não sei como localizar triângulos perto da posição do jogador. Ouvi dizer que as coordenadas cartesianas podem ser úteis nesse caso, mas não sei como usá-las.
Estou usando C ++ / OpenGL para isso, então o principal a ser gerado e carregado aqui são os vértices que representam o relevo da superfície e a cor / textura.
fonte
Respostas:
Ok, então eu escrevi aqui:
http://www.maths.kisogo.com/index.php?title=Notes:Spherical_coordinates
(Eu precisava da marcação matemática e também é muito longa)
Aplicando o documento
O documento começa introduzindo a noção de uma variedade, uma variedade é aquela em que partes dela são "homeomórficas" (basicamente: o mesmo que) partes de R ^ n (R ^ 2 é o plano x / y, como você pode conhecer)
Um gráfico cobre alguns (possivelmente todos, embora no caso de uma esfera NÃO PODE cobrir todos) de um coletor.
No artigo, desenvolvo 4 gráficos para a esfera que preserva ângulos, ou seja, eles mantêm distância regular.
Como você descobriu que dar coordenadas para pontos em uma esfera é realmente bastante difícil! Em vez disso, o que fazemos (embora em um círculo no exemplo) é atribuir a cada ponto uma coordenada da forma (i, x, y) onde i é um número entre 1 e 6 para uma esfera, 1 e 4 para um círculo. Este é o número do gráfico.
Os x e y se referem aos ângulos desse gráfico (ou apenas x se for um círculo).
Os 6 gráficos de uma esfera são os hemisférios superior / inferior, esquerdo / direito e frontal / traseiro.
Coordenadas
Agora você pode dar a cada ponto uma coordenada "legal" que seja bem comportada. Em termos matemáticos, os domínios dos gráficos são mapas "abertos", isto significa que existe algum número positivo, de modo que uma bola em torno de cada ponto também esteja no conjunto. Por exemplo, o intervalo (0,1) (o conjunto que contém x se 0 <x <1) está aberto, digite p em (0,1) (por exemplo, 0,001) e, em seguida, existe um número (por exemplo, 0,0005) como que qualquer ponto dentro de 0,0005 de 0,001 também está em (0,1).
O que isso significa é que você pode passar as direções pelos gráficos.
Agora, existem 45 graus de sobreposição nos gráficos que desenvolvemos. Isto significa que se você tem uma característica em coordenadas (i, x, y) você pode seguramente especificar pontos da forma (i, x + a, y + b) enquanto
a
eb
estão entre -45 e +45 (em graus)Qualquer ponto da forma (i, x + a, y + b) pode ser facilmente transformado em um ponto no espaço tridimensional "normal" sem problemas.
Implementação
Agora você tem uma maneira de armazenar coordenadas para algo em uma esfera e indicar regiões grandes áreas de espaço com essas coordenadas, elas também se comportam como coordenadas, estão abertas por exemplo (o que é um problema se você usar 2 ângulos)
Você também pode descartar totalmente as respostas "como criar uma esfera regular" agora, porque tudo o que você precisa fazer é fazer 6 planos e garantir que as bordas estejam alinhadas (o que é trivial) e o resultado é:
Você terá uma esfera agradável com coordenadas fáceis de usar
Qualquer dúvida, por favor, tentei assumir pouco conhecimento prévio. Eu também sou novo em ensinar pessoas
fonte
Como você já demonstrou, existem várias soluções para esse problema, mas nenhuma é 100% ideal. Esferas são complicadas.
Baseado em cubo
Uma rota comum, usada por Spore e provavelmente outros jogos (embora seja difícil dizer com certeza sem espiar sob o capô), é projetar a esfera em um cubo e usar uma grade quadrada sobre cada face do cubo.
(Isso é o que Alec Teal e dnk drone.vs.drones estão descrevendo nos comentários acima)
( Imagem deste post que descreve o uso de uma representação cúbica para LoD )
Isso tem muitas vantagens do método de latitude-longitude, com muito menos distorção de pico. É fácil converter entre posições na grade de faces e posições na esfera, normalizando um vetor ou dividindo seu maior componente em valor absoluto. Ele também se alinha bem às técnicas de texturização de mapeamento de cubos , que podem ser úteis ao visualizar todo o planeta à distância.
A abordagem típica de mapeamento é chamada de projeção gnomônica e ainda possui um problema de incompatibilidade de densidade, como você pode ver na imagem acima. A grade é muito mais densa perto dos cantos do cubo do que no centro das faces. Se a uniformidade é importante, você pode reduzir isso com as fórmulas de mapeamento corretas, mas isso geralmente dificulta a reversão do mapeamento.
Em todos os casos, você ainda terá uma distorção angular nos cantos, onde uma interseção de grade comum de quatro quadrados com ângulos de 90 graus se torna um encontro de 3 losangos com ângulos de 120 graus.
À base de icosaedro
Minha abordagem favorita pessoal seria a versão icosaédrica que você descreveu, porque torna o pico da distorção angular o menor possível. Onde a grade triangular normalmente tem seis triângulos se encontrando em ângulos de 60 graus, os vértices do icosaedro têm 5 triângulos se encontrando em ângulos de 72 graus. Portanto, cada um tem menos distorção do que os quadrados no exemplo do cubo.
Não é um território tão familiar quanto os quadrados da versão do cubo, e é provavelmente por isso que não é tão popular. É preciso um pouco mais de matemática para trabalhar.
Identificar pontos próximos não é tão complicado quanto parece. Qualquer esfera geodésica baseada em icosaedro pode ser achatada em uma grade triangular regular:
E uma grade triangular regular pode ser tratada como uma grade quadrada, conforme discutido aqui .
Assim, uma vez que você determina em qual face do icosaedro você está (o que pode ser feito com uma transmissão de raios contra uma malha icosaédrica - não conheço nenhuma maneira matemática inteligente de simplificar essa parte), o ambiente pode ser preenchido usando métodos conhecidos travessia da grade. :)
Editar:
Se você usar uma geodésica Classe I, poderá desembrulhar seus planetas em cinco gráficos retangulares para armazenar blocos / texturas / mapas de altura de maneira eficiente, semelhante aos seis gráficos quadrados usados para armazenar uma versão baseada em cubo:
(Isso pode ajudar a abordar a preocupação levantada pela Fuzzy Logic em outra resposta. Isso também é possível, mas um pouco mais complicado para os geodésicos da Classe II. Não investiguei a Classe III)
O truque é que os eixos desses gráficos não são realmente perpendiculares em uso; portanto, as ferramentas / tecnologia de criação e streaming existentes não o suportam imediatamente. Se você está planejando escrever seu próprio pedaço de streaming de qualquer maneira ou usar a geração de procedimentos on-the-fly, isso pode não ser um problema. Você também pode solucionar o problema de autoria, gerando seus mapas de origem em uma resolução mais alta do que o necessário, usando ferramentas mais convencionais e, em seguida, executando-os através de um processo de cozimento que mostra amostras ao longo da grade do gráfico para criar uma representação densa e eficiente que se conecta diretamente na estrutura icosaédrica.
fonte
Quad-sphere com LOD fragmentado é o método preferido se você deseja ir do espaço para o solo com qualquer nível de terreno detalhado, como mapeamento de altura e texturas procedurais ou predefinidas.
O Icosasphere fornece uma malha mais uniforme e é fácil de pavimentar, mas apresenta problemas ao tentar mapear texturas e mapas de altura que você precisará armazenar em cache e não será muito compacto ou simples dessa maneira.
A quad-esfera possui pontos de aperto, mas com mosaico suficiente, você não os verá de nenhuma maneira. Em seguida, você pode mapear texturas e implementar o DLOD efetivamente, como se cada região (bloco) fosse uma grade quadrada com pouco problema. É mais simples de implementar em comparação com uma icosasfera e será mais eficiente, tanto em computação quanto em recursos.
Veja os artigos de Sean O'Neil sobre a geração de um universo processual no Gamasutra:
- Parte 1: Perlin Noise e Fractal Brownian Motion para mapas de altura e texturas.
- Algoritmo ROAM da parte 2 para malha processual com DLOD para geração de planeta. Sofre de problemas de desempenho. Não recomendado, mas bom para valor educacional.
- Parte 3 Resolve problemas com problemas de escala maciça, otimização e ponto flutuante. Principalmente relacionado à escala do universo, mas também aplicável aos planetas ao fazer a transição de escalas de anos-luz para centímetros, se desejar.
- Parte 4 Discute a implementação de Quad-sphere com DLOD em blocos (quad-tree) para geração de planeta <- veja este artigo em particular
fonte
Não sou especialista em programação, mas você pode ter algum tipo de ponto de verificação. Enquanto você é liberado através de um ponto de verificação de segurança, com animação, é claro, a superfície do planeta pode carregar e vice-versa.
fonte