A Matemática nos Games – Velocidade e Aceleração

Olá gurizada,

Hoje daremos continuidade ao nosso arco de posts sobre a matemática nos games. No epsisódio anterior, vimos como utilizar a rotação de ponto em um game de corrida top down (Super Sprint). Neste episódio vamos um pouco além da proposta orginal, adentrando em uma outra área de conhecimento que, apesar das semelhanças, é uma ciência a parte. Estamos falando da “temida” Física. Mas não se preocupe, os seus pesadelos do ensino médio, não estarão de volta :)


Bom, precisamos finalizar o nosso protótipo do Super Sprint, certo? Para isso, precisamos implementar uma feature muito importante para um game de carro, a Aceleração. Se pesquisarmos em nossos alfarrábios, veremos que aceleração é variação de velocidade de um corpo em um determinado intervalo de tempo. O resultado esperado seria o carrinho levar algum tempo para atingir sua velocidade máxima, em seguida, desacelerando gradativamente. Para isso, criaremos uma variável acceleration que será aplicada ao ponto rotacionado do nosso exemplo anterior. Ela funcionará como um acréscimo/decréscimo percentual ao ponto de destino. Observe o trecho de código genérico com comentários a seguir:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//Novas variáveis
var acceleration:Number=1;
var accelerrationLimit:Number = 1.5;
var deceleration:Number=0.08;
 
function onUpdate(event:Event)
{
	if(left)
		angle -= angleVariation;
	if (right)
		angle += angleVariation;
	if(up)
	{
		newPoint = getNextPoint(angle,velocity);
                //removemos a movimentação do carro deste ponto
		//car.x += newPoint.x;
		//car.y += newPoint.y;
 
              // Se aceleração não estiver no limite, incrementa
              if(aceleration <= acelerrationLimit)
			aceleration += 0.1;
	}
 
        // A moviemntação do carro fica fora do IF, sendo acionada agora a todo looping do game.
	car.x += newPoint.x * acceleration;
	car.y += newPoint.y * acceleration;
 
	//Em todo looping decrementa a aceleração não permitindo que esta seja negativa
        acceleration -= deceleration;
	if(acceleration < 0)
		acceleration = 0;
 
	if(angle < 0 )
            angle = 360 + angle;        
        else if(angle > 360)
		angle = 0;
 
	car.rotation = angle;
	tAngle.text = "ângulo: "+angle
}

Com esta pequena alteração, já teremos um resultado interessante. Perceba que agora o carro acelera gradativamente e, mesmo depois de soltar o acelerador (seta para cima), ele simula um efeito de desaceleração e inércia.

Bom, com a aceleração já implementada, partimos para a velocidade. A física descreve a velocidade uniforme como distância/tempo. Simples não? Mas, temos que ter uma atenção para a distância em um espaço 2D. Para calcularmos esta reta não podemos apenas diminuir os pontos. Observe na figura a seguir como duas retas de mesmo tamanho podem parecer diferentes dependendo de sua angulação.

Para solucionar este problema precisamos utilizar a nossa velha amiga trigonometria. A solução chama-se cálculo da reta, e para entendê-lo basta lembrarmos do post passado, onde mostrei que seria possível enxergar uma triângulo retângulo entre os pontos. Sendo assim, podemos identificar: Cateto oposto (ao ângulo), cateto adjacente (ao ângulo) e a hipotenusa. Estes três fazem parte de uma fórmula bastante conhecida:

(hipotenusa)² = (catetoOposto)² + (catetoAdajscente)²

Queremos encontrar exatamente o valor da hipotenusa, correto? É ela que corresponde ao tamanho da reta entre os dois pontos, ou seja, a nossa distância. Isolando a variável, ficamos com:

hipotenusa = Raiz Quadrada de (catetoOposto)² + (catetoAdajscente)²

Com esta fórmula em mãos, já temos todas as ferramentas, basta partir para o código. Vamos lá

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
var acceleration:Number=1;
var accelerrationLimit:Number = 1.5;
var deceleration:Number=0.08;
 
//Novas variáveis
var distance:Number;
// ponto utilizado no cálculo da distância, armazenando a posição anterior do carro
var lastPoint = new Point(car.x,car.y);
// tempo utilizado no cálculo da velocidade, armazenando os milisegundos entre um pulso e outro
var lastTime:Number = new Date().time;
 
function onUpdate(event:Event)
{
         //Melhoria que permite girar o carro apenas quando houver aceleração
	if(acceleration!=0 && left)
		angle -= angleVariation;
	if (acceleration!=0 && right)
		angle += angleVariation;
	if(up)
	{
		newPoint = getNextPoint(angle,velocity);
 
		// Se aceleração não estiver no limite, incrementa
		if(acceleration <= accelerationLimit)
			acceleration += 0.1;
	}
 
	car.x += newPoint.x * acceleration;
	car.y += newPoint.y * acceleration;
 
	acceleration -= deceleration;
 
        if(acceleration < 0)
	{
		acceleration = 0;
                tVelocity.text = "velocidade: 0";
	}
 
	if(angle < 0 ) 		
          angle = 360 + angle; 	
       else if(angle > 360)
	  angle = 0;
 
	car.rotation = angle;
	tAngle.text = "ângulo: " + angle;
 
        // Calcula a distancia através do novo método criado.
	distance = calcDistance(lastPoint, new Point(car.x,car.y));
 
        // Só calcula a velociadade se a distância for superior a 10px. Isso evita que o cálculo seja executado a todo momento, deixando o indicador da tela ilegível.
	if(distance > 10)
	{
                 // Atribui a caixa de texto a distancia dividida pelo tempo percorrido. Dividimos o resultado por 1000 para obtermos a unidade pixels/seg.
		tVelocity.text = "velocidade: " + Math.round(distance/( (new Date().time-lastTime) / 1000 ));
		lastTime = new Date().time;
		lastPoint = new Point(car.x,car.y);
	}
 
}
 
function calcDistance(point1:Point, point2:Point)
{
	//calcula o tamanho do cateto adjascente
        var adjoiningSide:int = Math.abs(point1.x - point2.x);
	//calcula o tamanho do cateto oposto
	var oppositeSide:int = Math.abs(point1.y - point2.y);
	return Math.sqrt(Math.pow(adjoiningSide,2) + Math.pow(oppositeSide,2));
}

Vejam como ficou o resultado final.

O que achou do segundo post sobre matemática? Experimente modificar os valores iniciais de aceleração para obter outros resultados. No próximo veremos um importante conceito chamado Vetores. Não, não confunda com o Objeto de programação similar ao Array, esse vem da matemática ;)

Até mais e não esqueçam de deixar seus comentários com dúvidas ou sugestões de código.

Autor: Everton Vieira Ver todos os posts de
Sou Bacharel em Análise de Sistemas pela Universidade Católica de Pelotas (UCPel) no ano de 1999. Minha paixão por games é de longa data. Porém, em 2003 tornei essa paixão uma profissão. Durante oito anos atuei como Game Designer e Arquiteto de Software em mais de 30 projetos de Serious Games (simuladores) para grandes empresas do país. Atualmente sou sócio-fundador da Izyplay Game Studio, onde exerço o cargo de Diretor de Criação. Além do envolvimento corporativo, também participei da organização da Pós Graduação em Arquitetura e Desenvolvimento de Jogos Digitais na FATEC SENAC Pelotas. Minha área de interesse e especialização é Game Design e Inteligência Artificial.

12 Comentários em "A Matemática nos Games – Velocidade e Aceleração"

  1. Bruno Rafante 18/10/2011 at 14:18 - Reply

    Opa, tudo bem pessoal da AoJ?
    Andei meio sumido tava aprendendo Java e Android (já aprendi =D)
    Bom eu achei o tópico muito bacana até porque já havia comentado no anterior sobre o mesmo assunto o quanto eu gosto de demonstrar para leigos a vantagem de aprender matematica (e física)
    A pergunta que eu gostaria de fazer aqui não tem muito a ver com este tópico, mas como acredito que o tópico certo já está meio antigo para ser averiguado por vocês gostaria de saber (não sei se vocês sabem) se quando eu disponibilizo um App no AndroidMarket ele fica disponível para todos os países ou apenas para brasileiros e também para saber se vocês sabem onde eu posso verificar o CPC (custo por click) do adMob
    Obrigado gente
    Um grande abraço

    • everton.vieira 19/10/2011 at 14:39 - Reply

      Olá Bruno,
      O pessoal está realmente gostando dos posts sobre matemática. Acho que estamos conseguindo desmistificar um pouco este tema. Estamos muito contentes com os feedbacks. Outros virão com certeza.
      Em relação ao seu comentário sobre Android, peço que comente o post sobre este tema aqui. Respondemos todos os comentários, independente da data do post, fique tranquilo. Neste caso, ainda contamos com a participação do Thiago Rosa, que possui bastante experiência no assunto.

  2. Lucas Teixeira 23/10/2011 at 11:24 - Reply

    Olá, Everton.

    Muito legal esse post sobre o uso da cinemática no desenvolvimento de jogos. Quanto mais o tempo passa mais me convenço que é um assunto essencial para quem trabalha com jogos ou até mesmo só com front-end.
    Ficou excelente! Parabéns pela iniciativa. :)

    Abraços

    • everton.vieira 23/10/2011 at 17:50 - Reply

      Olá Lucas,

      Valeu pelo apoio. Teremos outros posts deste assunto em breve ;)

  3. José Luiz 16/03/2013 at 19:31 - Reply

    Olá pessoal, fico feliz em saber que nós, brasileiros e quarto maior mercado de games do mundo estamos começando a aprender a arte de fazer jogos e a de ensinar a fazê-los tambem, embora engatinhando, eu acho no processo. mas gostaria que vc publicassem materias de matematica sobre vetores, dot product. se puderem fazer isso agradeço.
    Valeu pelo trabalho, até mais.

    • Everton Vieira 17/03/2013 at 20:02 - Reply

      Olá José Luiz,
      Sua sugestão está anotada ;)

  4. Cristiano 19/03/2016 at 15:54 - Reply

    Olá Everton, sou professor e pesquisador d matemática aplicada aos jogos digitais e gostaria de citar e utilizar esse seu exemplo em meu material. Estou organizando para pleitear uma publicação de livro para cursos de Graduação em Jogos Digitais. Posso citá-lo e apresentar seu exemplo?
    fico no aguardo
    Cristiano Toneis

    • Everton Vieira 04/04/2016 at 20:59 - Reply

      Olá Cristiano! Desculpe a demora!

      Claro! Fique a vontade de usar todo e qualquer material do site. ;)

  5. Carlos Oliveira Lima Júnior 07/05/2016 at 00:16 - Reply

    Everton no curso de jogos digitais eu aprendo matemática e física juntos ou não

    • Everton Vieira 11/07/2016 at 09:23 - Reply

      Olá, Carlos!
      Desculpe a demora.
      Depende muito do curso que você irá fazer. Mas, normalmente estas duas áreas são, ou deveriam ser, muito abordadas. Dê uma olhada na grade curricular do curso antes ;)

  6. João Paulo 16/07/2016 at 14:29 - Reply

    Oi, boa tarde, Everton.

    Vi o site e curti muito,e como está por dentro do assunto dos games gostava de saber se tem como me ajudar.

    Sou de Goiânia e tenho uma ideia para criar um game em realidade aumentada, o q me aconselha a fazer já que eu não sei programar???Como se conseguiria formar uma equipe com interesse em virar sócios para por o jogo no ar???Será que tem como você me ajudar, com algum conhecido seu, ou até quem sabe você mesmo???

    Obrigado desde já e fico no aguardo da sua muito importante resposta.

    Att.

    JPaulo

    • Everton Vieira 05/11/2016 at 11:37 - Reply

      Olá, João Paulo!
      Você pode encontrar programadores ou empresas de games em fóruns ou até em site de Jobs como o http://www.gamesjob.com.br/ ;)

Deixar um Comentário