for child in myNodePath.getChildren():
print child
Para obter mais informações e uma lista completa de funções NodePath consulte o referência da API.
No musical " A Chorus Line ", a cena mais conhecida é quando cerca de 50 devista linha de mulheres jovens acima da esquerda para a direita através do estágio, e todos eles kick- esquerdo chutar da direita em uníssono. Para implementar isto no Panda3D , você pode fazer isso :
for i in range(50):
dancer = Actor.Actor("chorus-line-dancer.egg", {"kick":"kick.egg"})
dancer.loop("kick")
dancer.setPos(i*5,0,0)
dancer.reparentTo(render)
Aqui está o gráfico da cena que acabamos de criar :
Isso funciona bem , mas é um pouco caro. Animando um modelo envolve uma série de per- vertex cálculos matriciais. Neste caso, estamos animando 50 cópias do modelo exato mesmo com 50 cópias da animação exatamente o mesmo. Isso é um monte de cálculo redundante. Parece que há necessário ter algum jeito de evitar o cálculo dos valores exatos mesmo 50 vezes. Não é a técnica é chamada instancing.
A idéia é a seguinte: em vez de criar 50 bailarinos independentes, criar apenas um dançarino , de modo que o motor só tem que atualizar sua animação uma vez. Porque o motor para torná-la 50 vezes, inserindo -a no grafo de cena em 50 locais diferentes. Aqui está como isso é feito:
dancer = Actor.Actor("chorus-line-dancer.egg", {"kick":"kick.egg"})
dancer.loop("kick")
dancer.setPos(0,0,0)
for i in range(50):
placeholder = render.attachNewNode("Dancer-Placeholder")
placeholder.setPos(i*5, 0, 0)
dancer.instanceTo(placeholder)
Aqui está um diagrama de gráfico de cena que acabamos de criar :
dancer = Actor.Actor("chorus-line-dancer.egg", {"kick":"kick.egg"})
dancer.loop("kick")
dancer.setPos(0,0,0)
chorusline = NodePath('chorusline')
for i in range(50):
placeholder = chorusline.attachNewNode("Dancer-Placeholder")
placeholder.setPos(i*5,0,0)
dancer.instanceTo(placeholder)
Este é exatamente o mesmo código , como antes , exceto que em vez de colocar os 50 espaços reservados abaixo render, Eu colocá-los debaixo de um nó fictício chamado chorusline. Assim, a minha linha de dançarinos não faz parte do grafo de cena ainda. Agora, eu posso fazer isso:
for i in range(3):
placeholder = render.attachNewNode("Line-Placeholder")
placeholder.setPos(0,i*10,0)
chorusline.instanceTo(placeholder)
Não é uma árvore de mais nada , é um grafo acíclico dirigido . Mas o processador ainda atravessa o gráfico usando um algoritmo recursivo árvore travessia. Como resultado, ela acaba atravessando o dançarino nó 50 vezes. Aqui está um diagrama do percurso em profundidade que o processador leva através do gráfico . Note que este é não um diagrama de gráfico de cena - é um diagrama do processador de caminho através do gráfico de cena:
Em outras palavras, o representante de visitas do ator dançarino 50 vezes. Ele nem percebe que está visitando o mesmo ator de 50 vezes, ao invés de visitar 50 atores diferentes. É tudo o mesmo para o processador.
Há espaço reservado para 50 nós , alinhados no palco . Estes são chamados nós dummy. Eles não contêm qualquer polígonos , eles são pequenos objetos minúsculos utilizado principalmente para a organização . Neste caso , estou usando cada espaço reservado como uma plataforma em que um bailarino pode estar.
A posição do bailarino é ( 0,0,0) . Mas isso é em relação à posição dos pais. Quando o processador está atravessando um espaço reservado na subárvore , a posição do bailarino é tratada como parente de um espaço reservado . Quando o processador está atravessando espaço reservado do 2 sub , a posição do bailarino é tratado como espaço reservado em relação à 2. Assim, embora a posição da bailarina é fixado em (0,0,0) , ela aparece em vários locais da cena ( no topo de cada espaço reservado ).
Desta forma, é possível processar um modelo de múltiplas vezes sem armazenar e animando-o várias vezes.
Advanced Instancing
Agora, vamos dar um passo adiante : dancer = Actor.Actor("chorus-line-dancer.egg", {"kick":"kick.egg"})
dancer.loop("kick")
dancer.setPos(0,0,0)
chorusline = NodePath('chorusline')
Compartilhe com seus amigos: |