Envie Artigos e Concorra a Prêmios
 
Artigos
Article List
Colisao Ray com XNA
Teoria e funcionamento da Estrutura Ray provida pelo XNA FrameWork
Enviado por Luciano José em 1/1/2008 1:13:36

O que é um Raio? 

É uma linha com um ponto descrevendo o inicio dela, e com tamanho infinito.

Um raio é definido por uma direção – essa direção é dada, geralmente, por um vetor normalizado. 

A Estrutura Ray(provida pelo XNA Framework) armazena um raio começando em um ponto no espaço. 


Foto1 - O raio mostrado na foto tem o ponto (0, 0) como origem.
 

A Estrutura Ray possui 2 campos públicos:

Direction – vetor unitário espeficando a direcao que o raio está apontando.

Positionepecifica o ponto inicial do raio.

Foto2 - O ponto vermelho, na foto, indica o ponto inicial do raio.

Para testar intersecção é utilizado o método: Ray.Intersects.

O método Intersects da estrutura Ray retorna um float ou null:

  • Retorna null quando não existe intersecção.
  • Retorna um float representando a distância entre o ponto inicial do raio até o ponto em que intersecta com o “Bounding Volume” ou o “non-Bounding Volume”.

  

Foto3 - O metodo Intersects da Estrutura Ray, quando há intersecção, retorna a ditância como mostrada na figura. O ponto azul mostrado na figura, indica a posição inicial.

A estrutura Ray suporta teste de intersecção com estruturas  que delimitam ou não volume.

Verificação com Bounding Volume: 
  •       BoundingBox
  •       BoundingSphere
  •         BoundingFrustum 

Verificação com Non-Bounding Volume:

  •  Plane 

Fonte consultada:

http://msdn2.microsoft.com/en-us/library/bb313876.aspx?pull=/msdnmag/issues/0300/security/default.asp

 


 

Criando um Prototipo para entendimento da Estrutura Ray e teste de Intersecção

O teste de intersecção que será feito no Prototipo, utilizará teste de intersecção com uma BoundingSphere.

Maiores informações sobre BoundingSphere, veja o link a seguir:

http://www.sharpgames.net/Artigos/Colisao+BoundingSphere+com+XNA.xna

Como funcionará o Prototipo?

Quando houver colisão entre o raio e a esfera, esta ficará tingida de vermelho.

Para demonstrar o inicio do Raio e sua direção, será usado um segmento de reta para melhor compreensão.

Obs.: Como dito anteriormente, um raio tem tamanho infinito, logo o segmento de reta criado é apenas para fins didáticos.

Código:

public class Game1 : Microsoft.Xna.Framework.Game
{
      GraphicsDeviceManager graphics;
      SpriteBatch spriteBatch;
 
      ///
      ///BoundingSphere atribuida a esfera
      ///
      BoundingSphere boundingSphere;      
      
      ///
      /// esfera que será guiada pelo Mouse
      ///
      Texture2D esfera;
      
      ///
      /// a criacao desta variavel se faz necessaria, pelo fato de quando houver
      /// intersecao a esfera ficará tingida de vermelho
      ///
      Color corEsfera;
 
      ///
      /// posicao da esfera
      ///
      Vector2 posicaoEsfera;
      
      ///
      /// Reta que será desenhada representando um segmento de reta do raio;
      /// já que o raio tem tamanho infinito
      ///
      Line line;
 
      ///
      /// Estrutura Ray que define um raio
      ///      
      Ray ray;
 
      ///
      /// spriteFont usado para mostrar dados na tela
      ///
      SpriteFont spriteFont;
      
      ///
      ///variavel utilizada para armazenar o valor da distancia retornada
      ///do metodo de Intersecção da Estrutura Ray
      ///

      float? distancia;

protected override void Initialize()

 {
          // TODO: Add your initialization logic here
 
          this.boundingSphere = new BoundingSphere();
          
          this.corEsfera = Color.White;
 
          //Raio da esfera2
          this.boundingSphere.Radius = 70;
 
          //instanciando um segmento de reta
          this.line = new Line(this);
 
          //Line é um GameComponent, a explicação desta classe está fora do
          //escopo do artigo, apenas entenda que será atribuido a ela um ponto
          //inicial e um ponto final. Com esses 2 pontos, será desenhado um
          //segmento de reta
 
          //O ponto inicial do segmento de reta coincidirá com o ponto inicial
          //do raio. Este segmento de reta será importante para mostrar a nós
          // aonde o raio inicial e como está definida de maneira grafica
          //a sua direção
          this.Components.Add(this.line);         
 
          base.Initialize();

        }

protected override void Update(GameTime gameTime)
{
          // Allows the game to exit
          if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
              this.Exit();
 
          //A esfera sendo guiada pelo ponteiro do Mouse
          this.posicaoEsfera = new Vector2(Mouse.GetState().X,
              Mouse.GetState().Y);
 
          //Definindo o centro da esfera2
          this.boundingSphere.Center = new Vector3(
                this.posicaoEsfera.X + (this.esfera.Width / 2),
              this.posicaoEsfera.Y + (this.esfera.Height / 2),
              0);
          
          //retorna null quando nao há intersecção
          //retorna diferente de null quando há intersecção
          this.distancia = this.ray.Intersects(this.boundingSphere);
          
          //Será mostrado no topo da janela a distancia de intersecção entre
          //o raio e a "BoundingSphere", caso nao haja interseccao
            //nada sera mostrado          
          
          if ( distancia != null)
            {
              //colidiu, a esfera será tingida de vermelho
              this.corEsfera = Color.Red;
            }
          else
            {
              // nao colidiu
              this.corEsfera = Color.White;
            }          
 
          base.Update(gameTime);

}

       ...

Algumas fotos do resultado que pode ser obtido:

Foto 4

Foto 5

Foto 6 - Como dito anteriormente, o segmento de reta é apenas para fins didaticos, como pode ser visto na foto, ocorre intersecção.

Nas fotos 4, 5 e 6 -  a seta vermelha indica a direcao do raio; aonde o raio está apontado.

Sugestão de estudo:

No link a seguir, veja um tutorial de como detectar se o usuario clickou no objeto 3D:

http://msdn2.microsoft.com/en-us/library/bb203905.aspx

 

Código do Prototipo para download (feito com XGS 2.0):  raycollision.zip 69738 bytes

 

Confira um jogo utilizando a Estrutura Ray:

http://www.sharpgames.net/Games/Extensao+do+E+T+Mania.xna


 

Dúvidas, Criticas e Sugestões são bem-vindas.

Obrigado!


Sobre o Autor

???
Não Definido
Não Definido
Ocorreu um erro.
Ocorreu um erro.


Clique para avaliar:

Comentários
" Acho que poderia ficar na sessão de games mesmo e aqui você põe um link para o jogo."
Enviado por Jose Antonio Farias em 3/1/2008 5:44:21:
 
" Jalf, seguindo o seu conselho, eu to tentando fazer um joguinho implementando esse tipo de colisao quando acabar o jogo é pra ser disponibilizado aqui ou na sessao de Games?"
Enviado por lucianoJose em 3/1/2008 5:21:49:
 
" Obrigado Jalf. Eu posso ter entendido errado, mas a colisao de tiros que o senhor fala é aquela usada por exemplo no Gears of War, Halo, etc, em que quando a mira do boneco passa pelo inimigo, ela fica vermelha?

A gente poderia pensar em um "Ray" atribuido a arma e com a mesma direcao em que a arma aponta; usando este tipo de colisao nessa situacao fica bem simples implementar colisao com as outras coisas do mapa, e dizer, por exemplo, se a bala que sai do cano da arma é capaz de atingir o oponente;
essa capacidade que a bala tem de atingir ou nao é dada quando o Raio de tamanho infinito, etc, colide com outro objeto, e esse objeto sendo instancia de inimigo consequentemente a mira fica vermelha.
"
Enviado por lucianoJose em 3/1/2008 5:17:09:
 
" Excelente luciano, mas seria mais legal ainda se você desse um exemplo para um jogo. Isso poderia ser aplicado para colisão de tiros, por exemplo?"
Enviado por Jose Antonio Farias em 1/1/2008 16:34:36:
 

Adicione seu Comentário
juegos gratis
PrêmiosMinimizar

Envie um artigo para o Sharpgames, colabore com a comunidade e fique famoso! Clique aqui e saiba mais.

Logos do XBox 360, XNA e Games For Windows
Copyright 2010 por SharpgamesPolítica de Privacidade  |  Termos de Uso