O que deve estar contido em um gráfico de cena do jogo?


10

Você poderia me ajudar a esclarecer, por favor, o que exatamente deveria estar contido em um gráfico de cena do jogo? Veja a lista a seguir, por favor:

  • Atores de jogos? (obviamente sim, todos os objetos que mudam de estado devem ser o principal ponto de partida do gráfico de cenas)
  • Objetos estáticos simples de jogos? (Refiro-me a objetos no fundo que não são animados nem colidem)
  • Gatilhos de jogo ?
  • Luzes do jogo ?
  • Câmeras de jogos ?
  • Balas de armas ?
  • Explosões de jogos e efeitos especiais?

Os tipos de objetos considerados acima. Agora, para a cobertura do gráfico da cena:

  • Um gráfico de cena deve conter todo o mapa do nível do jogo desde o início do nível ou deve conter apenas a parte visível do mapa? Se o segundo for verdadeiro, isso significaria que o gráfico da cena seria atualizado continuamente, adicionando / removendo objetos do jogo, conforme o jogador se move. No entanto, conter apenas os visíveis do mapa obviamente seria muito mais rápido de percorrer e atualizar.

@ Josh: obrigado por editar e corrigir minha pergunta.
Bunkai.Satori

Respostas:


4

Acho que ler um pouco o que outras tecnologias de gráficos de cena estão fazendo traria muitos benefícios para você.

Histórico
Por exemplo, veja a descrição do Ogre3D. É um mecanismo gráfico baseado em gráfico de cena que é de código aberto. Eu sugeriria examinar os tutoriais e ver como os nós de cena estão sendo usados ​​(Nota: não estou dizendo para você aprender a usar o Ogre, mas quais recursos estão presentes nos nós de cenas e nos gerenciadores de cenas do Ogre)

Documentação do SceneNode:
http://www.ogre3d.org/docs/api/1.9/class_ogre_1_1_scene_node.html

Documentação do SceneManager: http://www.ogre3d.org/docs/api/1.9/class_ogre_1_1_scene_manager.html

Outra coisa que vale a pena olhar é o seguinte link:
http://sgl.sourceforge.net/#features

É uma solução de gráfico de cena baseada em OpenGL e a página de recursos mostra todos os nós que ela pode conter.

Seus nós sugeridos
Sou da opinião de que um gráfico de cena deve ser o mais abstrato possível da lógica do jogo, para que você não tenha problemas de dependência. Para cada um dos seus pontos de marcador, eu diria o seguinte:

Atores de jogos,
eu provavelmente diria que não. Semelhante ao Ogre, eu teria uma classe Entity base (que conteria a lógica específica do objeto) e um SceneNode base com um ponteiro de membro Entity para obter as informações apropriadas para renderizar o objeto (Posição, Orientação etc.)

EDIT: Não estou dizendo para não incluir os atores do jogo no gráfico da cena aqui (caso contrário, nada apareceria: P) Estou dizendo para ter um nó de cena com uma referência à classe lógica dos atores do jogo, então você ainda ficou solto o acoplamento da renderização e atualização dos objetos do jogo.

Objetos estáticos simples de jogo
Sim

Gatilhos de jogo?
Não, isso me parece uma lógica específica do jogo.

Luzes do jogo?
sim

Câmeras de jogos?
sim

Balas de armas?
Não estou completamente certo sobre este, mas provavelmente diria que sim, mas você provavelmente desejaria todos os marcadores como filhos em um nó de cena pai "BulletCollection", apenas para que você possa armazenar em cache essa posição e não precisará atravessar o muito gráfico para remover e adicionar marcadores para renderizar.

Explosões de jogos e efeitos especiais?
Não tenho certeza, vou deixar alguém responder isso.

Cobertura do gráfico de cena
Se você possui um nível relativamente pequeno, deve poder armazenar todo o nível em um gráfico de cena e otimizar a visibilidade usando uma Octree (geralmente para ambientes externos) ou uma árvore BSP (geralmente para ambientes internos).

Se você tem um nível muito maior e não deseja carregar nenhum nível, é aqui que o streaming entra em cena, mas isso é outro problema. Eu começaria com um nível pequeno e veria gradualmente o tamanho que você pode aumentar sem afetar adversamente o desempenho.

Conclusão
Para mim, um gráfico de cena é para a parte Render de um loop do jogo. Você não deve acoplar sua renderização e suas atualizações lógicas muito próximas, caso contrário, ocorrerá problemas de dependência irritantes.


+1 - Obrigado pela resposta detalhada e valiosa. Meu conhecimento sobre o SceneGraphs vem de um livro Game Coding Complete ( amazon.com/Game-Coding-Complete-Third-McShaffry/dp/1584506806/… ). Seus links são úteis, especialmente a classe SceneNode do Ogre. Referindo-se à sua Conclusão , você vê um Gráfico de Cena como uma ótima maneira de atualizar Transformações de objetos vinculados no jogo? As respostas de ambos e Josh são excelentes. Eu acho que este tem mais informações, então eu estou marcando este como a Resposta Aceita .
Bunkai.Satori

@Bunkai Se você acha que seus objetos de jogo têm um método Update () onde eles atualizam seus vetores para sua posição, orientação, etc, tudo o que seu nó de cena precisa fazer é renderizar uma malha e transformá-la usando um GetPosition () e GetOrientation () e renderize-o na tela. Isso realmente separa a lógica dos atores do código de renderização, pelo qual você realmente deve se esforçar.
Ray Dey

9

Minha inclinação é sugerir colocar menos coisas em um gráfico de cena. Veja em particular este artigo de Tom Forsyth: " Gráficos de cena - apenas diga não ".

O ponto crucial do artigo de Forsyth é que você não deve tentar colocar um monte de coisas não relacionadas em uma grande estrutura de dados mestre. Isso é muito parecido com as idéias que eu toquei nesta resposta no que diz respeito a derivar tudo no jogo GameObjecte depois colocar tudo em uma grande lista heterogênea (ou seja, isso é ruim).

Relativamente poucos objetos no mundo realmente exibem uma forte relação pai-filho, conforme convém a uma estrutura de árvore. O exemplo canônico de uma xícara de café em uma mesa é geralmente usado aqui - com certeza, você pode considerar que ela é uma "criança" da mesa ... pelo menos até que seja derrubada. Então ainda é realmente um filho da mesa? Isso significa que sua 'árvore' pode acabar bem superficial e meio que se degenerará em uma lista.

Então, eu sugiro que você use várias estruturas de dados para várias coisas, o que faz mais sentido para essas coisas. A geometria estática e as luzes, por exemplo, parecem uma coisa razoável para inserir em um gráfico de cena. Mesmo se os objetos representados não tiverem relações pai-filho naturais, o fato de serem estáticos significa que você pode fornecer a eles relacionamentos pai-filho estruturais sabendo que eles nunca mudam.

Atores de jogos ... Não tenho tanta certeza. Qualquer coisa que tende a se mover, de fato, significa que você geralmente precisa mantê-los perto da raiz do gráfico ou re-parentê-los constantemente (o que é uma tarefa árdua e não é super eficiente).

Marcadores, gatilhos, efeitos especiais e outros objetos transitórios que eu armazenaria em outro lugar. Nada que renderize ou tenha uma representação visual (um gatilho geralmente é um volume delimitador invisível, uma bala geralmente é apenas um raio) deve estar em um gráfico de renderização. Você deve se esforçar para separar as camadas de renderização e lógica .

Pelo que vale a pena, nunca usei um gráfico de cena em forma de árvore em nenhum dos renderizadores que construí para uso não acadêmico (obviamente, eu já criei gráficos de cena em forma de árvore antes, e foi assim que cheguei à conclusão de que agora estou tentando fazer com que você concorde).

Uso métodos de particionamento espacial apropriados ao estilo de jogo (quad-tree, octree, BSP, etc.) para agrupar / selecionar as entidades lógicas no jogo que devem ser (a) processadas nesse quadro e (b) processadas esse quadro. Acabo alimentando o conjunto de objetos da lista (b) em um sistema que mapeia objetos lógicos para renderizar descrições e classifica essas descrições em buckets com base nas propriedades (por exemplo, qualquer coisa que use transparência será empurrada para o bucket por "coisas" isso deve ser processado de trás para frente). Então, eu renderizo todos os buckets em ordem e para cada bucket processamos todas as descrições em ordem. Acho que você pode chamar isso de "árvore", mas não exibe o estado típico / transformar métodos de propagação que os gráficos tradicionais de cenas orientadas para árvores fazem.


+1 para uma excelente resposta. Eu li o artigo recomendado. Basicamente, quero usar o Scene Graph para atualizar as posições dos objetos vinculados (exemplo: um conjunto de soldados está em um navio. À medida que o navio se move, os soldados se movem com ele e as armas nas mãos também se movem). Portanto, pretendo ter a classe de interface: CGameObject, e todos os objetos a serem colocados no Scene Graph devem fazer parte. Muito obrigado por seus conselhos.
Bunkai.Satori
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.