Panda3D/Manual/Manipulação da Scene Graph

Origem: Wikilivros, livros abertos por um mundo aberto.

As Scene Graph padrões[editar | editar código-fonte]

Por padrão, existem duas scene graphs criadas automaticamente quando você inicia o Panda3D. Os seus gráficos se referem ao seu nó superior: render e render2d.

Você usa render com mais frequência; Ele está no topo de um cenário 3D comum. Para de fato colocar um objeto no mundo, você precisará ligar ele ao render(ou ligar a algum nó que esteja ligado ao render).

Você vai usar render2d para elementos da interface gráfica, como textos ou botões, que você quer que apareça na tela. Qualquer coisa ligada ao render2d vai ser renderizado no topo do cenário 3D, como se ele estivesse pintado no vidro da tela.

O sistema de coordenadas do render2D é configurado para combinar com os do mouse: o canto inferior esquerdo da tela é (-1,0,-1) e o canto superior direito é (1,0,1). Já que é um sistema de coordenadas quadradas, os objetos diretamente ligados ao render2d podem parecer quadriculados. Por essa razão, o Panda3D também define um filho do render2D, chamado aspect2D, que tem uma escala aplicada a ele para corrigir o aspecto não-quadrado do render2d. Frequentemente, você vai ligar elementos da interface gráfica ao aspect2d em vez de ligar ao render2d.

Finalmente, você deve ver referências a um outro nó de level alto, chamado hidden. Este é simplesmente um nó comum que não tem propriedades de renderização configuradas, então aquelas coisas que estão ligadas ao hidden não serão renderizadas. Contudo, ele não é mais necessário, e não é recomendado para novos programas. a melhor forma de remover um nó do render é chamar:

   nodepath.detachNode()

Carregando modelos[editar | editar código-fonte]

Você pode carregar um modelo com o nome do caminho do arquivo para um modelo egg ou um arquivo bam. Em muitos exemplos, a extensão do nome do arquivo é omitida, neste caso, o Panda vai procurar por um arquivo com ambas as extensões .egg e .bam.

   meuNodePath = loader.loadModel('minha/pasta/para/modelos/meumodelo.egg')

Na primeira vez que você chama loadModel() para um modelo particular, este modelo é lido e salvo numa mesa na memória; na chamada subsequente, o modelo é simplesmente copiado da mesa, em vez de ler o arquivo.

A chamada acima é apropriada para modelos estáticos.

Ligando nós e modelos[editar | editar código-fonte]

Uma das manipulações fundamentais da scene graph é mudar a ligação de um nó. Você precisa fazer isso pelo menos uma vez antes de carregar o seu modelo, para que ele fique visível:

   meuModelo.reparentTo(render)

e para removê-lo:

   meuModelo.detachNode()

Para remover completamente um nodePath de uma scene graph e da memória chame removeNode, isso tem o efeito de esvaziar o nó e soltara memória ocupada pelo nó. Use-o somente quando você não tem mais nenhum uso para o nó:

   meuModelo.removeNode()

Conforme você vai ficando familiarizado com as operações da scene graph, você vai se ver tirando mais e mais proveito de uma scene graph profundamente aninhada, e você vai começar a conectar seus modelos a outros nós em vez de ligar apenas ao render. Algumas vezes é conveniente criar um nó vazio para esse propósito, por exemplo, para agrupar diversos modelos juntos:

   noFalso = render.attachNewNode("O nome do nó falso")
   meuModelo.reparentTo(noFalso)
   meuOutroModelo.reparentTo(noFalso)

Já que um nó herda a informação da sua posição do seu nó parente, quando você conecta um nó na scene graph, você inadvertidamente talvez mude sua posição no mundo. Se você precisa evitar isso, você pode usar uma variante especial do reparentTo():

   meuModelo.wrtReparentTo(novaConeccao)

O prefixo "wrt" significa "with respect to" ou "em respeito a". Este método especial funciona como reparentTo(), exceto por ele recomputar o transform local no meuModelo para compensar a mudança no tranform sob o novo pai, de modo que o nó acabe na mesma posição relativo ao mundo.