Arquivos

Posts Etiquetados ‘Física’

[XNA] Lançamento Oblíquo no vácuo

Numa partida de golfe, um jogador bate na bola, inicialmente parada, colocando-a  na em alguma área do campo, próximo ou distânte do buraco. O lançamento oblíquo estuda o movimento de corpos, lançados com velocidade inicial vo da superfície da Terra.

Fonte: http://www.ciencia-cultura.com/Pagina_Fis/vestibular00/vestibular_CinematEscalar010.html

A trajetória é parabólica, como você pode notar na figura acima. Como a análise deste movimento não é fácil, é conveniente aplicarmos o princípio da simultaneidade de Galileu. Veremos que ao projetarmos o corpo simultaneamente no eixo x e y teremos dois movimentos:

  • Em relação a vertical, a projeção da bola executa um movimento de aceleração constante e de módulo igual ag. Trata-se de um (M.U.V.) (lançamento vertical)
  • Em relação a horizontal, a projeção da bola executa um (M.U.).

Exemplo no XNA:

1º passo: Crie um novo projeto (Windows Game) e crie variáveis para armazenar a posição, velocidade, gravidade e textura do objeto.

      //  Informações da bola
      Texture2D texture;
      Vector2 position;
      Vector2 speed;
      // Informação do ambiente
      float gravity;

2º passo: Inicialize a posição do objeto e defina a sua velocidade inicial e a aceleração da gravidade do seu ambiente que será constante, tudo isso dentro do método Initialize()

protected override void Initialize()
{
      // Inicializa a posição da bola
      position = new Vector2(0.0f, 560.0f);
      // Configura o valor da gravidade
      gravity = 700.0f;
      // Configura a velocidade inicial em X e Y
      speed = new Vector2(320.0f, -800.0f);
      base.Initialize();
}

3º passo: Copie a textura abaixo ou outra imagem de sua preferência para você carregar e  aplicar a queda livre

ball.png

protected override void LoadContent()
{
     // Create a new SpriteBatch, which can be used to draw textures.
     spriteBatch = new SpriteBatch(GraphicsDevice);
     // Carrega a textura da bola
     texture = Content.Load<Texture2D>(@"ball");
}

4º passo: Vamos desenhar a imagem na tela

protected override void Draw(GameTime gameTime)
{
     GraphicsDevice.Clear(Color.CornflowerBlue);
     spriteBatch.Begin();
     // Desenha a bola
     spriteBatch.Draw(texture, position, Color.White);
     spriteBatch.End();
     base.Draw(gameTime);
}

5º passo: Para concluir vamos aplicar a fórmula descrita no nosso objeto

protected override void Update(GameTime gameTime)
{
      // Tempo passado desde a ultima atualização
      float time = (float)(gameTime.ElapsedGameTime.TotalMilliseconds / 1000.0f);
      // Atualiza o movimento em X da bola
      position.X += speed.X * time;
      // Ataualiza a posição Y da bola
      // S = So * t + (g * t*t)/2
      position.Y += (speed.Y * time) + (gravity * (float)Math.Pow(time, 2)) * 0.5f;
      // Atualiza a velocidade Y do objeto ( v = vo + g * t )
      speed.Y += gravity * time;
      // Verfifica se atingiu a velocidade máxima é 600.0f
      speed.Y = (speed.Y > 600.0f) ? 600.0f : speed.Y;
      base.Update(gameTime);
}

Com esta rotina é chamada a cada laço do jogo, o que será exibido na tela é um objeto (bola) que inicia no ponto (0, 560) com um velocidade constante horizontal de 320.0f pix/s. No eixo Y a bola sofre a ação da aceleração gravitacional retardando sua velocidade inicial de -800.0 pix/s fazendo com que em algum momento zere sua velocidade e comece uma queda livre.

Após compilar (F5) seu código sem erro é para você obter o seguinte resultado.

Para fazer download do projeto clique aqui.

Abraços e até a próxima

[XNA] Lançamento Horizontal no Vácuo

Quando lançamos um corpo (por exemplo, uma bola de futebol), horizontalmente, de um ponto situado a uma altura h, a cima do solo, ele descreve um arco de parábola até atingir o solo. De acordo com a figura, observamos que, durante o movimento do corpo, a velocidade horizontal de lançamento permanece constante (MRU); mas, à medida que o corpo cai, o corpo vai adquirindo  uma velocidade vertical cada vez maior (MRUV). Na vertical o corpo encontra-se em queda livre , mas na , horizontal o movimento é uniforme.

Fonte: http://www.ciencia-cultura.com/Pagina_Fis/vestibular00/vestibular_CinematEscalar009.html

Assim, um método prático de se estudar esse movimento é decompondo-o em dois movimentos que ocorrem simultaneamente.

  • O movimento horizontal, que é um MRU, com velocidade constante, em que  [ S = v * t ]
  • O movimento vertical, que é um MRUA com aas mesmas equações já vistas (queda livre), ou seja, [ h = (g * t * t) / 2 ]

Fonte: http://www.ciencia-cultura.com/Pagina_Fis/vestibular00/vestibular_CinematEscalar009.html

Exemplo no XNA:

1º passo: Crie um novo projeto (Windows Game) e crie variáveis para armazenar a posição, velocidade, gravidade e textura do objeto.

      //  Informações da bola
      Texture2D texture;
      Vector2 position;
      Vector2 speed;
      // Informação do ambiente
      float gravity;

2º passo: Inicialize a posição do objeto e defina a sua velocidade inicial e a aceleração da gravidade do seu ambiente que será constante, tudo isso dentro do método Initialize()

protected override void Initialize()
{
      // Inicializa a posição da bola
      position = new Vector2(0.0f, 0.0f);
      // Configura o valor da gravidade
      gravity = 700.0f;
      // Configura a velocidade inicial em X e Y
      speed = new Vector2(100.0f, 0.0f);
      base.Initialize();
}

3º passo: Copie a textura abaixo ou outra imagem de sua preferência para você carregar e  aplicar a queda livre

ball.png

protected override void LoadContent()
{
     // Create a new SpriteBatch, which can be used to draw textures.
     spriteBatch = new SpriteBatch(GraphicsDevice);
     // Carrega a textura da bola
     texture = Content.Load<Texture2D>(@"ball");
}

4º passo: Vamos desenhar a imagem na tela

protected override void Draw(GameTime gameTime)
{
     GraphicsDevice.Clear(Color.CornflowerBlue);
     spriteBatch.Begin();
     // Desenha a bola
     spriteBatch.Draw(texture, position, Color.White);
     spriteBatch.End();
     base.Draw(gameTime);
}

5º passo: Para concluir vamos aplicar a fórmula descrita no nosso objeto

protected override void Update(GameTime gameTime)
{
      // Tempo passado desde a ultima atualização
      float time = (float)(gameTime.ElapsedGameTime.TotalMilliseconds / 1000.0f);
      // Atualiza o movimento em X da bola
      position.X += speed.X * time;
      // Ataualiza a posição Y da bola
      // S = So * t + (g * t*t)/2
      position.Y += (speed.Y * time) + (gravity * (float)Math.Pow(time, 2)) * 0.5f;
      // Atualiza a velocidade Y do objeto ( v = vo + g * t )
      speed.Y += gravity * time;
      // Verfifica se atingiu a velocidade máxima é 600.0f
      speed.Y = (speed.Y > 600.0f) ? 600.0f : speed.Y;
      base.Update(gameTime);
}

Com esta rotina é chamada a cada laço do jogo, o que será exibido na tela é um objeto (bola) que inicia no ponto (0, 0) com um velocidade constante horizontal de 100.0f pix/s. No eixo Y a bola sofre a ação da aceleração gravitacional aumentando sua velociadade (queda livre).

Após compilar (F5) seu código sem erro é para você obter o seguinte resultado.

Para fazer download do projeto clique aqui.

Abraços e até a próxima

[XNA] Lançamento Vertical para cima

Este tutorial foi movido para o site Ponto V.

Link para o tutorial:  http://pontov.com.br/site/arquitetura/54-matematica-e-fisica/306-lancamento-vertical-xna

Abraços a todos!

[XNA] Queda Livre

Este tutorial foi movido para o site Ponto V.

Link para o tutorial:  http://pontov.com.br/site/arquitetura/54-matematica-e-fisica/307-queda-livre-xna

Abraços a todos!

CategoriasFísica, Tutoriais, XNA Tags:, , ,

[XNA] Movimento Retilíneo Uniforme Variado (MRUV)

Este tutorial foi movido para o site Ponto V.

Link para o tutorial: http://bit.ly/wW1odI

Abraços a todos!

[XNA] Movimento Retilíneo Uniforme (MRU)

Este tutorial foi movido para o site Ponto V.

Link para o tutorial: http://bit.ly/rBfTX4

Abraços a todos!

[Documentário] Universo Elegante – O Sonho de Einstein

Mais um documentário para vocês, mas agora o documentário é sobre uma pessoa que mudou a maneira de pensar da humanidade durante o século 20, atualizou a teoria de Isaac Newton e de um salto para a física, é dele mesmo que estamos falando, Albert Einstein.

Albert Einstein passou as suas duas últimas décadas na sua modesta casa em Princeton, New Jersey, e no seu segundo andar de estudo, Einstein incansavelmente trabalhou numa única teoria, tão poderosa que descreveria o funcionamento de todo o universo. Convencido que estaria no limite da descoberta mais importante da história da ciência, Einstein ficou sem tempo, e seu sonho incompleto. Agora, quase meio século mais tarde, o objetivo de Einstein de unificar as leis do universo, numa única teoria tornou-se o Santo Graal da Física Moderna. E pensamos que finalmente podemos ter alcançado o sonho de Einstein com um novo e radical conjunto de idéias chamado “Teoria das Cordas“. Mas se esta revolucionária teoria está correta, nós levaremos um grande choque. A teoria afirma que podemos viver num universo onde a realidade se conjuga com a ficção científica, um universo de 11 dimensões, de universos paralelos e um elegante universo composto inteiramente da música das cordas…

Confira este documentário dividido em 7 partes abaixo:

Parte 1:

Parte 2:

Parte 3:

Parte 4:

Parte 5:

Parte 6:

Parte 7:

Abraços, até a próxima.

Referência: http://www.documentarios.org/video/detalhar/499/o_sonho_de_einstein/

[XNA] Movimento de uma flecha ao ser disparado em um jogo 2D

Olá pessoal, estamos desenvolvendo um joguinho que se chama Balloons Buster, baseado nos jogos de atirar nos balões com flechas Balloon Hunter, neste caso estamos fazendo em XNA. Tirando algumas dúvidas nos livros de física e no fórum da Unidev implementei de maneira simples a trajetória de uma flecha ao ser disparada com um determinado ângulo e força de um ponto inicial. Então hoje vamos aprender como isso funciona para vocês verem que não é difícil.

Mas antes de começarmos precisamos entender corretamente o que precisamos fazer, então vamos analisar o imagem abaixo.

Então é o seguinte, precisamos lançar uma flecha com uma determinada força ou velocidade e ela também deve modificar ao longo da trajetória modificar sua orientação. Temos, o vetor V que representa a direção e velocidade que a flecha é disparada. Como obtemos ela.

Decompondo o vetor V em:

vetor.X = velocidade * Cos(θ);

vetor.Y = velocidade * Sin(θ);

Veja a velocidade e o angulo θ (theta) são dados pelo jogador. Como assim, se pensarmos que o jogador quer tentar atingir algo ou um lugar, então ele vai mirar e atirar a flecha com uma força inicial (velocidade e ângulo da mira).

Tendo nosso vetor de direção inicial, precisamos agora somar sempre este vetor a nossa posição inicial, ou seja:

posicao.X = posicao.X + vetor.X;

posicao.Y = posicao.Y + vetor.Y;

Perceba estamos incrementando nossa posição X e Y inicial da flecha, fazendo ela se movimentar. Mas se você analisar você esta somando sempre e a flecha vai seguir o veto como se fosse uma reta. Porém o que queremos é que a flecha perca a velocidade por causa da gravidade do nosso planeta. Se não existisse a gravidade provavelmente se você lançar algo para uma direção, o objeto iria permanecer nesse trajeto até bater em algo. Então precisamos agora diminuir Y.

vetor.Y = vetor.Y – gravidade; (errado para um jogo)

Note que o eixo Y no jogo é inverso ao plano cartesiano que aprendemos na escola, ou seja ao invés de diminuirmos Y, vamos aumentá-lo.

vetor.Y = vetor.Y + gravidade; (correto para o jogo)

Legal, perceba que agora a cada atualização a posição X continua aumentando constantemente e a Y vai diminuindo aos poucos pela ação da gravidade. Mas se pararmos para pensar, nossa flecha esta subindo em direção ao nosso vetor, e aos poucos o Y vai diminuindo fazendo nossa flecha descer, mas nossa flecha continua com a mesma orientação que ela saiu pois não estamos mudando esta orientação. E como vamos fazer isso ?

Utilizando a tangente podemos calcular o ângulo com base em dois pontos num plano cartesiano, ou seja se temos a posição inicial da  flecha e temos a próxima posição, é possível calcular com Atan2 a orientação da flecha.

rotacaoFlecha = Atan2(novaPosicao.Y – posicao.Y, novaPosicao.X – posicao.X);

Agora temos a cada atualização do jogo o calculo da próxima posição da flecha, mais a sua rotação dado a posição passada e a próxima calculada.

Vamos ver como ficaria isso no XNA, então crie um novo programa (LancamentoFlecha), e adicione a imagem abaixo ao seu projeto dentro da pasta Content.

flecha
flecha.png

O Solution do programa é para ficar desta maneira.

solu

Agora vamos definir as variáveis que precisaremos, mas iremos acrescentar também uma resistência no ar contra a flecha para deixar mais real.

O próximo passo é inicializarmos as variáveis que precisamo ser inicializadas, veja com isso deve ficar:

Você deve estar se perguntando o porque de certos valores, não se preocupe, quando você executar o projeto você poderá analisar o que cada valor faz com sua flecha.

Se você colocar um valor alto para a gravidade, sua flecha irá cair muito rápido. Se a velocidade for alta a flecha ira deslocar rapidamente pela tela e você não vai acompanhar o movimento dela. A posição inicial nossa é só para um chute para vermos o movimento. Vale também a pena lembrar que ao usar funções como seno e coseno, os valores usados devem ser sempre em radianos.

O próximo passo é carregar a textura da flecha.

A cada atualização precisamos calcular o próximo ponto, aplicar a gravidade ao vetor Y, verificar a nova orientação da flecha, e aplicar a nova posição a posição dela. Veja como fica:

O valor da resistência do ar neste exemplo é de 0.01f, esse valor deve ser menor que a gravidade, por que se não for, a flecha irá entrar em rotação.

Enfim , só falta desenhar

Vamos entender o porque desse Draw enorme.

SpriteBatch.Draw(Texture2d texture, Vector2 position, Rectangle ? sourceRectangle, Color color, float rotation, Vector2 origin, SpriteEfects effects, float LayerDepth)

Vamos analisar o que fizemo no Draw:

  1. Colocamos nossa texturaFlecha
  2. A posição calculada da flecha
  3. Definimos o tamanho do retângulo da figura, ou seja, definimos que nossa imagem é do tamanho total dela
  4. Colocamos como sempre a cor branca
  5. Aqui vem a orientação calculada pelo Atan2(y,x)
  6. Definimos a partir de qual a figura vai sofre rotação, então colocamos a ponta da flecha
  7. Valor 1 padrão
  8. Definimos sem efeito
  9. Valor 0 para profundidade

Agora é só executar o programa e ver o resultado:

Se você quiser, brinque um pouco com os valores da gravidade, velocidade, ângulo e até mesmo a resistência do ar.

Para fazer download do projeto completo com o código fonte clique aqui.

Agradecimentos especiais a Kamus do Poder e RafaGamer2005 membros da Unidev.

Abraço galera, espero que tenham gostado.

CategoriasFísica, Tutoriais, XNA Tags:, ,
Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Join 29 other followers