Vous êtes sur la page 1sur 8

Artigo: Gravidade

Por:Edgar Roman

Introdução
A informação contida no documento permitirá simular realisticamente manobras interestelares e
saltos.
O propósito deste documento é entender a física do mundo em que vivemos e aplicar física no
seu jogo. Não daremos a você rotinas otimizadas para seu programa, que é o seu trabalho! Mas
se você entender como as coisas funcionam, será muito mais fácil.
Básico
Há alguns termos chaves que definirei para ter certeza que estamos falando sobre as mesmas
coisas:
Distância Caminho total da viagem.
Deslocamento Diferença entre a posição original e a posição final.
Velocidade(speed) Mudança no deslocamento dividido pela mudança no tempo
Velocidade(velocity) Direção da viagem e velocidade da viagem.
Aceleração Mudança na velocidade dividida pela mudança de tempo
Nota: aquele deslocamento, velocidade e aceleração são na verdade vetores de quantidade. (Isto
é, tem uma direção e magnitude.).
Abreviaturas:

a Aceleração
M Massa
s Deslocamento
s0 Deslocamento inicial
t Tempo
v Velocidade
v0 Velocidade inicial
Unidades:
m Metro (unidade de comprimento)
m/s Metro por segundo (unidade de velocidade)
m/s^2 Metro por segundo quadrado (unidade de aceleração)
N Newtons (unidade de força)
s Segundo (unidade de tempo)

Os Conceitos
Imagine uma espaçonave viajando pelo espaço a 1000 m/s. Ela está bem no espaço interestelar
sem nada ao redor dela. Quais forças estão agindo sobre ela? A resposta: nenhuma!
Ela continuará a voar pelo espaço a 1000 m/s para sempre se nenhuma força agir sobre ela.
A ÚNICA razão porque os objetos mudam a velocidade (direção e/ou velocidade) é se uma força
for aplicada a ela.
O que é uma força, você pergunta? Uma força é um empurrão ou um empuxe externo. Uma força
é também um vetor. Ele tem uma magnitude e uma direção associadas com ele. Neste momento a
gravidade está exercendo uma força sobre você: ela está puxando você em direção ao centro da
terra.
Também, a única razão que um objeto modificará o deslocamento é se tiver alguma velocidade.
Suponha agora, que a mão de Deus começa a empurrar a espaçonave para frente. Há agora uma
força aplicada a nave. Com qualquer força aplicada, uma aceleração é induzida. Com nossa nova
aceleração, a velocidade começa a aumentar. Se Deus não parar de empurrar a nave, então logo a
nave irá muito rápida!
Olhe, só quero fazer meu cara pular.
Ok, estou chegando nisto. Temos o nosso cara de salto, o Joe. A posição inicial de Joe é sobre o
solo ou plataforma que não está se movendo. O usuário pressiona a tecla e Joe deve saltar no ar.
Você precisa ter em mente três coisas sobre o Joe: sua posição, velocidade e aceleração.
Inicialmente, a posição dele será no solo. Uma vez que a tecla foi tocada, simplesmente damos
ao Joe uma velocidade muito rápida em direção ascendente. Depois, a cada
quadro/segundo/atualização/ou qualquer coisa que seja, diminui a velocidade ascendente por
uma quantidade constante. É isto!
A diminuição constante é na verdade uma aceleração na direção decrescente. O movimento
horizontal do Joe é sem efeito. Assim, enquanto o Joe está voando pelo ar, você pode modificar o
movimento dele para frente e para trás como normal.
Nota: na vida real, é impossível mover-se para frente e para trás quando pulamos reto para
cima. Mas descobri jogos que permitem o movimento para frente e para trás enquanto pula,
mais jogável e divertido do que pular só para cima. E quem disse que os jogos são realistas de
qualquer maneira?
Qual deveria ser a aceleração que estamos aplicando? Na terra, a aceleração de Joe será de 9.81
m/s^2 na direção decrescente. Infelizmente, metros por segundo quadrado não significam nada
para o computador. A aceleração deve ser determinada baseada na taxa de atualização do jogo.
Geralmente, adivinhar é a melhor maneira para alcançar isto.
Assim nosso pseudo-código é:
Joe.pos.y = 0; (Ou onde quer que o solo esteja)
Joe.vel.y = 0;
Joe.accel = 10;
Joe.jumping = NO;

Loop
If (a tecla de salto é pressionada)
{
Joe.vel.y = 100;
Joe.jumping = YES;
}

if (Joe.jumping == YES) /* Mova o Joe se estamos saltando*/


{
Joe.vel.y = Joe.vel.y - Joe.accel
Joe.pos.y = Joe.pos.y + Joe.vel.y
}

if (Joe.pos.y <= 0) /* Veja se Joe atingiu o solo */


{
Joe.vel.y = 0;
Joe.jumping = NO;
}
End Loop

Para a primeira vez a tecla de salto é pressionada, a posição do Joe repentinamente saltará do
solo.
Conforme ele sobe mais alto, Joe começa a baixar porque a velocidade é constantemente
diminuída. Joe finalmente vai parar de movimentar-se e começar a mover-se para baixo. Ele vai
se mover mais rápido até alcançar o solo novamente.
A velocidade e posição do Joe na direção y no final de cada rodada vai aparecer assim:
Loop0 : Joe.vel.y = 0 Joe.pos.y = 0
Loop1 : Joe.vel.y = 100 Joe.pos.y = 100
Loop2 : Joe.vel.y = 90 Joe.pos.y = 190
Loop3 : Joe.vel.y = 80 Joe.pos.y = 270
Loop4 : Joe.vel.y = 70 Joe.pos.y = 340
Loop5 : Joe.vel.y = 60 Joe.pos.y = 400
Loop6 : Joe.vel.y = 50 Joe.pos.y = 450
Loop7 : Joe.vel.y = 40 Joe.pos.y = 490
Loop8 : Joe.vel.y = 30 Joe.pos.y = 520
Loop9 : Joe.vel.y = 20 Joe.pos.y = 540
Loop10: Joe.vel.y = 10 Joe.pos.y = 550
Loop11: Joe.vel.y = 0 Joe.pos.y = 550
Loop12: Joe.vel.y = -10 Joe.pos.y = 540
Loop13: Joe.vel.y = -20 Joe.pos.y = 520
Loop14: Joe.vel.y = -30 Joe.pos.y = 490
Loop15: Joe.vel.y = -40 Joe.pos.y = 450
Loop16: Joe.vel.y = -50 Joe.pos.y = 400
Loop17: Joe.vel.y = -60 Joe.pos.y = 340
Loop18: Joe.vel.y = -70 Joe.pos.y = 270
Loop19: Joe.vel.y = -80 Joe.pos.y = 190
Loop20: Joe.vel.y = -90 Joe.pos.y = 100
Loop21: Joe.vel.y =-100 Joe.pos.y = 0
Observe que Joe está indo rápido demais quando ele atinge o solo. Se Joe não atingir o solo, ou o solo desaparecer
(isto é, ele pulou fora da plataforma), então finalmente Joe estará indo rápido demais.

Precisamos dar a ele uma velocidade limitante. Esta é a velocidade mais rápida que Joe pode atingir ao cair. Na vida
real isto é causado pela resistência do ar. Isto é muito fácil de se fazer.

O pseudo-código modificado é:
Joe.pos.y = 0; (Ou onde quer que o solo esteja).
Joe.vel.y = 0;
Joe.accel = 10;
Joe.jumping = NO;

Loop
if (a tecla de salto é pressionada)
{
Joe.vel.y = 100;
Joe.jumping = YES;
}

if (Joe.jumping == YES) /* Mova o Joe se estamos saltando


*/
{ if (Joe.vel.y >-100) /* O limite da velocidade de Joe é -100 */
{
Joe.vel.y = Joe.vel.y - Joe.accel
Joe.pos.y = Joe.pos.y + Joe.vel.y
}
}

if (Joe.pos.y <= 0) /* Veja se Joe atingiu o solo */


{
Joe.vel.y = 0;
Joe.jumping = NO;
}
End Loop

A rodada adicionada não diminuirá a velocidade de Joe se ele já estiver se movendo para baixo na velocidade de –
100. Então nós adicionamos a velocidade limite dele.

Outras Dimenções
Ok, o exemplo acima está todo bom e bem, mas algumas sprites de game não vão apenas para cima e para baixo.
Algumas vão para os lados enquanto estão saltando.
Fácil! Só acontece que os valores x e y de velocidade e aceleração são independentes! Assim, enquanto você resolve
a posição e velocidade y de Joe, você pode movê-lo na direção x normalmente.

Vai parecer que o Joe segue um caminho parabólico, que é o que ele seguiria no mundo real.

O jogo vai para 3 dimensões. As velocidades e acelerações x, y e z são todas independentes umas das outras.

O homem do espaço atraente. (Spaceman Spiff)


Um outro exemplo onde a cinemática se aplica é um jogo tipo asteróide. Você voa em um meio ambiente com
gravidade zero, mas pode impulsionar-se para qualquer direção a frente.

Neste caso a gravidade não é um fator. O que usamos então? Usamos a impulsão da espaçonave como nossa
aceleração. Simplesmente dissolvemos nosso vetor de aceleração em direções x e y, e aplicamos as mesmas técnicas
anteriores.

Para implementar isto conseguimos o pseudo-código:


pos.x = 0; pos.y = 0;
vel.x = 0; vel.y = 0;
acc.x = 0; acc.y = 0;

Loop
if (tecla de impulsão pressionada)
{
resolve_direction_vector;
acc.x = scale_x * 10;
acc.y = scale_y * 10;
}

vel.x = vel.x + acc.x;


vel.y = vel.y + acc.y;

pos.x = pos.x + vel.x;


pos.y = pos.y + vel.y;
End Loop

Agora temos um passo que não tínhamos visto antes: resolve_direction_vector. Precisamos disto porque a nave
pode mover-se em qualquer direção. O que este passo consegue fazer é alcançar os vetores de direções apropriados e
dissolvê-los em um vetor x e um vetor y. Uma vez dissolvidos, o passo resolve_direction_vector vai se posicionar
scale_x and scale_y.

/^
Vetor de / |
aceleração / |
original / |
/ |
/ | vetor Y
/ |
Posição / * |
Inicial -> X------->|
Vetor X
* = ângulo da nave medida do eixo x
Dado um ângulo para nossa direção de 0 até 365, podemos determinar as variáveis da escala x e da escala y. Há
várias maneiras de fazer isto, mas uma maneira fácil (não otimizada) é usar o gatilho:
scale_x = cos(angulo);
scale_y = sin(angulo);

As funções gatilho cuidarão dos valores negativos. Isto é, se a espaçonave estiver direcionada para Oeste (ângulo =
180 graus), os valores para a escala _x e para a escala_y: a escala_x = -1; a escala _y = 0; e nossa espaçonave vai
acelerar na direção x negativa.

Que tal se a espaçonave estiver apontada para uma direção nordeste (ângulo = 45)? Nós conseguimos:

scale_x = .707
scale_y = .707

O que significa que a nave está acelerando em 7.07 na direção y e, em 7.07 na direção x. A ilusão que você vê a
nave acelerar em 10 em uma direção de 45 graus.

Você vai querer limitar a velocidade máxima da nave, ou mais adiante ela estará logo indo mais rápido do que o
usuário possa ver.

Se você quiser, algumas pessoas gostam de um campo alagado. Isto significa finalmente que a nave diminui por si
mesma. Para fazer isto, simplesmente diminua a velocidade para zero a cada rodada. (exemplo, se a velocidade for
positiva, subtraia; se a velocidade for negativa, adicione).

As equações REAIS
Esta parte explica as equações reais. Se você desejar fazer algumas cinéticas mais complexas, esta parte vai dar a
você tudo que você precisa para resolver as equações. Senão, então o texto anterior está repleto de aplicações. Para
maiores explicações, consulte um livro de física básico.

Definimos três teclas variáveis com respeito a um objeto: deslocamento, velocidade e aceleração.

A força está relacionada a aceleração na seguinte maneira: (eventualmente, a segunda lei de movimento de Newton)

F=M*a

Em português: Forças igual a massa vezes aceleração.

Assim, no nosso exemplo da espaçonave, a mão de Deus pode causar uma pequena interdição com pouca massa
para acelerar mais rápida que um enorme zero aterrorizante com muita massa.

A relação entre deslocamento, velocidade e aceleração é:

s = s0 + v0*t + 0.5*a*t^2

O deslocamento real é igual ao deslocamento inicial, mais a velocidade vezes o tempo, mais metade vezes a
aceleração vezes o tempo ao quadrado.

v = v0 + a*t

A velocidade real é igual a velocidade inicial mais a aceleração vezes o tempo.

v^2 - v0^2 = 2*a*s

A velocidade real ao quadrado menos a velocidade inicial é igual a duas vezes a aceleração vezes o deslocamento.

Com estas 4 equações mágicas, quase todos os problemas de movimento na física podem ser resolvidos.

Estas equações são todas baseadas na aceleração constante (que se encaixa bem com a maioria das aplicações do
computador)
Como estas equações funcionam?
Vamos atirar uma bola em direção ao alto. Isto é uma situação de uma dimensão, porque a bola está somente
subindo ou descendo. Vamos tomar a posição s0 para ver onde jogamos a bola para cima no ar. Já que temos uma
posição inicial, vou estar referindo ao deslocamento real da bola conforme a posição. O termo posição será uma
referência de s0.

Ok, então atiramos a bola para cima no ar. O instante que liberamos a bola (t = 0) nós sabemos:

s0 = 0;
v0 = 10 m/s na direção para cima (cerca de 22 milhas por hora)
a=?

Hmm. Qual é a aceleração? Para qualquer objeto próximo da superfície da terra, a força devido a gravidade pode ser
encontrada com :

Fg = M*g

Onde M é a massa e g é a constante gravitacional. Para a terra, g = 9.81 m/s^2.

Um pouco de matemática agora. Combine Eqns 1 & 5

Fg = M*a -> M*g = M*a -> g = a

Oba! As massas parecem ter cancelado! Isto é interessante. Para qualquer objeto que esteja caindo, a aceleração não
é afetada pela massa. Isto significa que um hipopótamo cairá tão rápido quanto uma bola de ping-pong? Sim, eles
irão. No vácuo. Mas eu discordo...

Assim, a aceleração da bola é igual a g, ou 9.81 m/s^2. Mas a aceleração está na direção decrescente. Assim
dizemos que a = -g

Usando Eqn 3, obtemos:

v = v0 + a*t = 10 m/s + (-9.81 m/s^2) * 0 s = 10 m/s.

Se usarmos Eqn 2, também obtemos s = 0. Ótimo não?

Vamos dar uma olhada em 0.5 segundos mais tarde:

v = 10 + (-9.81) * 0.5 s = 5.1 m/s

A bola diminuiu, o que é o que esperávamos. Finalmente ela parará. Para descobrir isto, simplesmente posicionamos
v = 0 e resolvemos para t.

v = 0 = 10 + (-9.81) * t

Resolvendo para t, encontramos t = 1.019 segundos. Depois de 1.019 segundos atiramos a bola para cima, ela pára
no meio do ar.

Ok, sabemos que ela pára, mas onde ela está? Para descobrir isto, usamos Eqn 2:

s = 0 + 10 * 1.019 + 0.5 * (-9.81) * 1.019^2 = 5.1 metros

Isto é 5.1 metros acima do ponto onde a liberamos.

O que sobe deve descer, mas em que velocidade? Qual a velocidade que nossa bola vem quando a pegamos?
Quando pegamos a bola, sabemos que s = 0. Assim, usamos Eqn 4. Depois de alguns cálculos, descobrimos v = sqrt(
v0^2 ). Isto é fácil não? v = v0. Bem…de uma certa forma sim.
Na realidade, há duas soluções para esta equação: +v0 e -v0. O que isto significa? Significa que sempre que a bola
estiver na posição s = 0, ou ela vai subir a v0 ou descer a v0. Já que sabemos que vai subir quando a atiramos, deve
estar descendo na mesma velocidade.

A última coisa que descobrimos é qual a hora que ela vem:

v = -v0 = v0 + (-9.81) * t

Resultado: t = 2.038 segundos. Se atirarmos uma bola para cima a 10 m/s, então 2.038 segundos mais tarde,
descobrimos a mesma bola na nossa mão.

Esta parte foi apenas para mostrar como as equações funcionam. No programa atual, você simplesmente não
abandona estas equações porque você teria que manter o valor de t para cada objeto. A cada vez que alguém saltava,
você resetaria aquele objeto que é pessoal t.

Hasta La Vista, babies Bem, é isto. Espero que isto dê a você informação suficiente para iniciar.

Se você tem perguntas, sugestões, esclarecimentos e qualquer outra modificação, por favor, me escreva.

Tradução:Geovana Golin

© 2000-2001 - Copyright Informaster Software


Todos direitos reservado

Vous aimerez peut-être aussi