Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 3

Decomposição Vetorial com Trigonometria

Recommended resources

Olá! Na nossa aula anterior, mergulhamos no círculo unitário e vimos como ele nos fornece uma definição poderosa para seno e cosseno, aplicável a qualquer ângulo. A ideia central que você deve guardar é que, para qualquer ângulo , as coordenadas do ponto correspondente no círculo de raio 1 são .

Nesta lição, vamos dar um passo extremamente prático e aplicar esse conhecimento. O nosso objetivo é aplicar as funções trigonométricas para decompor um vetor de direção em componentes x e y. Este é um dos pilares do que faremos mais adiante. Para que o nosso jogador se mova em uma direção ou para que possamos "lançar" um raio em um ângulo específico, precisamos traduzir essa direção angular em um deslocamento nos eixos x e y do nosso mapa 2D. A trigonometria será a nossa ferramenta para fazer essa tradução.

Vetores, Direção e Componentes

Em física e computação gráfica, um vetor é uma entidade que possui tanto magnitude (tamanho ou intensidade) quanto direção (o ângulo para onde aponta). Pense na velocidade de um carro: 50 km/h (magnitude) para nordeste (direção).

No nosso projeto de raycasting, representaremos a posição e a direção do jogador usando vetores. A direção em que o jogador está olhando será um vetor. Quando ele se move, adicionamos um vetor de deslocamento à sua posição atual.

Para que o computador possa trabalhar com esses vetores, é muito mais fácil representá-los não por sua magnitude e ângulo, mas por suas componentes cartesianas: um valor para o eixo x e um valor para o eixo y. Decompor um vetor significa exatamente isso: pegar um vetor diagonal e descobrir "o quanto" dele aponta na direção horizontal (x) e "o quanto" aponta na direção vertical (y).

O vídeo a seguir, do canal "Felipe Sampaio - Física", introduz essa ideia de forma muito clara. Ele apresenta a decomposição como a operação inversa da soma de vetores, que é uma ótima maneira de pensar sobre o assunto.

DECOMPOSIÇÃO DE VETORES - Explicação com Exemplos

Este vídeo introduz a decomposição de vetores de uma forma bastante intuitiva, explicando por que precisamos quebrar um vetor em suas partes x e y.

Assista ao trecho inicial que explica o conceito de decomposição. O apresentador descreve a decomposição como o ato de pegar um vetor na diagonal e quebrá-lo em uma parte "em pé" (eixo y) e outra "deitada" (eixo x).


A Matemática da Decomposição

Como podemos calcular os valores exatos dessas componentes? A resposta está no triângulo retângulo que o vetor forma com os eixos.

Esta imagem da NASA ilustra perfeitamente a decomposição. O vetor \(\vec{a}\) tem uma magnitude \(|a|\) e uma direção \(\phi\). Suas componentes, \(a_x\) e \(a_y\), são as projeções do vetor nos eixos X e Y. Observe como elas formam um triângulo retângulo com o vetor original como hipotenusa.

Olhando para o triângulo retângulo na imagem, podemos usar as definições básicas de seno e cosseno que você já conhece (SOH-CAH-TOA):

  • Cosseno = Cateto Adjacente / Hipotenusa
  • Seno = Cateto Oposto / Hipotenusa

Essas são as fórmulas fundamentais para a decomposição de vetores. A componente x está associada ao cosseno do ângulo, e a componente y está associada ao seno.

O recurso a seguir, do site Physics LibreTexts, formaliza essas equações.

3.4: Coordinate Systems and Components of a Vector (Part 1)

Este artigo apresenta as fórmulas de decomposição de forma rigorosa.

Navegue até o parágrafo que começa com a frase "Let us return to the right triangle...". Leia esta seção, que apresenta as equações para A_x e A_y. Note que o texto usa A para magnitude e \theta_A para o ângulo, mas a lógica é idêntica à que vimos.

Agora, vamos assistir ao restante do vídeo do Felipe Sampaio, onde ele aplica exatamente essas fórmulas em dois exemplos práticos. Preste atenção em como ele identifica o cateto oposto e o adjacente para decidir se usa seno ou cosseno.

DECOMPOSIÇÃO DE VETORES - Explicação com Exemplos

O vídeo agora mostra a aplicação prática do seno e cosseno para encontrar os valores numéricos das componentes.

Assista ao primeiro exemplo, onde uma força de 10N é decomposta. Em seguida, veja o segundo exemplo com um vetor de velocidade. A repetição ajudará a solidificar o processo.


O Caso Especial: Vetores de Direção (Vetores Unitários)

No nosso raycaster, muitas vezes estaremos interessados apenas na direção, não na magnitude. Por exemplo, a direção para a qual o jogador está virado. Nesses casos, usamos um tipo especial de vetor chamado vetor unitário — um vetor cuja magnitude é exatamente 1.

A beleza de um vetor unitário é que as fórmulas de decomposição se simplificam enormemente:

  • Componente x:
  • Componente y:

Isso nos leva de volta à aula anterior! As componentes x e y de um vetor de direção unitário são simplesmente o cosseno e o seno do seu ângulo. O vetor de direção pode ser escrito como .

Esta imagem mostra um vetor unitário \(\hat{v}\) em um círculo unitário. Como o raio (magnitude) é 1, suas componentes são diretamente \(\cos\theta\) e \(\sin\theta\), que são as coordenadas do ponto na circunferência do círculo.

Sebastian Lague, um desenvolvedor de jogos muito conhecido, tem um vídeo excelente que demonstra essa ideia no contexto de programação de jogos.

Introduction to Game Development (E22: trigonometry)

Este vídeo conecta a teoria do círculo unitário diretamente à prática da programação de jogos, mostrando como obter um vetor de direção a partir de um ângulo.

Assista à explicação inicial, que mostra como um vetor unitário em um ângulo \theta tem as componentes (\cos\theta, \sin\theta). Em seguida, pule para a demonstração de código. Ele está usando Unity (C#), mas a lógica é universal: ele cria um vetor de direção usando Math.Cos() e Math.Sin(). Observe um detalhe importante: as funções trigonométricas em quase todas as linguagens de programação, incluindo Python, esperam o ângulo em radianos, não em graus. Ele mostra a conversão multiplicando por Mathf.Deg2Rad, que é uma constante igual a \pi/180.


Resumo Prático para o Raycasting

Vamos consolidar tudo. No seu projeto de raycasting, você terá:

  1. A Posição do Jogador: Um vetor de posição, pos = (posX, posY).
  2. A Direção do Jogador: Um vetor de direção unitário, dir = (dirX, dirY). Ele é calculado a partir do ângulo angle em que o jogador está olhando:
    • dirX = cos(angle)
    • dirY = sin(angle)
      (Lembre-se de converter angle para radianos antes de usar cos e sin!)

Quando o jogador se move para frente com uma certa velocidade moveSpeed, o deslocamento dele em um quadro (frame) será:

  • newPosX = posX + dirX * moveSpeed
  • newPosY = posY + dirY * moveSpeed

Acabamos de derivar a base para o movimento em primeira pessoa!

Para uma referência rápida, a Khan Academy tem uma "cheat sheet" que resume perfeitamente o que aprendemos.

Converting between vector components and magnitude & direction review (article) | Khan Academy

Este artigo serve como um excelente resumo e folha de consulta rápida.

Leia a seção "Cheat sheet" no início. Ela apresenta a fórmula de forma concisa. Em seguida, revise a seção "Practice set 3" para reforçar a derivação baseada no triângulo retângulo.


Conclusão

Nesta lição, conectamos a trigonometria abstrata do círculo unitário a uma aplicação concreta e fundamental para a computação gráfica. Agora você sabe como transformar uma direção (um ângulo) em componentes x e y, que são as "instruções" que o computador pode usar para mover objetos em um plano 2D.

Pontos-chave da aula:

  • Decomposição de Vetores: É o processo de quebrar um vetor em suas componentes horizontais (x) e verticais (y).
  • Fórmulas da Decomposição: Para um vetor com magnitude e ângulo :
    • Componente x:
    • Componente y:
  • Vetor de Direção (Unitário): Um vetor com magnitude 1. Suas componentes são simplesmente . Esta é a forma como representaremos a direção do jogador e dos raios no nosso motor.

Até agora, passamos de um ângulo para as componentes. Na próxima aula, faremos o caminho inverso: usaremos a função atan2(y, x) para determinar o ângulo de um vetor a partir de suas componentes cartesianas. Isso é útil em várias situações, como por exemplo, calcular o ângulo que um inimigo precisa ter para estar virado na direção do jogador.