Física e Inteligência Artificial para jogos utilizando XNA Nome Roger Tang EmpresaGLU Mobile

Preview:

Citation preview

Física e Inteligência Artificial para jogos utilizando XNA

Nome Roger TangEmpresaGLU Mobile

AgendaFísica

Primeira lei de Newton

Modelando Velocidade, Atrito e Aceleração

Impulso e Quantidade de Movimento

Colisão e Conservação de energia

Exemplo

Engines de Física

Inteligência ArtificialChase – Perseguição

Evade – Fuga

Exemplos

Física

Conceito de amostragemConceito de amostragem É necessário armazenar o tempo transcorrido entre duas amostragens para efetuar uma simulação física.A amostragem temporal do jogo (Frames por segundo) não é contínua.A variação temporal entre duas interações de “Update” não pode ser considerada 1 e deve ser calculada a cada interaçãoO XNA possui a classe auxiliar GameTime que permite calcular o tempo transcorrido entre duas interações

Primeira Lei de NewtonLei da Inércia

Na ausência de forças, um corpo em repouso continua em repouso, e um corpo em movimento, continua em movimento retilíneo uniforme (MRU).

ModeloEm uma simulação onde existe uma esfera rolando sobre uma superfície a força que faz com que o corpo desacelere e perca velocidade é a força de atrito. Esta força é contrária ao vetor velocidade.

velocidadeatrito

Modelando Velocidade em XNAA velocidade é a derivada do espaço no

tempo

tvssdt

dsv if

Codificando em XNAprivate Vector3 posicao = new Vector3(-200, 0, 0);private Vector3 velocidade = new Vector3(1, 0, 0);

public override void Update(Microsoft.Xna.Framework.GameTime gameTime){

// Calcula Dt - Tempo transcorrido float timeDelta = (float)gameTime.ElapsedGameTime.TotalSeconds;

// Calcula nova posição. sf = si + vDtposicao += velocidade * timeDelta;

}

Modelando Atrito em XNAO atrito é força contrária ao movimento

velocidadeatrito

private Vector3 posicao = new Vector3(-200, 0, 0);private Vector3 velocidade = new Vector3(1, 0, 0);const float coeficienteAtrito = 0.1f;

public override void Update(Microsoft.Xna.Framework.GameTime gameTime){

// Calcula Dt - Tempo transcorrido float timeDelta = (float)gameTime.ElapsedGameTime.TotalSeconds;

// Calcula atrito. Vetor contrário a velocidadeVector3 direcaoAtrito = -velocidade;

direcaoAtrito.Normalize(); direcaoAtrito *= coeficienteAtrito;

// Calcula nova velocidadevelocidade += direcaoAtrito;

// Calcula nova posição. sf = si + vDtposicao += velocidade * timeDelta;

}

Modelando Aceleração em XNAA aceleração é a derivada da velocidade no

tempotavv

dt

dva if

Codificando em XNAprivate Vector3 posicao = new Vector3(-200, 0, 0);private Vector3 velocidade = new Vector3(0, 0, 0);private Vector3 aceleracao = new Vector3(1, 0, 0);

public override void Update(Microsoft.Xna.Framework.GameTime gameTime){

// Calcula Dt - Tempo transcorrido float timeDelta = (float)gameTime.ElapsedGameTime.TotalSeconds;

// Calcula nova velocidade. vf = vi + vDtvelocidade += aceleracao * timeDelta;

// Calcula nova posição. sf = si + vDtposicao += velocidade * timeDelta;

}

Impulso e Quantidade de MovimentoPara o caso do exemplo anterior, como a aceleração é

constante, a velocidade cresce exponencialmente a cada ciclo de “Update”. Logo a velocidade tende ao infinito. Como queremos apenas alterar a velocidade em um curto espaço de tempo, vamos aplicar um Impulso

No nosso modelo vamos aplicar o Impulso no intervalo de tempo de apenas um ciclo de “Update”. Desta forma assim que processarmos a nova velocidade vamos zerar o valor do impulso.

Para o nosso exemplo, o Impulso continuará sendo aplicado enquanto o botão do “gamepad” estiver sendo pressionado

m

Ivv

Pvmtt

vmI

tmatFI

if

Modelando Impulso em XNAO Impulso é aplicado em apenas em ciclo de

updateprivate Vector3 posicao = new Vector3(-200, 0, 0);private Vector3 velocidade = new Vector3(0, 0, 0);private Vector3 Impulso = new Vector3(1, 0, 0);

public override void Update(Microsoft.Xna.Framework.GameTime gameTime){

// Calcula Dt - Tempo transcorrido float timeDelta = (float)gameTime.ElapsedGameTime.TotalSeconds;

// vf = vi + I/m velocidade += Impulso / massa;

// Calcula atrito. Vetor contrário a velocidadeVector3 direcaoAtrito = -velocidade;

direcaoAtrito.Normalize(); direcaoAtrito *= coeficienteAtrito;

// Modela a valiação (redução) de velocidade devido ao atrito velocidade += direcaoAtrito;

// sf = si + v*Dt - Ajusta posição Posicao += velocidade * timeDelta;

// O Impulso é aplicado em apenas um ciclo de update Impulso = Vector3.Zero;}

Colisão e Conservação de EnergiaConservação da Energia Cinética. A soma da

energia antes da colisão é igual a Energia depois da colisão

2121 EEEE

Conservação do Momento

ff vmvmvmvm

pppp

22112211

2121

)(

)(

21

12

vv

vve ff

Coeficiente de Restituição. É a medida de quanto uma colisão é Elástica ou Inelástica

Resolvendo as velocidades finaisDesta forma as novas velocidades depois

da colisão são dadas por:

)(

)()1(

)(

)()1(

21

212112

21

211221

mm

emmvvmev

mm

emmvvmev

f

f

Detectando ColisãoCria-se uma esfera envolvendo a malha e verifica se uma esfera intercepta a outra

public bool DetectaColisao(Esfera esfera){

// A massa escala o objeto BoundingSphere envolucroEsfera1 = new BoundingSphere(Posicao,

Modelo.Meshes[0].BoundingSphere.Radius * Massa); BoundingSphere envolucroEsfera2 = new BoundingSphere

(esfera.Posicao, esfera.Modelo.Meshes[0].BoundingSphere.Radius * esfera.Massa);

if (envolucroEsfera1.Intersects(envolucroEsfera2)) { audio.PlayCue("Bola"); CalculaVelocidades(esfera); return true; } else return false;}

Codificando novas velocidadesprivate void CalculaVelocidades(Esfera esfera){

float produtoInversoMassas = 1.0f / (Massa + esfera.Massa);

Vector3 velocidade1Nova =((coeficienteRestituicao + 1.0f)*esfera.Massa*esfera.Velocidade +

Velocidade * (Massa - (coeficienteRestituicao * esfera.Massa))) * produtoInversoMassas;

Vector3 velocidade2Nova = (

(coeficienteRestituicao + 1.0f) * Massa * Velocidade -

esfera.Velocidade*(Massa-(coeficienteRestituicao*esfera.Massa))) * produtoInversoMassas;

Velocidade = velocidade1Nova; esfera.velocidadeColisao = velocidade2Nova;}

Engines de Física – Open SourceOpen Source Engines

Box2D Physics Engine - Engine 2DBullet – Multarefa, colisão 3D e Dynamic Rigid BodyODE (Open Dynamics Engine) - Dynamic Rigid BodyOPAL (Open Physics Abstraction Layer) PAL (Physics Abstraction Layer )Tokamak Game Physics Farseer Physics Engine (engine 2D para Microsoft XNA e Silverlight)

Engines de Física – ProfissinaisPhysX – Nvidia – build-in editor, graficos Direct X e som, vertex

based PhyzTorque X – Garage GamesNewton Game DynamicsPhun 2D Physics SandboxHavokAgX Multiphysics (software)Working Model

Inteligência Artificial

Chase - PerseguiçãoChase - PerseguiçãoO conceito de perseguição consiste em direcionar O conceito de perseguição consiste em direcionar o agente para o alvo e iniciar a perseguição o agente para o alvo e iniciar a perseguição

Vector3 direction = A.position – B.Position;Vector3 direction = A.position – B.Position;

Lógica para definir lado da Lógica para definir lado da rotaçãorotação

Implementando Implementando PerseguiçãoPerseguiçãopublic void Chase(Asteroids.Asteroid asteroid){

// Calculate ship vector between ship and asteroid Vector3 direction = asteroid.position - Position; // Calculate direction direction.Normalize();

Vector3 shipHead = HeadShip; Vector3 shipSide = HeadSide; // Calculate the angle between ship and asteroid float angle = GetAngleSignedBetween2Vectors(shipHead, direction); // Calculate side dot to verify if we need turn to rigth or left float sideDot = Vector3.Dot(shipSide, direction); // Prevent angle to be bigger MaxAngle if (angle > GameConstants.MaxRotationAngle) angle = GameConstants.MaxRotationAngle; if (sideDot > 0)

Rotation -= angle; else Rotation += angle; // Updade velocity velocity += direction * GameConstants.VelocityScale / 3;}

Evade - FugaEvade - FugaO conceito de fuga consiste em direcionar o O conceito de fuga consiste em direcionar o agente para a posição oposta ao alvo agente para a posição oposta ao alvo

Vector3 posicaoFuga = 2 * A.posicao - B.posicao;Vector3 posicaoFuga = 2 * A.posicao - B.posicao;

Exemplo de Busca e Exemplo de Busca e PerseguiçãoPerseguição

Estados da IAEstados da IAVagandoVagando

CapturandoCapturando

FugindoFugindo

CapturadoCapturado

Outras técnicas de IAOutras técnicas de IASterring BehavioursSterring Behaviours

Chase and EvadeWander...

Redes NeuraisRedes Neurais

Logica FuzzyLogica Fuzzy

PendenciasPendencias

Alterar a IA da nave de perseguicaoAlterar a IA da nave de perseguicao

Esplicar o conceito de tomada de Esplicar o conceito de tomada de decisão para tiro do exemplo do decisão para tiro do exemplo do asteroideasteroide

Explicar a IA do exemplo de Explicar a IA do exemplo de perseguiçãoperseguição

http://www.gamefestbrasil.net/

© 2008 Microsoft Corporation. All rights reserved.This presentation is for informational purposes only.

Microsoft makes no warranties, express or implied, in this summary.