Panda3D/Manual/Instancing: diferenças entre revisões

[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
Sem resumo de edição
Sem resumo de edição
Linha 56:
 
for i in range(3):
placeholder = render.attachNewNode("LineLinha-Placeholder")
placeholder.setPos(0,i*10,0)
choruslineinimigolinha.instanceTo(placeholder)
 
Aqui está o grafico de cena que eu acabei de criar:
Here is the scene graph I just created:
 
[[Ficheiro:Instancing4.jpg]]
 
ButMas whenquando theo rendererrender traversesder ittraverse usingnele ausando recursiveum algoritmo recursivo de tree-traversal algorithmem arvore, itele willvai seever 3 majorprincipais subtreessubarvores (rooted atenraizadas ano linelinha-placeholder), ande eachcada subtreesubarvore willvai containter 50 placeholders ande 50 dancersinimigos, for apara grando total ofde 150 apparentinimigos dancersaparentes.
 
Instancing: an Important Caveat
 
InstancingInstancionar saveseconomiza pandaum quitepouco ado bittempo ofda CPU timeao whenanimar animatingum themodelo modelno panda. ButMas thatele doesn'tnão changemuda theo factfato thatde theo rendererrender stillainda needsprecisar torenderizar render theo modelmodelo 150 timesvezes. IfSe theo dancerinimigo isé aum 1000modelo polygonde 1000 modelpoligonos, that'sisso stilldaria 150,000 polygonspoligonos.
 
Note que cada instancia tem sua propria caixxa de colisão, á cada uma é dada um occlusion-cull e um frustum-cull diferente.
 
O nodepath: um Pointer para o Node mais um único ID de instancia
Note that each instance has its own bounding box, each is occlusion-culled and frustum-culled separately.
The NodePath: a Pointer to a Node plus a Unique Instance ID
 
IfSe Ieu hadtivesse aum pointer topara theo chorus-linemodelo dancerde model,inimigo andda Ilinha triedde toinimigos, aske theeu questiontentasse perguntar "whereonde isesta theo dancer,inimigo", therenão wouldhaveria beuma noresposta well-definedbem answerdefinida. TheO dancerinimigo isnão noté inum one placelugar, sheele isesta inem 150 placeslugares. BecausePor ofcausa thisdisso, theo datatipo typede pointer tode nodedata doespara noto havenode anão methodtem thatum retrievesmetodo theque consiga o net transform.
 
Isso é muito incoveniente. Ser capaz de perguntar "onde esta localizado o objeto" é fundamental. Existem outras perguntas úteis que você não pode executar por causa do instancionamento. Por exemplo, você não pode conseguir o "Pai" do node. Você não pode determinar sua cor glocal, ou qualquer outro atributo global. Todas essa perguntas são mal definidas, porque um unico node pode ter muitas posições, cores e "pais". ainda, essas perguntas são essenciais. Então era necessario para os designers do panda3d inventarem alguma forma de executar essas perguntas, apesar do node poder ter varias localizações ao mesmo tempo.
This is very inconvenient. Being able to ask "where is this object located" is fundamental. There are other incredibly useful queries that you cannot perform because of instancing. For example, you cannot fetch the parent of a node. You cannot determine its global color, or any other global attribute. All of these queries are ill-defined, because a single node can have many positions, many colors, many parents. Yet these queries are essential. It was therefore necessary for the panda3d designers to come up with some way to perform these queries, even though a node can be in multiple locations at the same time.
 
TheA solutionsolução isé basedbaseada onna theseguinte following observationobservação: ifSe Ieu hadtenho aum pointer topara theo chorusmodelo line-dancerdo model,inimigo andda Ilinha alsode hadinimigos, aeu uniquetambem identifierteria thatum distinguishesidentificador oneunico ofque theo 150distingue instancesuma fromdas allinstancias thedas othersoutras 150, thenentao Ieu couldpoderia meaningfullyperguntar ask for thepelo net transform ofdaquela thatinstancia particular instance of thedo node.
 
EarlierAntes, itfoi wasnotado notedque that ao NodePath containscontem aum pointer topara aum node, plusalem somede administrativealgumas informationinformações administraticas. TheO purposeproposito ofdessa thatinformação administrativeadministrativa informationé isde tounicamente uniquelyidentificar identifyuma onedas of the instancesinstancias. ThereNão is noum methodmetodo Node::getNetTransform, but theremas istem aum methodmetodo NodePath::getNetTransform. NowAgora youvoce knowsabe whyporque.
 
Para entender como o Nodepath conseguiu o nome da instancia, pense sobre o que é necessario para identificar uma isntancia unica. Cada um dos 150 inimigos no grafico de cena correspondem a um unico caminho pelo grafico de cena. Para cada possivel caminho da raiz do imigo, existe uma instancia do inimigo na cena. Em outras palavrasm para identificar unicamente uma isntancia, voce precisa de uma lista dos nodes que começam na folha e vão até a raiz.
To understand how NodePath got its name, think about what is necessary to uniquely identify an instance. Each of the 150 dancers in the graph above corresponds to a single path through the scene graph. For every possible path from root to dancer, there exists one dancer-instance in the scene. In other words, to uniquely identify an instance, you need a list of nodes that starts at the leaf and goes up to the root.
 
TheA administrativeinformação informationadministrativa in ano nodepath isé auma listlista ofde nodes. YouVocê canpode fetchconseguir anyqualquer node inda the listlista, using theusando NodePath::;node(i) method. TheO first oneprimerio, node(0), isé theum node topara whichonde theo NodePath pointsaponta.