Como carregar um planeta esférico e suas regiões?


14

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.

método de 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.

método do 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.


Antes de começar a escrever, seu mundo é uma esfera? Você está tentando impor uma grade em uma esfera em que cada grade tem propriedades salvas em um arquivo?
Alec Teal

@AlecTeal Estou tentando simular um planeta. Portanto, é globalmente uma esfera. E o principal problema é que o jogador pode tentar aterrar em qualquer ponto, em um poste ou ao longo do equador.
Aracthor 22/09/2015

2
Então .... tenho que perguntar, você procurou por "mecanismo esférico de jogos mundiais", pois há muitas implementações lá. Por que eles não trabalham? Além disso, é por isso que temos mapas de cubos; eles são os gráficos padrão em qualquer variedade topológica homeomórfica em uma esfera por esse motivo!
Alec Teal

1
sugerem avaliar opção esfera também quad
dnk drone.vs.drones

maths.kisogo.com/index.php?title=Notes:Spherical_coordinates rascunho preliminar. Precisa de fotos e deve ser finalizado.
Alec Teal

Respostas:


5

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 ae bestã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


@Alec_Teal Estou na sua resposta desde que você a publicou, complexa e difícil de entender (não estou acostumada a tantas fórmulas matemáticas), mas acho que preciso entender ... O seu método é realmente diferente de um cubo esfera como descrito acima? Eu não entendi se suas "cartas" são projeções quadrados ou algo mais ...
Aracthor

@ Aracthor é mais geral. Um gráfico é literalmente como um gráfico em um livro (de mapas), basta impor uma grade em alguma área. Digamos que você tenha um toro, por exemplo, ou um toro com 2 orifícios, você precisará desses métodos. Nenhuma das respostas aqui lida com coordenadas em uma esfera e com maneiras regulares de criar a geometria, o que é uma tarefa diferente. Posso ajudar com as fórmulas, tentei escrevê-las o mais acessível possível, mas esse é o meu pão com manteiga, por isso não vejo a complexidade.
Alec Teal

@Alec_Teal Eu validei, mas ainda acho que não entendi tudo. Mas vamos continuar essa discussão em uma sala de bate - papo .
Aracthor 28/09/2015

12

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)

Esfera subdividida com base em um cubo

( 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.

Variando a função de mapeamento para melhorar a uniformidade

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:

Achatamento de pavimentações geodésicas em uma grade triangular regular Rede de um icosaedro em uma grade triangular

E uma grade triangular regular pode ser tratada como uma grade quadrada, conforme discutido aqui .

Isomorfismo da grade triangular-quadrada

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:

Desembrulhando uma geosfera em gráficos retangulares

(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.


1
Há algumas coisas boas aqui. Eu faria +1, mas pretendo escrever uma resposta mais tarde (tento ficar de fora das fases iniciais da votação quando também respondo). Meus únicos comentários seria que esta abordagem é melhor para a prestação de esferas de modelagem da superfície
Alec Teal

Apenas caso você esteja curioso, agora terminei minha resposta.
Alec Teal

4

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


0

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.


Isso contorna o problema, abrindo a opção de não projetar a superfície explorável do planeta como uma esfera, mas não a resolve.
Philipp
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.