Panda3D/Manual/Actors multi-partes
É 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