260 likes | 378 Views
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;
E N D
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; • 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;
Introdução[2] Unreal Tournament 2007 http://www.youtube.com/watch?v=rKk9FcUJqrU BackBreaker http://www.youtube.com/watch?v=bc4wfc3BGl0
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.
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;
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;
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.
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
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
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;
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); }
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
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; } } } }
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.
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);
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.
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);
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
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”;
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.
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;
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.
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.
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/