Motivação
Até agora, apenas limitados programas de física tem sido integrados nos jogos.
Isto significa que computação física vem sendo tratada por CPU de propósito geral, o que já é bastante limitado, pois a demanda de jogos avançados incluem Lógica e Inteligência Artificial (IA).
Como resultado, a física nos jogos está limitada a poucos objetos numa cena, efeitos repetidos ou cenas que apenas iludem o usuário com uma imitação da física real.
Objetivo
Introduzir a ferramenta de simulação PhysX, como meio para aumentar a imersão do usuário enquanto utiliza jogos de computadores.
Física aplicada à multimídia
Não é apenas como os objetos e cenas se parecem, mas como eles se comportam.
Na grande maioria dos jogos atuais, os objetos simplesmente não parecem agir do jeito que você gostaria ou espera.
A maior parte da ação é limitada a animações pré-produzidas. Poderosas armas deixam pouco mais do que marcas nas paredes mais finas e todo oponente que você elimina parece cair de um jeito estranhamente familiar.
Sem PhysX Engine
Com PhysX Engine
ImersãoCell Factor: Revolution
O que é o PhysX?
PhysX é uma ferramenta que auxilia aplicações multimídias.
Sua função é simular o modelo da física de Newton. Utiliza variáveis tais como a massa, velocidade, atrito e
resistência do ar.
Simula e prevê efeitos sob diferentes condições que se aproximam da vida real.
Efeitos
Corpos rígidos Corpos moles Fluídos Tecidos Explosões Fumaça e neblina densas Colisões
Advanced Gaming Physics
Fidelidade
Escala
Interação
Sofisticação
Formas de funcionamento
A PhysX Engine pode funcionar de duas maneiras:
Através do SDK do PhysX, apenas utilizando o próprio processador do computador° Todos os cálculos feitos na CPU do computador.Obs. Não suporta a simulação de efeitos de fluídos!
Através do SDK do PhysX, utilizando a PPU° Todos os cálculos feitos na PPU.Obs. Suporta a simulação de todos os tipos de efeitos.
Physics Processing Unit (PPU)
Empregar os conceitos da física em um jogo exige uma quantidade tremenda de cálculos matemáticos e lógicos, com uma utilização massiva de memória.
Isto requer a utilização de um processador altamente especializado para fornecer um rico ambiente imersivo com características como:
Explosões que causam poeira e efeitos colaterais; Personagens com uma geometria mais complexa, que
permitem uma interação e movimentação mais realista; As armas apresentam novos efeitos não previsíveis; Densa fumaça e neblina que circundam os objetos em
movimento;
AGEIA PPU
Como funciona?
A ferramenta PhysX não é um software de renderização.
Não trata da simulação de sons.
Necessita de outra ferramenta para construir a cena. Por exemplo: OpenGL, OGRE.
Arquitetura
Performance com a PPU
Aplicações
Jogos, jogos e mais jogos!
Cell Factor: Revolution
Cell Factor: Revolution
Monster Truck Maniax
Gothic 3
Demonstração
//executar demo da AGEIA
Questão Teórica
Baseando-se nos conceitos de multimídia, qual a principal vantagem da utilização da ferramenta PhysX?
Inicializando o PhysXvoid InitNx() {
// Inicializando o SDK
gPhysicsSDK = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION);
if (!gPhysicsSDK) return;
// Criando a cena
NxSceneDesc sceneDesc;
sceneDesc.simType = NX_SIMULATION_SW;
sceneDesc.gravity = NxVec3(0,-9.81,0);
gScene = gPhysicsSDK->createScene(sceneDesc);
// Criando o material padrão
NxMaterial* defaultMaterial = gScene->getMaterialFromIndex(0);
defaultMaterial->setRestitution(0.5);
defaultMaterial->setStaticFriction(0.5);
defaultMaterial->setDynamicFriction(0.5);
// Criando os objetos na cena
groundPlane = CreateGroundPlane();
actor = CreateBox(); // criar uma esfera iniciando na posicao (0,5,0)
}
Loop do PhysXvoid loopPhysics(){
// recebe a variação do tempo em relação à última chamada da função
float gDeltaTime = UpdateTime();
// chama a simulação do PhysX passando como parâmetro a variação //do tempo
gScene->simulate(gDeltaTime);
gScene->flushStream();
}
Criando uma Esfera
NxActor* CreateSphere(const NxVec3& pos){
NxActorDesc actorDesc;
NxBodyDesc bodyDesc;
// O ator tem somente um shape(forma), a esfera
NxSphereShapeDesc sphereDesc;
// setando o raio da esfera
sphereDesc.radius = 1;
actorDesc.shapes.pushBack(&sphereDesc);
actorDesc.body = &bodyDesc;
//configurando a densidade do corpo do ator
actorDesc.density = 5;
//setando a posição global do ator
actorDesc.globalPose.t = pos;
return gScene->createActor(actorDesc);
}
Criando uma Cápsula
NxActor* CreateCapsule(const NxVec3& pos, const NxReal height, const NxReal radius, const NxReal density)
{NxActorDesc actorDesc;NxBodyDesc bodyDesc;
// O ator tem somente um shape(forma), a cápsula NxCapsuleShapeDesc capsuleDesc;// Setando a altura e o raio da cápsulacapsuleDesc.height = height;capsuleDesc.radius = radius;// Setando a posição local da cápsula para que ela inicie no planocapsuleDesc.localPose.t = NxVec3(0,radius+0.5*height,0);actorDesc.shapes.pushBack(&capsuleDesc);
actorDesc.body = &bodyDesc;actorDesc.density = density;// Setando a posição global do atoractorDesc.globalPose.t = pos;return gScene->createActor(actorDesc);
}
Questões Práticas
Exercício 1: Modifique Exercicio1.cpp, de forma que ao invés de se ter uma cena com um cubo, tenha uma cena com uma esfera. Utilize a função CreateSphere demonstranda anteriormente
Exercício 2: Modifique Exercicio2.cpp de forma que se adicione uma esfera e uma cápsula à cena. A esfera deve ser inicializada na posição (-5,0,5), raio 1 e densidade 10, enquanto que a cápsula estará na posição (0,0,0), altura 2, raio 0.5 e densidade 10
Dúvidas?