Como renderizar universo infinito?

15

Estou curioso para saber quais são as melhores práticas na indústria de desenvolvimento de jogos para renderizar o universo 3D?

Para ser mais específico:

  • Os pontos de dados são dados e estáticos. Cada ponto tem posição, cor e tamanho;
  • O conjunto de dados inteiro é muito maior que a memória disponível;
  • O usuário deve conseguir "diminuir o zoom" para ver uma imagem maior de uma só vez;

A abordagem mais ingênua seria dividir o universo em cubos e renderizar apenas o que é visível. Não sei como nesse cenário devo implementar o "diminuir o zoom". Devo pré-calcular cubos para cada nível de zoom possível? Ou talvez haja abordagens melhores?

Estou procurando uma solução independente de tecnologia.

Anvaka
fonte
2
Você planeja ter algum tipo de distância máxima de visão ou tem alguma maneira de mesclar pontos distantes para não precisar renderizá-los individualmente ou os "pontos" são opacos e organizados para que a maioria deles escondido de qualquer ponto de vista? Como nenhuma das opções acima se aplica, não vejo nenhuma maneira de impedir que o usuário encontre ângulos de câmera a partir dos quais a maioria dos pontos (ou pelo menos uma fração significativa deles) ficará visível ao mesmo tempo.
Ilmari Karonen
4
A propósito, um pouco exótico, mas você considerou dados gerados proceduralmente? Você não tem o benefício de áreas de criação personalizadas, mas o resultado é que o conteúdo é baseado em equações, não em grandes quantidades de dados. Com alguma criatividade, isso poderia simplificar muitas coisas (:
Alan Wolfe
11
A infinite universeredução / ampliação de um zoom pode ser semelhante ao rastreamento de relações entre dois pontos em alguma curva de Mandelbrot após o zoom em níveis diferentes. Em algum nível, você pode perder a precisão e não conseguir diferenciá-los ou até localizá-los novamente.
User2338816
11
A produção personalizada do @AlanWolfe ainda é possível - o principal exemplo são os jogos antigos da Frontier, que tinham posições reais em estrelas para cerca de 1.000 estrelas ou mais próximas do Sol (incluindo Sol e seus planetas e luas reais). Você apenas garante que eles estejam em locais que não são gerados processualmente e os adiciona como outra "camada".
Luaan 25/05
@IlmariKaronen sim, você está certo. Eu tenho distância máxima vista, e eu pensei que irá mesclar pontos de distância, seguindo a resposta de Ming-Tang
Anvaka

Respostas:

8

Isso se baseia na minha especulação e na pesquisa do código fonte da Celestia.

Celestia permite voar em torno de um planeta e diminuir o zoom para ver toda a galáxia. Pesquisei seu código-fonte e descobri que ele usava uma octree, uma estrutura para dividir recursivamente o espaço em 8 octantes.

O renderizador renderiza o ambiente atravessando a octree e não atravessa objetos distantes profundamente.

Celestia também mantém registro da magnitude absoluta de um octante, onde a magnitude absoluta de um octante é baseada na magnitude absoluta das estrelas dentro do octante. Se o octante estiver próximo, Celestia renderiza as estrelas individualmente, e se o octante estiver longe, Celestia renderiza o octante como uma estrela da magnitude do octante.

Além disso, pode haver uma hierarquia significativa anexada aos objetos. Por exemplo, se você estiver próximo (raio declarado no banco de dados) de uma estrela, seus planetas serão renderizados. Se um planeta estiver próximo o suficiente (um corte de pixels na tela), seu modelo 3D será desenhado.

Outros jogos espaciais que posso citar são Orbiter e Kerbal Space Program, que são de código fechado. Eu também olhei para o Frontier Galaxy, que gerou um mapa estelar de estrelas. Há um site analisando como o jogo funciona por sua desmontagem: http://www.jongware.com/galaxy1.html

Ming-Tang
fonte
12

Há várias peças neste quebra-cabeça, cada uma das quais fornecerá uma toca de exploração profunda e interessante. Alguns deles são:

  • Nível de detalhe - escolha automaticamente (ou "manualmente") modelos detalhados ou simplificados, ou mesmo sprites ou apenas pontos, ou para objetos à medida que estão mais distantes.
  • Seleção - escolhendo apenas desenhar o que é necessário. Pode ser o que está no campo de visão (seleção de frustum), o que não está oculto por trás de outras coisas (seleção de oclusão) ou outros métodos ad hoc. (A resposta de @Alan Wolfe descreve algumas das maneiras de organizar seus dados que ajudam a facilitar o descarte.)
  • Streaming - puxando dados do mundo do armazenamento para a memória, conforme necessário, se tudo não couber na memória de uma só vez
  • Sky box - objetos muito distantes podem ser pré-renderizados em uma esfera que está a "distância infinita" da câmera.

E seu próprio molho secreto será qual combinação dessas e de outras técnicas você usará e quando, com base em suas necessidades específicas de aplicação.

david van brink
fonte
2

Qualquer coisa hierárquica e / ou esparsa deve ajudá-lo aqui.

Há muito espaço vazio; portanto, não é necessário usar o armazenamento para representar o espaço vazio. Uma abordagem hierárquica típica seria algo como uma árvore de outubro que subdivide recursivamente o espaço em 8 cubos menores, e você pode armazenar objetos no menor cubo que eles possam ocupar completamente.

Um octree também é muito bom para você poder consultá-lo para obter uma lista de todos os objetos em um perfil de exibição, que permitirá obter uma lista apenas dos objetos que estão dentro do seu ângulo de visão e não estão muito distantes. Uma solução esparsa pode ser algo como uma grade esparsa, onde você pode solicitar informações sobre qualquer local x, y, z, mas você só precisa armazenar informações para células que não são espaços vazios.

Outras abordagens hierárquicas comuns usadas incluem árvores bsp (elas dividem espaço em 2 meios espaços recursivamente), bem como árvores kd que são semelhantes.

Pessoalmente, acho que um octree pode ser um bom começo para você, certificando-se de subdividir apenas o necessário, para não perder memória no espaço vazio. Além disso, você pode acabar desejando uma solução diferente para seus objetos estáticos e objetos dinâmicos.

Algumas soluções (como bsp) podem ser muito eficientes, mas levam muito tempo para serem construídas, portanto, geralmente não são uma boa opção para mover / alterar objetos.

Espero que ajude, deixe-me saber se você tiver alguma dúvida sobre os detalhes!

Alan Wolfe
fonte