Upload
anka
View
23
Download
0
Embed Size (px)
DESCRIPTION
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; - PowerPoint PPT Presentation
Citation preview
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!!