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

Post on 12-Jan-2016

23 views 0 download

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)

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!!