Preparação Geral Começando com o seu ambiente de desenvolvimento


Panda3D Manual: O gráfico de cena



Baixar 2.38 Mb.
Página14/20
Encontro30.10.2016
Tamanho2.38 Mb.
1   ...   10   11   12   13   14   15   16   17   ...   20

Panda3D Manual: O gráfico de cena

Parte superior do formulário

   Prev

Topo

Próximo   

Pitão/C + +

  

Parte inferior do formulário

O gráfico de cena: uma árvore de nós

Muitos motores 3D simples manter uma lista de modelos 3D para renderizar cada frame. Nestes motores simples , deve-se atribuir um modelo 3D (ou carregá-lo a partir do disco ), e depois inseri-lo na lista de modelos para processar. O modelo não é " visível "para o processador até que ele é inserido na lista.

Panda3D é um pouco mais sofisticado. Ao invés de manter uma lista de objetos para renderizar, ele mantém uma árvore de objetos para renderizar. Um objeto não é visível para o processador até que seja inserido na árvore.

A árvore é composta de objetos da classe PandaNode. Esta é realmente uma superclasse para uma série de outras classes : ModelNode, GeomNode, LightNodeE assim por diante . Ao longo deste manual , é comum para nós para se referir a objetos destas classes, simplesmente nós. A raiz da árvore é um nó chamado render. (Observação: pode haver raízes adicionais para propósitos especiais , como render2d para objetos 2D )

Panda3D árvore de " coisas a fazer " é nomeado o grafo de cena.

O que você precisa saber sobre a cena hierárquica Gráfico

Aqui estão as coisas mais importantes que você precisa saber sobre a hierarquização do grafo de cena :



  1. Você controla onde os objetos vão na árvore. Quando você insere um objeto na árvore , você pode especificar onde inseri-lo . Você pode mover os ramos da árvore ao redor. Você pode fazer a árvore tão profundo ou tão superficial como você gosta.

  2. Posições dos objetos são especificadas em relação a seu pai na árvore. Por exemplo, se você tiver um modelo 3D de um chapéu, você pode querer especificar que ele sempre fica acima de cinco unidades de um modelo 3D da cabeça de uma determinada pessoa é . Insira o chapéu como um filho da cabeça, e definir a posição do chapéu ( 0,0,5 ).

  3. Quando os modelos estão organizados em uma árvore, qualquer processamento atributos você atribui a um nó propagar para seus filhos. Por exemplo, se você especificar que um dado nó deve ser processado com nevoeiro profundidade , em seguida, seus filhos também serão prestados com nevoeiro profundidade, a menos que você explicitamente substituir a nível infantil.

  4. caixas Panda3D gera delimitador para cada nó na árvore. A hierarquia organizacional bom tronco pode acelerar e abate de oclusão. Se a caixa delimitadora de um ramo inteiro está fora do tronco, não há necessidade de examinar as crianças.

Iniciantes geralmente escolhem para fazer sua árvore totalmente plana - tudo é inserido imediatamente abaixo da raiz. Este é realmente um projeto inicial muito boa . Eventualmente, você vai encontrar uma razão para querer adicionar um pouco mais de profundidade à hierarquia. Mas não é sábio a se complicar até que você tenha uma razão clara, específica para o fazer.

NodePaths

uma classe auxiliar chamada NodePath que é muito pequeno objeto que contém um ponteiro para um nó , além de algumas informações administrativas. Por enquanto, você pode ignorar as informações administrativas , que serão explicados em um seção posterior do manual. É a intenção dos designers panda que você deve pensar em um NodePath como um identificador para um nó. Qualquer função que cria um nó retorna uma NodePath que se refere o nó recém-criado.

A NodePath não é exatamente um ponteiro para um nó , é uma "alça "para um nó. Conceitualmente, isso é quase uma distinção sem diferença . No entanto, há determinadas funções API que esperam que você passe em um NodePath , e há outras funções API que esperam que você passe em um ponteiro de nó. Devido a isso, embora haja pouca diferença conceptual entre eles , você ainda precisa saber que ambas existem .

Você pode converter um NodePath em um " ponteiro "regular a qualquer momento chamando nodePath.node (). No entanto, não há nenhuma maneira inequívoca para converter de volta. Isso é importante : às vezes você necessidade um NodePath , às vezes você necessidade um ponteiro de nó. Devido a isso , é recomendável que você armazene NodePaths , não ponteiros nó. Quando você passar parâmetros , você provavelmente deve passar NodePaths , não ponteiros nó. O receptor pode sempre converter o NodePath para um ponteiro de nó que ele precisa .



NodePath métodos e Node- Métodos

Existem muitos métodos que você pode invocar em nodepaths , que são apropriadas para nós de qualquer tipo. Os tipos de nó especializados, como LODNodes e câmeras (por exemplo ), fornecem métodos adicionais que estão disponíveis apenas para nós desse tipo , que você deve chamar no próprio nó . Aqui estão alguns exemplos variados :



Lembre-se sempre : quando você chamar um método de NodePath, Você está realmente realizando uma operação no nó para o qual ele aponta.

No exemplo acima , que chamamos de nó métodos convertendo primeiro a nodepath em um nó, e então imediatamente chamar o método de nó . Este é o estilo recomendado.

A cena padrão de gráficos

Por padrão , há duas cenas diferentes gráficos criados automaticamente quando você inicia o Panda3D . Estes gráficos são referidos por seus nós principais : render e render2d.

Você pode usar render mais frequentemente , este é o top da cena comum 3-D. Para colocar um objeto no mundo, você terá que se tornar pai (ou a algum nó que está em volta parented para processar ).

Você usará render2d para processar elementos 2-D GUI, como texto ou botões que você deseja exibir na tela , por exemplo, exibir um heads-up. Qualquer coisa parented para render2d será processado no topo da cena 3-D, como se fosse pintado no vidro do ecrã.

O sistema de coordenadas render2d está configurado para coincidir com as entradas de mouse: o canto inferior esquerdo da tela é ( -1, 0, -1) e no canto superior direito é (1 , 0, 1). Como este é um sistema de coordenadas quadrados , mas a tela é geralmente não-quadrados , objetos parented diretamente render2d pode parecer achatada. Por esta razão, Panda3D também define uma criança de render2d , chamado aspect2d, Que tem uma escala aplicada a ele para corrigir a proporção não quadrada de render2d . Na maioria das vezes , você terá elementos pai GUI para aspect2d vez render2d .

Especificamente, o sistema de coordenadas aspect2d por padrão é dimensionada de tal forma que x varia ao longo ratio [,] ratio e intervalos y sobre [-1,1 ], em que proporção é screen_size_x / screen_size_y (no caso normal de uma janela mais larga do que é alto ).

A partir de Panda3D versão 1.7.0 , há uma outra criança de render2d , chamado pixel2d. Esta é dimensionada de tal forma que uma unidade Panda representa um pixel na janela. A origem , (0, 0, 0) está no canto upperleft da janela. O canto lowerright representa (1, 0. -1). Como Panda3D usa um Z -Up Right sistema de coordenadas , a coordenada Y na janela será realmente invertido coordenada Z em Panda. Este nó é especialmente útil quando você quer fazer pixel- perfeito posicionamento e dimensionamento.

Finalmente, você pode ver referências a um outro nó de nível superior chamado oculto. Isto é simplesmente um nó comum, que não tem propriedades de renderização criado para ele, assim que as coisas escondidas parented para não ser processado. Panda3D antigo código necessário para usar escondido para remover um nó do grafo de cena render. No entanto, isso não é mais necessário, e seu uso não é recomendado para novos programas , a melhor maneira de remover um nó de render é chamar nodePath.detachNode ().

modelos de carga

Você pode carregar até um modelo com um caminho de arquivo, no Panda Sintaxe Filename, Ao ovo do modelo ou arquivo bam . Em muitos exemplos , a extensão do arquivo é omitido , neste caso , a Panda irá procurar um arquivo com um ovo. ou extensão. bam .



A primeira vez que você chamar loadModel () para um determinado modelo , esse modelo é lido e guardado em uma tabela em memória, em cada chamada posterior , o modelo é simplesmente copiado a partir da tabela , ao invés de ler o arquivo.

A chamada acima é adequado para carregar modelos estáticos ; de modelos de animação , consulte Carregando Atores e Animações.

nós Reparenting e modelos



Uma das manipulações gráfico mais fundamental cena está mudando pai de um nó . Você precisa fazer isso pelo menos uma vez depois que você carregar um modelo, para colocá-lo sob render para ver:

E para removê-lo novamente:

myModel .detachNode()

Como você se tornar mais confortáveis com as operações de grafo de cena , você pode encontrar a si mesmo tendo mais vantagens de um grafo de cena profundamente aninhadas , e você pode começar a mãe dos seus modelos para os outros nós do que apenas prestam. Às vezes é conveniente criar um nó vazio para esse efeito , por exemplo, o grupo de vários modelos juntos:





Uma vez que um nó herda suas informações sobre a posição de seu nó pai , quando você reparent um nó no grafo de cena que você pode inadvertidamente alterar a sua posição no mundo. Se você precisa evitar isso, você pode usar uma variante especial sobre reparentTo ():

O prefixo " wrt significa " em relação a ". Este método funciona como especial reparentt(o) , exceto que ele recalcula automaticamente o transformará em local myModel para compensar a mudança de transformar sob o novo pai , de modo que o nó acaba na mesma posição em relação ao mundo.

Note que o cálculo necessário para executar wrtReparentTo () é uma computação de ponto flutuante de matriz e, portanto, inerentemente imprecisas. Isto significa que se você usar wrtReparentTo () repetidamente , milhares de vezes no mesmo nó , pode , eventualmente, acumular bastante imprecisões numéricas para introduzir uma pequena escala sobre o objeto (por exemplo, uma escala de 1 , 1, 0,99999 ), se deixou desmarcada , essa escala pode eventualmente tornar-se visível.

Iniciantes tendem a overuse esse método , você não deve usar wrtReparentTo () a menos que haja um motivo real para usar.



Resumo

Esta página lista algumas das alterações mais comuns que você pode fazer um nó em 3D. Esta página é realmente apenas um resumo cheat sheet rápido : a documentação detalhada para essas operações chega no final do manual.

Alterar Estado Folha de fraude

Duas das alterações mais comuns são a posição e orientação.

myNodePath .setPos(X , Y , Z)
myNodePath .setHpr(Yaw , Pitch , Roll)

Por padrão, no Panda3D , o eixo X aponta para a direita, o eixo Y para a frente , e Z é para cima. rotação de um objeto é geralmente descrito utilizando ângulos de Euler chamada rubrica , Pitch e Roll ( às vezes chamado de Yaw , Pitch , Roll e em outros pacotes ) - essas rotações especificar o ângulo em graus. (Se você está mais confortável usando quaternions , o setQuat () método pode ser usado para especificar a rotação de um quaternion .)

Você pode alterar o tamanho de um objeto , seja de maneira uniforme, ou com um valor diferente de x , y, e z.

myNodePath.setScale(S)

Às vezes é conveniente ajustar um único componente individualmente:

myNodePath .setX(X)


myNodePath .setY(Y)
myNodePath .Setz(Z)
myNodePath .seth(H)
myNodePath .setP(P)
myNodePath .SETR(R)
myNodePath .setSx(SX)
myNodePath .setSy(SY)
myNodePath .setSz(SZ)

Ou tudo ao mesmo tempo:

myNodePath .setPosHprScale(X , Y , Z , H, P , R, SX, SY, SZ)

Você também pode consultar as informações atuais para transformar qualquer um dos acima:

myNodePath .getPos()
myNodePath .getx()
myNodePath .gety()
myNodePath .getz()

Além disso, usando as funções setTag () e getTag () você pode armazenar suas próprias informações em pares valor de chave. Por exemplo:

myNodePath.setTag("Key", "value")

Você também pode armazenar objetos Python como marcas usando o setPythonTag função com os mesmos argumentos .

Como um recurso mais avançado , você também pode definir ou consulta a posição ( ou qualquer uma das propriedades acima de transformar a ) de um NodePath particular no que diz respeito a outro. Para fazer isso , especifique o NodePath parente como o primeiro parâmetro :

myNodePath.setPos(otherNodePath, X, Y, Z)


myNodePath.getPos(otherNodePath)

Colocar um NodePath como o primeiro parâmetro para transformar qualquer um dos getters setters ou faz uma operação relativa. O quadro acima setPos () meios para definir myNodePath para a posição ( X , Y , Z) , relativo ao otherNodePath - isto é , a posição myNodePath seria se fosse uma criança de otherNodePath e sua posição foi definida para (X , Y, Z). O getPos () chamada retorna a posição myNodePath teria se fosse uma criança de otherNodePath .

Também é importante notar que você pode usar o NodePath no seu próprio define relativo e obtém. Isto talvez útil em situações em que você está preocupado com as distâncias. Por exemplo:

# Move myNodePath 3 unidades para a frente no x
myNodePath .setPos(myNodePath , 3, 0, 0)

Estes conjuntos relativos e se são um recurso muito poderoso do gráfico Panda cena, mas eles também podem ser confusas , não se preocupe se não faz sentido agora.

O lookAt () método de rotação de um modelo para enfrentar um outro objeto , ou seja, ele gira o primeiro objeto de modo que seu eixo + Y aponta para o segundo objeto. Note-se que um determinado modelo, poderia ou não poderia ter sido gerada com o eixo Y + frente , e isso não faz necessariamente um modelo de " olhar "a determinado objeto.

myNodePath .lookAt(otherObject)



As mudanças de cor são outra alteração comum. Os valores de cor são números de ponto flutuante 0-1 , sendo 0 preto, sendo um branco.

Se os modelos têm texturas, eles podem não ser distinguíveis ou mesmo visível em configurações de determinada cor. Definindo a cor branca pode restaurar a visibilidade da textura , mas é melhor do que simplesmente limpar as definições de cores atuais .

myNodePath.clearColor()

Nota: o quarto componente da cor é alfa. Isso geralmente é usado para indicar transparência, e é geralmente de 1,0 a indicar o objeto não é transparente. Se você definir o alfa para um valor entre 0 e 1 , pode desaparecer o objeto invisível. No entanto, para que o valor alfa para ser respeitado , primeiro você deve permitir a transparência :

myNodePath .setTransparency(TransparencyAttrib .MAlpha)

O parâmetro para setTransparency () é normalmente TransparencyAttrib.MAlpha, Que é a transparência normal. Você também pode explicitamente vez fora com transparência TransparencyAttrib.MNone. (Modos de transparência Outros são possíveis, mas que é um tópico mais avançado. Alguns velhos código pode passar apenas 0 ou 1 para este parâmetro, mas é melhor para o nome do modo.) Se você não permitir explicitamente a transparência em primeiro lugar, o alfa componente de cor pode ser ignorado. Certifique-se de não permitir a transparência desnecessariamente, uma vez que não permitem um modo de tornar mais caro.

Definindo a cor de um objeto substitui completamente qualquer cor nos vértices . No entanto, se você tiver criado um modelo com a cor por vértice , talvez você prefira para modular a cor do objeto sem perder a cor por vértice. Para isso há a setColorScale () variante, que múltiplos valores de cor indicada pela cor existente do objeto :

myNodePath.setColorScale(R, G, B, A)

Um uso de setColorScale () é aplicá-la no topo do gráfico de cena ( render , por exemplo) para escurecer toda a cena de maneira uniforme, por exemplo, para aplicar um efeito de fade- to- negro.

Desde alfa é tão importante, há também um método para dimensioná-lo sem afetar os componentes de cor diferente :

myNodePath.setAlphaScale(SA)

Para impedir temporariamente a um objeto que está sendo elaborado em todas as câmeras , use hide () e show ():

myNodePath.hide()
myNodePath.show()

Se você deseja ocultar um objeto para uma câmera, mas não em outro, você pode usar o hide () e show () comandos em conjunto com o camera.setCameraMask () função:

camera1.node().setCameraMask(BitMask32.bit(0))
camera2.node().setCameraMask(BitMask32.bit(1))
myNodePath.hide(BitMask32.bit(0))
myNodePath.show(BitMask32.bit(1))
# Now myNodePath will only be shown on camera2...

Por favor note que usar hide / show sem um argumento vai bagunçar qualquer esconde / mostra com o argumento (show ( pouco ) não vai desfazer um ()...) esconder Para ocultar um objeto de todas as câmeras , em vez usar nodepath.hide ( BitMask32.allOn ()). Para definir a máscara da câmera para o uso base.cam padrão da câmera , não base.camera , como base.camera não é uma câmera real , mas um nó fictício para manter câmeras. Por favor, consulte a seção da câmera para obter informações sobre como configurar múltiplas câmeras.


Qualquer objeto que é pai para o objeto que é escondido também serão escondidos.

Se você tem dificuldade para colocar , a escala ou rodar os nós que você pode usar o (lugar) função para abrir uma pequena gráfica , que irá ajudá-lo . Você precisa ter instalado Tkinter para utilizá-lo.

myNodePath.place()


...

Cada modelo , quando carregado, torna-se um ModelNode no grafo de cena. Sob o ModelNode são um ou mais GeomNodes contendo os polígonos reais. Se você deseja manipular um pedaço de um modelo , por exemplo, se você quiser mudar a textura de apenas parte de um modelo , você precisa de um ponteiro para a geomnode relevantes.

Para obter este tipo de ponteiro , você deve primeiro assegurar que a geometria é relevante em um GeomNode dos seus próprios (e não se fundiram com toda a geometria do outro). Em outras palavras , você deve garantir que os mecanismos de otimização de panda não causam a geometria a ser mesclado com a geometria do resto do modelo. Embora normalmente otimização isso é uma coisa boa, se você deseja alterar texturas em uma parte específica do modelo ( por exemplo, face a apenas um personagem ), você terá a geometria a ser separado.

Há duas maneiras diferentes que você deve fazer isso , de acordo com o tipo de modelo que é.

Animado (animação esqueleto) modelos

Se o seu modelo é animado através da animação quadro-chave em um pacote como 3DSMax ou Maya - que é , o tipo de modelo que você espera para carregar na via Ator interface - em seguida, Panda será agressiva em combinar todas as geometrias em como nós o mínimo possível . Para marcar a geometria especial de ser mantidos separados , você deve usar o ovo optchar programa.

O nome " optchar "é uma abreviação para " otimizar " caráter, desde que o programa de ovo optchar é projetado para otimizar um personagem animado para o desempenho de tempo de execução , eliminando as articulações não utilizados e desnecessários. No entanto , além dessa otimização , mas também lhe permite rotular uma seção de um modelo para manipulação posterior. Depois de ter marcado um pedaço de geometria, de otimização de mecanismos de Panda não dobrá-lo para o resto do modelo.

O primeiro passo é anotar o nome do objeto em seu programa de modelagem . Por exemplo, suponha que você queira controlar a textura da cabeça de uma modelo, e suponho que (hipoteticamente) a cabeça é rotulado de " Sphere01 "em seu programa de modelagem . Use ovos optchar dizer panda que " Sphere01 "merece ser mantidos separados e rotulados :

egg-optchar -d outputDir -flag Sphere01=theHead modelFile.egg anim1.egg anim2.egg

Observe que você deve sempre fornecer o arquivo de modelo (s) e todos os seus arquivos de animação optchar ovos ao mesmo tempo . Trata-se de que ele possa examinar todas as articulações e determinar quais as articulações são realmente animado , e ele pode remover as articulações , operando em todos os arquivos de uma vez. A produção de ovos optchar é escrito no diretório nomeado pelo "-d "parâmetro.

A bandeira -switch "vai garantir que panda não reorganizar a geometria para o polyset nomeado , dobrando-o no modelo como um todo. Ele também atribui o polyset um nome significativo. Depois de ter marcado a parte relevante da geometria, você pode obter um ponteiro para ele usando o encontrar método:

myModelsHead = myModel.find("**/theHead")

Com este nodepath , você pode manipular a cabeça separada do resto do modelo. Por exemplo, você pode mover a peça com setPosOu alterar a sua textura, usando SetTexture, Ou para essa matéria, qualquer coisa que você faria para qualquer outro nó cena gráfico.

ambiente ( Unanimated ) modelos

Outros tipos de modelos , aqueles que não contêm nenhum esqueleto ou animações, não são otimizados tão agressivamente pelo gestor de Panda, no pressuposto de que a hierarquia do modelo foi estruturado de maneira que é intencional, para maximizar o abate (ver Dicas de Pipeline). Assim, apenas certos nós são combinados com os outros, então é bem provável que um objeto que você modelado como um nó separado em seu pacote de modelagem ainda estará disponível sob o mesmo nome quando você carregá-lo no Panda. Mas Panda não prometer que nunca entrará em colapso juntos nós que ele acha que precisam ser combinadas para fins de otimização , a menos que você diga não a ele.

No caso de um modelo inanimado , a maneira de proteger um determinado nó é inserir o bandeira para o arquivo de ovo dentro do grupo especial . A maneira de fazer isso depende do seu pacote de modelagem (e esta documentação ainda precisa ser escrito ).

Muitas vezes, é útil para obter um identificador para um determinado nó profundo no grafo de cena , em especial para obter uma sub - parte de um modelo que foi carregado a partir de um único arquivo. Há uma série de métodos dedicados a encontrar nós arraigados e retornando o NodePaths .

Primeiro, e mais útil , é o ls ( ) de comando:

myNodePath .ls()

Isso simplesmente uma lista de todos os filhos do NodePath indicado , juntamente com todos os seus filhos , e assim por diante até o subgrafo completo é impresso. Ele também relaciona as transformações e Render Atributos que estão em cada nó. Este é um comando especialmente útil para quando você está correndo de forma interativa com o Python , é uma boa maneira de verificar se o grafo de cena é o que você acha que deveria ser.

Os dois métodos find () e findAllMatches () retornará um NodePath e um NodePathCollection , respectivamente. Estes métodos exigem uma seqüência de caminho como um argumento. As buscas podem baseado no nome ou tipo. Na sua forma mais simples, esse caminho consiste em uma série de nomes de nó separadas por barras , como um caminho de diretório. Ao criar a seqüência de cada componente pode, opcionalmente, composto por um dos seguintes nomes especiais, em vez de um nome de nó .

*

Corresponde a exatamente um nó de qualquer nome

**

Coincide com qualquer seqüência de zero ou mais nós

+typename

Coincide com qualquer nó que é ou deriva do tipo de dado

- typename

Coincide com qualquer nó que é exatamente o tipo de dado

tag =

Coincide com qualquer nó que tem o tag indicaram

= valor de marca

Coincide com qualquer nó cuja marca corresponde ao valor indicado

Nome da Standard globbing caracteres , como *,? , e [ az] também são úteis. Além disso, o caractere @ @ especial antes de um nome de nó indica que este nó particular é um nó escondido . Normalmente, nós escondidos não são devolvidos. * @ @ , por extensão , qualquer nó escondido .

O argumento também pode ser seguido com as bandeiras de controle. Para usar um sinalizador de controle, adicionar um ponto e vírgula depois do argumento , seguido por pelo menos um dos sinalizadores especiais, sem espaços ou pontuação.



-h

Não retorne nós ocultos

h +

Retorno nós ocultos

-S

Não volte stashed nós a menos que explicitamente referenciado com @ @

+ s

Retorno stashed nós mesmo sem explícito @ caracteres

- i

O nome do nó comparações não são diferencia maiúsculas de minúsculas : o caso deve corresponder exatamente

+ i

O nome do nó comparações são case insensitive : caso não é importante. Isso afeta partidas contra o nome do nó só , tipo de nó e cordas marca são sempre maiúsculas e minúsculas

As bandeiras são padrão + h -s -i.

O find () método procura por um único nó que corresponde a seqüência determinado caminho . Se houver várias partidas, o método retorna a menor correspondência . Se não encontra correspondência, ele irá retornar um NodePath vazio. Por outro lado , findAllMatches () retornará todos NodePaths encontrado, menor primeiro.

myNodePath.find("
")
myNodePath.findAllMatches("
")

Alguns exemplos:

myNodePath.find("house/door")

Isto irá procurar um nó chamado " porta ", que é filho de um nó chamado " casa ", que é uma criança do caminho inicial.

myNodePath.find("**/red*")

Isto irá procurar por qualquer nó em qualquer parte da árvore ( a seguir o caminho de partida) com um nome que começa com "vermelho" . Mais documentação sobre os padrões de correspondência pode ser encontrada no NodePath página de referência API.

Além disso, existem também os métodos getParent () e getChildren (). getParent () retorna o NodePath do nó pai . getChildren () Retorna os filhos do nó atual como um NodePathCollection (que pode ser tratada como uma lista, em Panda3D versão 1.6.0 e acima).


Catálogo: 2010
2010 -> Informativo eletrônico 2010 maio 1ª ediçÃo com mais novidades
2010 -> Informativo eletrônico 2010 marçO 1ª ediçÃo com mais novidades
2010 -> Campus curitiba
2010 -> Universidade fumec faculdade de engenharia e arquitetura fea
2010 -> Cd e dvd sorriso maroto – sorriso 15 anos – ao vivo
2010 -> Sbpjor – Associação Brasileira de Pesquisadores em Jornalismo VIII encontro Nacional de Pesquisadores em Jornalismo
2010 -> Pibic/cnpq/ufcg-2010 características da variabilidade do vento no aeroporto internacional de joão pessoa: período 2003-2009
2010 -> Decreto 1171 fcc 2010 al-sp agente Legislativo de Serviços Técnicos e Administrativos Ética é o conjunto de regras e preceitos de ordem valorativa e moral de um indivíduo, de um grupo social ou de uma sociedade
2010 -> Gabinete Coordenador de Educação Artística/ dea pratica coral

Baixar 2.38 Mb.

Compartilhe com seus amigos:
1   ...   10   11   12   13   14   15   16   17   ...   20




©bemvin.org 2020
enviar mensagem

    Página principal
Prefeitura municipal
santa catarina
Universidade federal
prefeitura municipal
pregão presencial
universidade federal
outras providências
processo seletivo
catarina prefeitura
minas gerais
secretaria municipal
CÂmara municipal
ensino fundamental
ensino médio
concurso público
catarina município
Dispõe sobre
reunião ordinária
Serviço público
câmara municipal
público federal
Processo seletivo
processo licitatório
educaçÃo universidade
seletivo simplificado
Secretaria municipal
sessão ordinária
ensino superior
Relatório técnico
Universidade estadual
Conselho municipal
técnico científico
direitos humanos
científico período
espírito santo
pregão eletrônico
Curriculum vitae
Sequência didática
Quarta feira
prefeito municipal
distrito federal
conselho municipal
língua portuguesa
nossa senhora
educaçÃo secretaria
segunda feira
Pregão presencial
recursos humanos
Terça feira
educaçÃO ciência
agricultura familiar