View
105
Download
0
Category
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
DemonstraçãoDemonstração
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;}
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
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;}
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 - 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.
Recommended