Panda3D/Manual/Actors multi-partes

Origem: Wikilivros, livros abertos por um mundo aberto.

É possível criar um modelo de personagem com várias partes separadas (modelos separados). Se esse é o caso, então as peças devem conter osso que podem ser anexados uns aos outros. Por exemplo, se você tem um robô que consiste de um par de pernas e um torso, se você quiser "colar" elas na região do quadril, o modelo das pernas deve ter um osso chamado "quadril", e o modelo do torso deve ter também um osso chamado "quadril". você pode então anexar essas partes uma à outra:

   nodePath = Actor.Actor({
      'pernas':'Pernasrobo.egg',
      'torso':'Torsorobo1.egg',
    },{'legs':{'dance':'Pernasrobo-Dança.egg'},
       'torso':{'dance':'Torsorobo1-Dança.egg'}})
   nodePath.attach('torso','pernas','quadril')

Atores que multi-partes são meio complicados. Cada parte é carregada de um arquivo egg separado, e cada parte têm seu próprio conjunto de animações aplicadas a ela. Para cada animação que você quiser rodar, você precisará ter o arquivo egg correspondente para cada parte.

No construtor do Actor, você pode especificar a lista de arquivos do modelo com um dicionário do nome para o arquivo egg, como mostrado acima. A lista de arquivos de animação é mais complicado; é um dicionário de dicionários. O dicionário exterior mapeia o nome das partes para o dicionário de animação. Cada animação mapeia o nome da animação para o arquivo egg de animação para a a parte correspondente.

Aqui está outro exemplo:

   meuactor = Actor(

       # dicionário das partes
       {"cabeça":"char/robo/robo_cabeça", 
       "torso":"char/robo/robo_torso", 
       "pernas":"char/robo/robo_pernas"}, 

       # dicionario do dicionário de animações
       {"cabeça":{"andar":"char/robo/robo_cabeça-andar", 
                "correr":"char/robo/robo_cabeça-andar-correr"}, 
        "torso":{"andar":"char/robo/robo_torso-andar", 
                 "correr":"char/robo/robo_cabeça-andar-correr"}, 
        "pernas":{"andar":"char/robo/robo_pernas-andar", 
                "correr":"char/robo/robo_cabeça-andar-correr"} 
        })

Em adição as partes do actor multiparte precisam ser conectadas de uma forma compreensivel:

   meuactor.attach("cabeça", "torso", "junta-cabeça")
   meuactor.attach("torso", "pernas", "junta-quadril")

O chamado attach() noemia duas partes, e reparenta a parte nomeada pelo primeiro parâmetro na parte nomeada pelo segundo parâmetro, no node chamado pelo terceiro parâmetro, que deve ser uma junta exposta ( ou seja, uma junta na parte nomeada pelo segundo parâmetro). Você precisa já ter exposto a junta antes de efetuar essa chamada, tanto com a ferramenta de linha de comando egg-optchar, ou chamando actor.exposeJoint() durante o runtime.

Após chamar attach(), a parte "stacked" irá herdar a animação da junta anexada, através da relação do gráfico de cena.

Animação[editar | editar código-fonte]

Você pode animar as partes como animações normais, mas você precisa suprir o nome da parte, assim:

   meuactor.play('Nome da Animação', 'Nome da Parte')

Se você quer usar AnimControl, como explicado nessa sessão, você precisa suprir o nome da parte como um parâmetro secundário no getAnimControl():

   você pode ver que só é preciso chamar
   actor.getAnimControl('Nome da animação','Nome da parte')
   para ter acesso ao AnimControl(Controle de animação) daquela parte

   ac=actor.getAnimControl('Nome da animação','Nome da Parte')
   ac.isPlaying() retorna um booleano indicando se a animação está rodando ou não
   ac.getFrame() retorna o quadro atual da animação
   ac.getFrameRate() retorna a velocidade da animação em frames por segundo
   ac.getFullFframe() retorna o número em ponto flutuante do frame atual Nota: esse número continua contando e pode exceder o número total de frames 
   ac.getFullFrame() retorna o número do frame em numero inteiro Nota: esse número continua contando e pode exceder o número total de frame
   ac.getNextFrame() retorna o número do proximo frame no queue
   ac.getNumFrames() retorna o número total de frames
   ac.getPlayRate() #returns the playrate. explained further below retorna o a velocidade que os frames passarão
   ac.loop() roda a animação e loop
   ac.play() roda a animação
   ac.pose(frame) frame regula as poses
   ac.setPlayRate(rate) configura a velocidade da animação. explicado mais tarde
   ac.stop() para a animação