Igor Duarte (idal) Luciano Demétrio (ldsp) Thiago Alexandre (tan2) Thiago Ferreira (tfds)
description
Transcript of Igor Duarte (idal) Luciano Demétrio (ldsp) Thiago Alexandre (tan2) Thiago Ferreira (tfds)
Igor Duarte (idal)Luciano Demétrio (ldsp)Thiago Alexandre (tan2)
Thiago Ferreira (tfds)Tiago Lemos (tlam)
16.01.08
Introdução à Multimídia
AULA PRÁTICAAULA PRÁTICA
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 abaDemonstração e dê um clique duplo sobre o icone cujo exemplo desejavisualizar.
Acesso ao PhysX SDK[1]
Menu StartMenu Start -> My ComputerMenu Start -> My Computer -> Local disk(C:)Menu Iniciar -> Meu Computador -> Local disk(C:)
-> Program filesMenu Start -> My Computer -> Local disk(C:)
-> Program files -> AGEIA TechnologiesMenu Start -> My Computer -> Local disk(C:)
> Program files-> AGEIA Technologies -> SDKFaç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 ProgramsTraining Programs -> ProgramsTraining Programs -> Programs -> Chapter1_Rigid_BodiesTraining Programs -> Programs -> Chapter1_Rigid_Bodies -> compilerTraining Programs -> Programs -> Chapter1_Rigid_Bodies -> compiler
-> vc8win32Na pasta vc8win32 abra o arquivo Lesson101_Box_on_a_plane.
Este arquivo contém as primeiras lições da biblioteca Physx e é ele queiremos alterar em seguida
Exemplos
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(){
NxActorDesc atorDesc;NxBodyDesc corpoDesc;
NxSphereShapeDesc esferaDesc;esferaDesc.radius = 1.25;//raio da esferaatorDesc.shapes.pushBack(&esferaDesc);
atorDesc.body = &corpoDesc;atorDesc.density = 3;//densidade da esferaatorDesc.globalPose.t = NxVec3(0,3,0);//posição inicial da esfera na cenareturn gScene->createActor(atorDesc);
}
Lição 1 – corpos rígidos[3]– Agora insira os trechos abaixo para criar uma capsula:
NxActor* CriarCapsula (){
NxActorDesc atorDesc;NxBodyDesc corpoDesc;
NxCapsuleShapeDesc capsulaDesc;capsulaDesc.height = 5;//altura da capsulacapsulaDesc.radius = 0.25;//raio da capsulaatorDesc.shapes.pushBack(&capsulaDesc);
atorDesc.body = &corpoDesc;atorDesc.density = 12;//densidade da capsulaatorDesc.globalPose.t = NxVec3(5,7,0);//posicao inicial da capsula na cenareturn gScene->createActor(atorDesc);
}
– Para visualizar os atores insira dentro do metodo InitNx() 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); Por essas
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);
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 globalsextern NxVec3 gCameraForward;
• Ainda nos atributos globais, aumente o numero de blocos que formarão o cubo de 4 para 6;
// Fracturing Globalsconst 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 densidadeNxActor* 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 camerasphere->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
adequadapara que os blocos menores se separem sem alterar a estrutura;
• Execute o arquivo alterado, clicando com o botão direito emLesson411_Fragmenting_Objects, no Solution Explorer, depois selecioneDebug 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/
Obrigado!!