Conceitos Introdutórios de Física e Inteligência Artifical para Jogos

78 visualizações

Publicada em

Mini aula ministrada juntamente ao prof. Me. André Kishimoto no Gamedays 2010 da Universidade Cruzeiro do Sul.

Publicada em: Tecnologia
0 comentários
2 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
78
No SlideShare
0
A partir de incorporações
0
Número de incorporações
21
Ações
Compartilhamentos
0
Downloads
0
Comentários
0
Gostaram
2
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Conceitos Introdutórios de Física e Inteligência Artifical para Jogos

  1. 1. Conceitos Introdutórios de Física e Inteligência Artificial para jogos André Kishimoto (Glu Mobile) Rafael Oliveira Martins (EA Mobile)
  2. 2. Antes de começar... • O conteúdo desse mini-curso é uma pesquisa dos autores e não tem ligação com as empresas em que trabalham • As opiniões apresentadas são pessoais e não refletem a opinião, posição e/ou visão das empresas EA Mobile e Glu Mobile
  3. 3. Agenda • Introdução • Tecnologia e demonstração • Trigonometria – Deslocando e rotacionando objetos • Física – Velocidade, aceleração e desaceleração – Colisão radial • Inteligência Artificial – FSM (Máquina de estados) – Percorrendo um caminho pré-definido – Perseguindo e fugindo do jogador • Referências
  4. 4. Agenda • Introdução • Tecnologia e demonstração • Trigonometria – Deslocando e rotacionando objetos • Física – Velocidade, aceleração e desaceleração – Colisão radial • Inteligência Artificial – FSM (Máquina de estados) – Percorrendo um caminho pré-definido – Perseguindo e fugindo do jogador • Referências
  5. 5. Introdução • Criamos esse mini-curso assumindo que o público já tenha familiaridade com programação • Dada a carga horária do mini-curso, tivemos que selecionar apenas alguns tópicos sobre Física e IA – Há muito mais a ser estudado e implementado sobre essas áreas, por isso listamos diversas referências no último slide • Embora importante, não nos atentamos à parte visual pois o foco desse mini-curso é a parte técnica
  6. 6. Agenda • Introdução • Tecnologia e demonstração • Trigonometria – Deslocando e rotacionando objetos • Física – Velocidade, aceleração e desaceleração – Colisão radial • Inteligência Artificial – FSM (Máquina de estados) – Percorrendo um caminho pré-definido – Perseguindo e fugindo do jogador • Referências
  7. 7. Tecnologia e demonstração • Para demonstrar os assuntos do mini-curso na prática, tivemos que adotar uma ferramenta, que no caso foi o Adobe Flash (e AS3.0) • No entanto, os conceitos podem ser aplicados em qualquer outra ferramenta e linguagem de programação – Anteriormente escrevemos o mesmo conteúdo em Java ME (mobile) e C++ para Windows • Optamos também por trabalhar em 2D ao invés de 3D, para simplificar o exemplo (novamente, os conceitos também se aplicam em 3D, dada as devidas modificações) • Quanto ao exemplo, reunimos todo o conteúdo do mini- curso em uma demo estilo shooter com vista top-down
  8. 8. Agenda • Introdução • Tecnologia e demonstração • Trigonometria – Deslocando e rotacionando objetos • Física – Velocidade, aceleração e desaceleração – Colisão radial • Inteligência Artificial – FSM (Máquina de estados) – Percorrendo um caminho pré-definido – Perseguindo e fugindo do jogador • Referências
  9. 9. Trigonometria • Grande parte dos jogos possuem objetos que se movimentam pela tela • Quando os movimentos são horizontais e verticais, não há grandes complicações em programar a movimentação – Basta alterar valores (x,y) de um objeto • Mas e quando os objetos podem ser rotacionados e devem seguir a direção para onde estão “olhando”? – É aqui que entra a trigonometria
  10. 10. Trigonometria • Imaginem uma bala de canhão sendo atirada no espaço. O canhão possui uma certa direção, que é a rotação da sua base. • Na imagem abaixo, digamos que o ponto p seja a direção inicial do canhão • Queremos mover a mira do canhão para o ponto p’ • Reparem que há um círculo de raio h, indicando que a mira pode ser rota- cionada em 360 graus.
  11. 11. Trigonometria • Notem também que há um triângulo retângulo formado pelos pontos (0, 0), (xp’, yp’) e (xp’, 0). A relação trigonométrica de um triângulo retângulo é (pela figura): – sin(ang) = a / h – cos(ang) = o / h – tan(ang) = o / a – (a = cateto adjacente, o = cateto oposto e h = hipotenusa)
  12. 12. Trigonometria • Para resolver o problema da bala de canhão, usamos os valores de sin(ang) e cos(ang), pois através do seno e cosseno, conseguimos encontrar qualquer ponto no círculo, dado um determinado ângulo • Calculando alguns ângulos: – Ângulo (x, y) cos() sin() • 0 ou 360 (1, 0) 1 0 • 90 (0, 1) 0 1 • 180 (-1, 0) -1 0 • 270 (0, -1) 0 -1
  13. 13. Trigonometria • Reparem nas colunas (x,y), sin() e cos() do slide anterior • Essa é a relação que os valores seno e cosseno possuem com a coordenada (x,y) de um ponto p: – cos(ang) equivale à coordenada x de p – sin(ang) equivale à coordenada y de p • Podemos adicionar uma velocidade ao deslocamento, multiplicando tanto cos() como sin() por um valor de velocidade
  14. 14. Trigonometria • No exemplo desse mini-curso, a aplicação do que acabamos de ver pode ser conferido no clique de mouse (tiro) e na movimentação do NPC: // Desloca NPC baseado na direcao para onde ele esta olhando var angle:Number = Constants.DEG_TO_RAD * this.rotation; var deltaX:Number = m_velocityX * Math.cos( angle ); var deltaY:Number = m_velocityY * Math.sin( angle ); this.x += deltaX; this.y += deltaY;
  15. 15. Trigonometria • Podemos realizar a operação contrária, isto é, a partir de duas coordenadas (x,y), queremos descobrir o ângulo de rotação de um objeto • Para isso, calculamos o arco tangente de dy/dx • atan2(y, x) é uma variação da função do arco tangente, recebendo dois parâmetros e considerando o sinal de dx e dy
  16. 16. Trigonometria • O exemplo implementa a obtenção de um ângulo a partir da posição (x,y) do cursor do mouse com a posição (x,y) do player, para que o player seja rotacionado apontando sempre para o cursor do mouse: public function followMouseCursor() { var deltaX:Number = stage.mouseX - this.x; var deltaY:Number = stage.mouseY - this.y; var angle:Number = Math.atan2( deltaY, deltaX ); var rotation:Number = angle * Constants.RAD_TO_DEG; this.rotation = rotation; }
  17. 17. Agenda • Introdução • Tecnologia e demonstração • Trigonometria – Deslocando e rotacionando objetos • Física – Velocidade, aceleração e desaceleração – Colisão radial • Inteligência Artificial – FSM (Máquina de estados) – Percorrendo um caminho pré-definido – Perseguindo e fugindo do jogador • Referências
  18. 18. Física • Vimos que para movimentar um objeto pela tela, basta alterar sua posição (x,y), seguindo ou não a orientação do objeto • Durante a movimentação, os objetos possuem uma determinada velocidade, que é a razão da distância percorrida no espaço em uma determinada faixa de tempo (v = ds/dt) • Em Física, aprendemos que a velocidade é em metros/segundo, mas no computador podemos indicar a velocidade de um objeto por pixels/fps
  19. 19. Física • Assim, no código que realiza o update do jogo a uma taxa de N fps, podemos aplicar uma velocidade para deslocar o objeto – No Flash o update pode ser feito em resposta ao evento ENTER_FRAME, e a taxa de fps é definida no projeto (.fla) • A nova posição s do objeto, dada uma velocidade v e tempo t é s(t) = s0 + (v * t) • Traduzindo para o computador (AS3): public function enterFrame() { // Aplica velocidade ao objeto this.x = this.x + m_velocityX; this.y = this.y + m_velocityY; }
  20. 20. Física • O código anterior aplica uma velocidade constante ao objeto. Para alterar essa velocidade e assim aplicarmos uma aceleração ao objeto, podemos usar a equação de aceleração (a = dv/dt) • A nova velocidade v do objeto, dada uma aceleração a e tempo t é v(t) = v0 + (a * t) • Traduzindo para o computador (AS3): public function enterFrame() { // Aplica aceleração m_velocityX = m_velocityX + m_accelerationX; m_velocityY= m_velocityY + m_accelerationY; // Aplica velocidade ao objeto this.x = this.x + m_velocityX; this.y = this.y + m_velocityY; }
  21. 21. Física • A desaceleração de um objeto pode ser vista como uma aceleração negativa • Dessa forma, basta aplicar uma força negativa à velocidade ou reduzir a aceleração e velocidade uma determinada porcentagem a cada passar de tempo • No exemplo, quando o jogador não está pressionando teclas de movimentação, reduzimos a aceleração e velocidade em 20%: public function enterFrame() { if( !m_isMoving ) { m_accelerationX = m_accelerationX * Constants.FRICTION; // FRICTION = 0.8 m_accelerationY = m_accelerationY * Constants.FRICTION; m_velocityX= m_velocityX * Constants.FRICTION; m_velocityY= m_velocityY * Constants.FRICTION; } }
  22. 22. Agenda • Introdução • Tecnologia e demonstração • Trigonometria – Deslocando e rotacionando objetos • Física – Velocidade, aceleração e desaceleração – Colisão radial • Inteligência Artificial – FSM (Máquina de estados) – Percorrendo um caminho pré-definido – Perseguindo e fugindo do jogador • Referências
  23. 23. Física • A colisão entre objetos nos jogos nada mais é que um problema matemático: intersecções de figuras geométricas que podem ser calculadas e resolvidas através de algumas equações • Existem diversas maneiras para detectar colisões, como interseção de duas retas, reta com retângulo, reta com círculo, intersecção de dois retângulos (talvez o mais comum), dois círculos, retângulo e círculo, polígonos, etc. – A escolha do método de colisão depende da forma dos objetos do jogo
  24. 24. Física • Para o exemplo, escolhemos o método de colisão entre dois círculos: – Dado dois círculos nas coordenadas A(x1, y1) e B(x2, y2) de raio r1 e r2, respectivamente, a intersecção entre eles ocorre quando a distância entre seus centros é menor ou igual a soma de seus raios: – (x2 – x1)2 + (y2 – y1)2 <= (r1 + r2)2 public function checkRadialCollision(objA:MovieClip, radiusA:Number, objB:MovieClip, radiusB:Number):Boolean { var distX:Number = objB.x - objA.x; var distY:Number = objB.y - objA.y; var radius:Number = radiusA + radiusB; return( distX * distX + distY * distY <= radius * radius ); }
  25. 25. Agenda • Introdução • Tecnologia e demonstração • Trigonometria – Deslocando e rotacionando objetos • Física – Velocidade, aceleração e desaceleração – Colisão radial • Inteligência Artificial – FSM (Máquina de estados) – Percorrendo um caminho pré-definido – Perseguindo e fugindo do jogador • Referências
  26. 26. Inteligência Artificial • Geralmente trabalhamos com sequências de entradas, ações e transições que definem a progressão de qualquer tipo de jogo ou aplicativo. • Para gerenciar essas transições usamos o conceito de FSM (Finite State Machines), onde definimos quais estados utilizaremos e como definimos a ordem em que eles estarão ativos ou inativos. • Um exemplo de aplicação de FSM em um jogo pode ser dado pela transição: Tela do Título -> Menu -> Novo Jogo -> Fim de Jogo -> Menu
  27. 27. Inteligência Artificial • Uma questão comum no desenvolvimento de jogos é, “Como posso estruturar meu jogo?”. • Uma maneira eficaz e concreta para resolver isso seria pensar no seguinte cenário: 1. O jogo é carregado e a tela inicial ou de título aparece. 2. O jogador aperta Start/Enter e a tela de título é removida, dando vez a tela do menu principal. 3. O jogador escolhe Iniciar Jogo, a tela do menu é removida e um sub-menu aparece. 4. O sub-menu mostra uma mensagem de que o jogo é Demo, e o jogador pode comprar o jogo ou jogar a versão limitada. 5. O jogador aceita a mensagem, o sub-menu é removido e a tela de carregar o jogo aparece. 6. Após o carregamento do jogo, a tela de carregar fica inativa e a tela de jogo é exibida. 7. Durante o jogo, o jogador pressiona o botão Start e a tela de pausa assume o controle.
  28. 28. Inteligência Artificial • Em nosso jogo exemplo, utilizamos em dois momentos o uso de FSM, o primeiro é: Tela de Jogo e Tela de Pausa. • Podemos tornar o fluxo do jogo mais complexo, utilizando uma estrutura maior, como citado anteriormente.
  29. 29. Inteligência Artificial • O comportamento do NPC é o segundo momento em que usamos o conceito de FSM. NPC Patrolling Seeking Evading //Patrulhando //Perseguindo //Fugindo
  30. 30. Agenda • Introdução • Tecnologia e demonstração • Trigonometria – Deslocando e rotacionando objetos • Física – Velocidade, aceleração e desaceleração – Colisão radial • Inteligência Artificial – FSM (Máquina de estados) – Percorrendo um caminho pré-definido – Perseguindo e fugindo do jogador • Referências
  31. 31. Inteligência Artificial • Uma técnica fundamental para qualquer jogo que queira demonstrar sinais de uso de IA é a determinação de caminhos e buscas pré-definidas. • Uma vez que precisamos nos deslocar, desviar de obstáculos e seguir rotas, a implementação dessa técnica é necessária. • Existem diversas maneiras de implementarmos o uso de caminhos, rotas e buscas. Isso depende do problema a ser resolvido e de quantas entidades vamos associar ao jogo. • Nos jogos onde os NPCs se deslocam, é necessário traçar um caminho para que eles percorram, seja na busca do jogador, do inimigo, de um ítem ou até mesmo para chegarem a uma outra extremidade utilizando o menor caminho.
  32. 32. Inteligência Artificial • No jogo exemplo, o NPC tem uma rota definida, enquanto está no estado de Patrulha. • A rota do NPC é pré-definida por pontos nas extremidades da tela (x,y), que definem sua posição atual em um movimento retangular. px0,py0 px1,py1 px2,py2px3,py3 Início
  33. 33. Inteligência Artificial • Neste caso, o melhor meio de definirmos os pontos do caminho é criando um Array de coordenadas na tela. private var m_points:Array = [ px0, py0, px1, py1, px2, py2, px3, py3 ]; - Onde px = coordenada X e py = coordenada Y na tela • Como temos 4 (quatro) coordenadas x,y na tela, definimos um número máximo de coordenadas a serem atingidas pelo NPC: public static const MAX_POINTS_IN_PREDEFINED_PATH:int = 3; // 0 à 3 = 4 coordenadas • A cada ponto do caminho pré-definido em que o NPC atinge, seu próximo passo é olhar para o próximo ponto e caminhar até ele. • Atingindo o próximo ponto, sua posição atual é incrementada e é verificado se ele atingiu o número máximo de coordenadas. Caso a posição atual seja maior que o número máximo de coordenadas, logo o NPC concluiu o fim de seu destino e retorna a posição inicial.
  34. 34. Inteligência Artificial • Traduzindo para o computador (AS3) switch( m_state ) { case Constants.STATE_PATROLLING: { // Caminha ate o proximo ponto do caminho pre-definido lookAtPoint( m_points[m_currentPoint * 2], m_points[m_currentPoint * 2 + 1], false ); gotoPoint( m_points[m_currentPoint * 2], m_points[m_currentPoint * 2 + 1] ); // Se atingiu o ponto, passa para o proximo if ( reached() ) { m_currentPoint ++; // Volta ao primeiro ponto do caminho caso tenha atingido o ultimo if ( m_currentPoint > Constants.MAX_POINTS_IN_PREDEFINED_PATH ) { m_currentPoint = 0; } } } //...... }
  35. 35. Agenda • Introdução • Tecnologia e demonstração • Trigonometria – Deslocando e rotacionando objetos • Física – Velocidade, aceleração e desaceleração – Colisão radial • Inteligência Artificial – FSM (Máquina de estados) – Percorrendo um caminho pré-definido – Perseguindo e fugindo do jogador • Referências
  36. 36. Inteligência Artificial • A idéia de perseguir, fugir, ficar em alerta, entre outras dentro do contexto de IA é feito através do uso de agentes. • Os agentes são todos elementos que percebem o ambiente que estão por meio de sensores e atuam por meio de atuadores. • Há muito o que estudar dentro dessa área, mas para nosso mini curso, as técnicas de Perseguir e Fugir são bons exemplos do uso de agentes.
  37. 37. Inteligência Artificial • No jogo exemplo, o NPC inicia no estado de Patrolling (Patrulha), enquanto o Player pode caminhar pela tela. • Caso haja colisão entre os dois ( via colisão entre círculos, explicado anteriormente ), o NPC começa a perseguir o Player e entra no estado de Seeking ( Perseguindo ). // Caso player colidiu com NPC, muda estado do NPC para seeking if ( checkRadialCollision( m_player, Constants.COLLISION_RADIUS, m_enemy, Constants.COLLISION_RADIUS ) && m_enemy.getState() != Constants.STATE_EVADING ) { m_enemy.setState( Constants.STATE_SEEKING ); }
  38. 38. Inteligência Artificial case Constants.STATE_SEEKING: { // Persegue o player lookAtPoint( m_playerX, m_playerY, false ); gotoPoint( m_playerX, m_playerY ); } • O NPC ficará no estado Perseguindo, até que o Player acerte o 3 ( três ) vezes. // Verifica se tiro atingiu NPC if ( checkRadialCollision( m_bullet, Constants.BULLET_RADIUS, m_enemy, Constants.BULLET_RADIUS ) ) { m_enemyHits ++; if ( m_enemyHits > 2 ) { m_enemyHits = 0; m_enemy.setState( Constants.STATE_EVADING ); } m_bIsShooting = false; m_bullet.x = -100; m_bullet.y = -100; }
  39. 39. Inteligência Artificial • Depois de atingido, o NPC sai do estado de Perseguindo e entra no estado de Evading ( Fugindo ). • Enquanto o NPC está a uma certa distância do Player, ele continua fugindo. No nosso exemplo, enquanto a distância for menor que 200 pixels, ele permance no estado de Evading. px0,py0 px1,py1 px2,py2px3,py3 Início Player NPC: Evading < 200px
  40. 40. Inteligência Artificial • Quando a distância entre NPC e Player atingir mais de 200px, o NPC caminha até o ponto pré-definido mais próximo e retorna ao estado de Patrolling ( Patrulha ). • Nesse caso, m_currentPoint guarda a última posição do estado de Patrulha do NPC. case Constants.STATE_EVADING: { // Calcula distancia entre player e NPC, se for menor que 200 pixels, continua fugindo var distance:Number = Math.sqrt( ( m_playerX - this.x ) * ( m_playerX - this.x ) + ( m_playerY - this.y ) * ( m_playerY - this.y ) ); if ( distance < 200 ) { lookAtPoint( m_playerX, m_playerY, true ); gotoPoint( m_playerX, m_playerY ); } // Caso contrario, vai para o proximo ponto do caminha prdefinido e ao atingir o ponto, // muda estado para patrulhando novamente else { lookAtPoint( m_points[m_currentPoint * 2], m_points[m_currentPoint * 2 + 1], false ); gotoPoint( m_points[m_currentPoint * 2], m_points[m_currentPoint * 2 + 1] ); if ( reached() ) { setState( Constants.STATE_PATROLLING ); } } } //…..
  41. 41. Inteligência Artificial • Como vimos, o NPC utiliza de uma forma básica o conceito de FSM juntamente comas técnicas de IA de acordo com as regras utilizadas. • As técnicas utilizadas nessa aula podem ser aplicadas à qualquer tipo de linguagem ou plataforma de desenvolvimento, dadas modificações de sintaxe, regras e performance.
  42. 42. Agenda • Introdução • Tecnologia e demonstração • Trigonometria – Deslocando e rotacionando objetos • Física – Velocidade, aceleração e desaceleração – Colisão radial • Inteligência Artificial – FSM (Máquina de estados) – Percorrendo um caminho pré-definido – Perseguindo e fugindo do jogador • Referências
  43. 43. Referências • Artificial Intelligence for Games – Ian Millington. Morgan Kaufmann, 2006 • Programming Game AI by Example – Mat Buckland. Wordware Publishing, Inc., 2004 • Real-Time Collision Detection – Christer Ericson. Morgan Kaufmann, 2005 • Real-Time Rendering, 3rd Edition – Tomas Akenine-Möller, Eric Haines, Naty Hoffman. AK Peters, 2008
  44. 44. Referências • Inteligência Artificial - Stuart Russell. Peter Norvig. Elsevier, 2004 • Microsoft XNA Game Studio 3.0 Unleashed - Chad Carter. Sams, 2009
  45. 45. Contato (editado) • André Kishimoto andre@kishimoto.com.br • Rafael Oliveira Martins

×