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.
infinite universe
reduçã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.Respostas:
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
fonte
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:
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.
fonte
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!
fonte