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

26
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ÁTICA AULA PRÁTICA

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

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

Page 1: 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

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

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;

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

Introdução[2]

Unreal Tournament 2007

http://www.youtube.com/watch?v=rKk9FcUJqrU

BackBreaker

http://www.youtube.com/watch?v=bc4wfc3BGl0

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

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.

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

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;

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

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;

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

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.

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

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

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

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

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

Exemplos

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

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;

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

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);

}

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

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

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

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; }

}}

}

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

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.

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

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);

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

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.

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

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);

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

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);

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

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”;

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

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.

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

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;

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

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.

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

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.

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

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/

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

Obrigado!!