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. Position – epecifica 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: 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çãoO 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! |