1 / 26

Igor Duarte (idal) Luciano Demétrio (ldsp) Thiago Alexandre (tan2) Thiago Ferreira (tfds)

Introdução à Multimídia. AULA PRÁTICA. Igor Duarte (idal) Luciano Demétrio (ldsp) Thiago Alexandre (tan2) Thiago Ferreira (tfds) Tiago Lemos (tlam) 16.01.08. Introdução[1]. A AGEIA PhysX é a primeira engine totalmente dedicada a simulação de fenômenos físicos;

anka
Download Presentation

Igor Duarte (idal) Luciano Demétrio (ldsp) Thiago Alexandre (tan2) Thiago Ferreira (tfds)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Introdução à Multimídia AULA PRÁTICA Igor Duarte (idal) Luciano Demétrio (ldsp) Thiago Alexandre (tan2) Thiago Ferreira (tfds) Tiago Lemos (tlam) 16.01.08

  2. Introdução[1] • A AGEIA PhysX é a primeira engine totalmente dedicada a simulação de fenômenos físicos; • Usa OpenGL para processar os gráficos; • O grande foco não apenas da engine, mas da própria empresa é a indústria de jogos eletrônicos; • Por enquanto o foco do desenvolvimento está em jogos para computadores, PlayStation3 e Xbox360; • A simulação de fenômenos físicos é um fator complicado dentro do projeto de jogos, PhysX torna esse procedimento mais simples e eficiente;

  3. Introdução[2] Unreal Tournament 2007 http://www.youtube.com/watch?v=rKk9FcUJqrU BackBreaker http://www.youtube.com/watch?v=bc4wfc3BGl0

  4. Instalação[1] • Para instalar o PhysX SDK é preciso ter uma conta registrada no site da AGEIA. Para fazer uma solicitação, clique na seção My Support da seguinte página (http://devsupport.ageia.com); • Sua conta será aprovada em poucos dias; • Já registrado e após efetuar login, clique em Online Support e depois em Download. • No lado esquerdo, escolha o SDK de sua preferência; • No painel principal, clique em PhysX SDK Core. Aceite o contrato para permitir o download; • Obs.: desabilite o gerenciador de downloads para concluir essa tarefa.

  5. Instalação[2] • Para rodar qualquer aplicação do Physx você precisará instalar também o AGEIA PhysX System Software que está disponível na seção Driver & Support do site da AGEIA (www.ageia.com); • Com os downloads feitos, instale primeiro o AGEIA Physx System Software e depois o PhysX SDK, pois este ficará dentro de uma pasta do System Software;

  6. Componentes • Mundo (World) - O SDK do Physx é implementado em C++ e internamente organizado como uma hierarquia de classes; • Cena (Scene) – Uma cena é uma simulação da interação dos corpos nela contidos, dos efeitos aplicados sobre os mesmos e da passagem do tempo; • Ator (Actor) – O principal objeto simulado no Physx, é criado para uma cena especifica; • Molde (Shape) – Usado para detectar e tratar colisões; • Junções (Joints)– São conexões entre corpos rígidos; • Material – definem as propriedades das superficies;

  7. PhysX SDK • O PhysX SDK contém vários documentos para orientar o desenvolvedor no aprendizado da ferramenta; • Para isso a pasta mais importante é a TrainingPrograms que contém um curso completo com diversas lições; • Há também a pasta Samples que oferece várias amostras simples do que pode ser feito com PhysX; • Caso você queira acessar diretamente alguns exemplos siga o caminho: Menu Start -> All Programs -> AGEIA -> AGEIA Physx Properties -> abra a aba Demonstração e dê um clique duplo sobre o icone cujo exemplo deseja visualizar.

  8. Acesso ao PhysX SDK[1] • Menu Start • Menu Start -> My Computer • Menu Start -> My Computer -> Local disk(C:) • Menu Iniciar -> Meu Computador -> Local disk(C:) -> Program files • Menu Start -> My Computer -> Local disk(C:) ->Program files -> AGEIA Technologies • Menu Start -> My Computer -> Local disk(C:) >Program files-> AGEIA Technologies -> SDK • Faça uma cópia da pasta v2.7.3 para o seu Desktop

  9. Acesso ao PhysX SDK[2] • Na pasta v2.7.3 acesse: • Training Programs • Training Programs -> Programs • Training Programs -> Programs -> Chapter1_Rigid_Bodies • Training Programs -> Programs -> Chapter1_Rigid_Bodies -> compiler • Training Programs -> Programs -> Chapter1_Rigid_Bodies -> compiler -> vc8win32 • Na pasta vc8win32 abra o arquivo Lesson101_Box_on_a_plane. Este arquivo contém as primeiras lições da biblioteca Physx e é ele que iremos alterar em seguida

  10. Exemplos

  11. Lição 1 – corpos rígidos[1] • Nessa primeira lição somos apresentados aos conceitos básicos que controlam todas as aplicações do PhysX; • Além disso é também exposto como criar atores e forças que agem sobre os mesmos;

  12. Lição 1 – corpos rígidos[2] • Para criar atores adicione as seguintes linhas de código • Na parte de atributos globais insira: // Actor globals NxActor* esfera = NULL; NxActor* capsula = NULL; • Após a parte de atributos globais insira os trechos abaixo para criar uma esfera: NxActor* CriarEsfera(){ NxActorDescatorDesc; NxBodyDesccorpoDesc; NxSphereShapeDescesferaDesc; esferaDesc.radius = 1.25;//raio da esfera atorDesc.shapes.pushBack(&esferaDesc); atorDesc.body = &corpoDesc; atorDesc.density = 3;//densidade da esfera atorDesc.globalPose.t = NxVec3(0,3,0);//posição inicial da esfera na cena returngScene->createActor(atorDesc); }

  13. Lição 1 – corpos rígidos[3] • Agora insira os trechos abaixo para criar uma capsula: NxActor* CriarCapsula () { NxActorDescatorDesc; NxBodyDesccorpoDesc; NxCapsuleShapeDesccapsulaDesc; capsulaDesc.height = 5;//altura da capsula capsulaDesc.radius = 0.25;//raio da capsula atorDesc.shapes.pushBack(&capsulaDesc); atorDesc.body = &corpoDesc; atorDesc.density = 12;//densidade da capsula atorDesc.globalPose.t = NxVec3(5,7,0);//posicao inicial da capsula na cena returngScene->createActor(atorDesc); } • Para visualizar os atores insira dentro do metodoInitNx() as linhas //faça isso logo abaixo da linha box = CreateBox(); capsula = CriarCapsula(); esfera = CriarEsfera(); • Após concluir os passos, aperte F5 para executar

  14. Lição 1 – corpos rígidos[4] • Agora, vamos aplicar forças para um dos atores que criamos • Na parte de atributos globais insira: // Force globals NxVec3 gForceVecEsfera(0,0,0); NxReal gForceStrengthEsfera = 20000; • Depois da parte de atributos globais, insira os trechos abaixo para criar o método que contem as forças que irão agir na esfera: void ProcessForceKeysEsfera() { for (int i = 0; i < MAX_KEYS; i++) { if (!gKeys[i]) { continue; } switch (i) { //no segundo parametro do metodo ApplyForceToActor voce pode criar diferentes //movimentos para seu ator alterando as coordenadas do vetor case '8': { gForceVecEsfera = ApplyForceToActor(esfera,NxVec3(0,0,1),gForceStrengthEsfera); break; } case '5': { gForceVecEsfera = ApplyForceToActor(esfera,NxVec3(0,0,-1),gForceStrengthEsfera); break; } case '4': { gForceVecEsfera = ApplyForceToActor(esfera,NxVec3(1,0,0),gForceStrengthEsfera); break; } case '6': { gForceVecEsfera = ApplyForceToActor(esfera,NxVec3(-1,0,0),gForceStrengthEsfera); break; } case '7': { gForceVecEsfera = ApplyForceToActor(esfera,NxVec3(0,1,0),gForceStrengthEsfera); break; } case '1': { gForceVecEsfera = ApplyForceToActor(esfera,NxVec3(0,-1,0),gForceStrengthEsfera); break; } } } }

  15. Lição 1 – corpos rígidos[5] • Dentro do método ProcessInputs(), logo abaixo da linha ProcessForceKeys(), faça uma chamada a ProcessForceKeysEsfera(); • Por fim dentro do método RenderCallback(), logo abaixo da linha DrawForce(box, gForceVec, NxVec3(1,1,0)); chame o mesmo método mas com os parâmetros alterados para desenhar as forças na esfera, ou seja: DrawForce(esfera, gForceVecEsfera, NxVec3(1,0,0)); • Obs.: o último parâmetro é um vetor de cores RGB, use-o para definir uma coloração diferente e evitar confusões; • Ainda em RenderCallback(), ponha a linha gForceVecEsfera = NxVec3(0,0,0); logo abaixo de gForceVec= NxVec3(0,0,0);. Assim você garante que o desenho das forças será apagado quando as teclas não são pressionadas; • Aperte F5 e teste os resultados.

  16. Lição 1 – corpos rígidos[6] • Obs.: Physx oferece uma classe HUD (Heads – Up - Display) para prover informação aos usuários; • Para escrever alguma informação utiliza a seguinte chamada dentro do metódo InitializeHUD();//posicao X e Y da mensagem na tela • hud.AddDisplayString(“sua mensagem", 0.05, 0.92);

  17. Lição 2 – Junções(articulações)[1] • Volte para a pasta TrainingPrograms, e nela abra Programs e depois a pasta Chapter2_joints; • Em seguida abra as pastas compiler -> vc8win32 e abra o arquivo Lesson201_joints; • Essa segunda lição trata de junções, que é a forma pela qual o PhysX trata as articulações; • Neste exemplo aparece a classe CommonCode. Ela tem vários métodos que permitem a criação rápida de atores, forças e junções. • Existem muitos tipos de junções: revolução, prismática, cilíndrica, esférica, fixa, etc. Usaremos junção de revolução. • Execute (F5) um pouco o arquivo; • Agora vamos alterá-lo.

  18. Lição 2 – Junções(articulações)[2] • Primeiro, vamos criar os atributos atores e junção: • Adicione as linhas abaixo nos atributos globais // Actor globals NxActor* capsula1 = NULL; NxActor* capsula2 = NULL; // Joint globals NxRevoluteJoint* revJointSuperior = NULL;//sera nossa junta de revolução • No metodo InitNx() faça as seguintes alterações; • Em // Create the objects in the scene aumente um pouco a posição y inicial da box1 conforme indicado de verde, box1 = CreateBox(NxVec3(0,5.75,0), NxVec3(0.5,2,1), 10); • Comente a linha: box2 = CreateBox(NxVec3(0,1,0), NxVec3(0.5,2,1), 10);

  19. Lição 2 – Junções(articulações)[3] • Logo após o comentário da linha especificada, chame os métodos de criação de atores: capsula1 = CreateCapsule(NxVec3(0,10,0), 3.0, 0.7, 1); capsula2 = CreateCapsule(NxVec3(0,1.5,0), 3.0, 0.7, 1); • Substitua essas linhas: NxVec3 globalAnchor = NxVec3(0.5,5,0); NxVec3 globalAxis = NxVec3(0,0,1); NxVec3 globalAnchor = NxVec3(0.1,10,0); NxVec3 globalAxis = NxVec3(0,0,3); NxVec3 globalAnchorSuperior = NxVec3(0,5.6,0); NxVec3 globalAxisSuperior = NxVec3(0,0,1); Por essas

  20. Lição 2 – Junções(articulações)[4] • As variáveis criadas anteriormente, serão os vetores Ancorâ e Eixo das nossas junções. Eles são muito importantes pois definem o posicionamento da junção e os limites que, basicamente, definem os movimentos no eixo. • Por fim, logo após a substituição das linhas, chame os métodos responsáveis pelas junções da seguinte forma: • Na linha revJoint = CreateRevoluteJoint(box1, box2, globalAnchor, globalAxis); substitua box2 por capsula1; • E adicione em seguida a linha: revJointSuperior = CreateRevoluteJoint(capsula2, box1, globalAnchorSuperior, globalAxisSuperior); • Atribua box1 a variável gSelectedActor para poder selecionar os atores apertando a tecla “r”;

  21. Lição 3 – Efeitos Físicos[1] • Novamente na pasta TrainingPrograms, abra Programs e depois a pasta Chapter4_Large_Scale_Physics_Effects; • Dentro dela, abra compiler -> vc8win32 e abra o arquivo Chapter411_Fragmenting_Objects; • Essa lição trata de fragmentação de objetos, usada em situações como explosões; • Para isso, o PhysX constrói um ator cubo. Que na verdade é uma caixa grande composta de várias caixas menores; • Todas as caixas menores são atreladas umas as outras para dar a idéia de que tudo é apenas um único bloco grande; • Execute um pouco o arquivo, clique com o botão direito em Lesson411_Fragmenting_Objects no Solution Explorer, depois selecione Debug e Start new instance; • Aperte “g” para particionar o bloco e “t” para lança-lo para o alto; • Agora, vamos alterar o arquivo para criar uma pequena explosão utilizando o arremesso de uma esfera.

  22. Lição 3 – Efeitos Físicos[2] • Na parte de atributos globais, adicione a linha abaixo para orientar a velocidade da esfera em relação ao eixo Z da câmera; // Camera globals extern NxVec3 gCameraForward; • Ainda nos atributos globais, aumente o numero de blocos que formarão o cubo de 4 para 6; // Fracturing Globals const int iNumBoxesOnSide = 6; • Também indique nos atributos globais que os atores estarão livres( atribuindo true a variável bReleaseRandomShape); bool bReleaseRandomShape = true;

  23. Lição 3 – Efeitos Físicos[3] • Dentro do método ProcessInputs() mantenha a variável bReleaseRandomShape com o valor true; • No metodo SpecialKeys() adicione o seguinte case: case ' ': { //gCameraPos indica que a posicao inicial da esfera sera a mesma da camera //4 sera o raio da esfera e 200 sua densidade NxActor* sphere = CreateSphere(gCameraPos, 4, 200); //abaixo indicamos que a esfera percorrerá linearmente uma distância de 200 vezes //em relação ao eixo Z da camera sphere->setLinearVelocity(gCameraForward * 200); break; } • Agora, sempre que você apertar a tecla de espaço uma esfera será lançada.

  24. Lição 3 – Efeitos Físicos[4] • No método CreateMainObject() atribua o valor 4.5 a variável boxStartHeight para que o bloco maior inicie na cena numa posição adequada para que os blocos menores se separem sem alterar a estrutura; • Execute o arquivo alterado, clicando com o botão direito em Lesson411_Fragmenting_Objects, no Solution Explorer, depois selecione Debug e Start new instance.

  25. Referencias • FARIAS, Thiago; SILVA, Daliton; MOURA, Guilherme; BUENO, Márcio; TEICHRIEB, Veronica; KELNER, Judith. Ageia PhysX. In: Symposium on Virtual and Augmented Reality, 2007, Petrópolis. https://www.gprt.ufpe.br/~grvm/pdfs/Minicursos/2007/SVR2007_ApostilaTutorialPhysX.pdf • AGEIA - http://www.ageia.com/ ou http://www.ageia.com/physx/

  26. Obrigado!!

More Related