2-fisica-e-inteligencia-artificial-para-jogos-utilizando-xna1
Transcript of 2-fisica-e-inteligencia-artificial-para-jogos-utilizando-xna1
AgendaFísica
Primeira lei de NewtonModelando Velocidade, Atrito e AceleraçãoImpulso e Quantidade de MovimentoColisão e Conservação de energiaExemploEngines de Física
Inteligência ArtificialChase – PerseguiçãoEvade – FugaExemplos
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.
velocidadeatr
ito
DemonstraçãoDemonstração
Modelando Velocidade em XNAA velocidade é a derivada do espaço
no tempotvss
dtdsv 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
velocidadeatri
to
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
dtdva 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
mIvv
PvmttvmI
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 vmvmvmvmpppp
22112211
2121
)()(
21
12
vvvv
e 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
mmemmvvmev
mmemmvvmev
f
f
Detectando ColisãoCria-se uma esfera envolvendo a malha e verifica se uma esfera intercepta a outrapublic 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;}
DemonstraçãoDemonstração
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
Chase - PerseguiçãoChase - PerseguiçãoO conceito de perseguição consiste em O conceito de perseguição consiste em direcionar o agente para o alvo e iniciar a direcionar o agente para o alvo e iniciar a perseguição perseguição Vector3 direction = A.position – Vector3 direction = A.position – B.Position;B.Position;
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;}
Exemplo de Busca e Exemplo de Busca e PerseguiçãoPerseguição
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 - Vector3 posicaoFuga = 2 * A.posicao - B.posicao;B.posicao;
Exemplo de Busca e Exemplo de Busca e PerseguiçãoPerseguição
Outras técnicas de IAOutras técnicas de IASterring BehavioursSterring BehavioursChase and EvadeWander...
Redes NeuraisRedes NeuraisLogica FuzzyLogica Fuzzy
PendenciasPendenciasAlterar a IA da nave de Alterar a IA da nave de perseguicaoperseguicaoEsplicar 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 asteroideasteroideExplicar 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.