19. Proyección de vectores

Proyectar un vector sobre otro permite medir cuánto de un movimiento actúa en una dirección determinada. Esta operación separa componentes paralelas y perpendiculares, una idea esencial para colisiones, físicas y desplazamientos sobre superficies.

19.1 Introducción

Imagina una pelota que golpea una pared inclinada. Su velocidad puede dividirse en una parte paralela a la pared y otra perpendicular. La parte perpendicular determina el impacto; la paralela describe cuánto continúa deslizándose.

La proyección realiza precisamente esa separación. Recibe un vector que queremos analizar y una dirección de referencia sobre la cual mediremos su contribución.

19.2 La idea de proyectar

Proyectar v sobre u equivale a iluminar v perpendicularmente hacia la recta que contiene a u. La «sombra» obtenida sobre esa recta es la proyección de v.

proyu(v) = parte de v que apunta en la dirección de u

La proyección siempre es paralela a u. Puede apuntar en el mismo sentido, en sentido contrario o ser el vector nulo.

19.3 Proyección escalar

La proyección escalar es un número con signo. Indica cuántas unidades de v avanzan en la dirección unitaria de u:

compu(v) = (v · u) / |u|

Si u ya está normalizado, |u|=1 y la fórmula se reduce a v·u. Un resultado positivo indica el mismo sentido; uno negativo, sentido opuesto; cero significa perpendicularidad.

19.4 Proyección vectorial

La proyección vectorial agrega la dirección a la cantidad anterior. Su fórmula general es:

proyu(v) = ((v · u) / |u|²) · u

El cociente es un escalar. Al multiplicarlo por u obtenemos un vector paralelo a la referencia. La división por |u|² hace que el resultado no dependa de la longitud elegida para representar esa dirección.

19.5 Interpretación geométrica

Proyección del vector v sobre u con componentes paralela y perpendicular
La proyección es la componente paralela; el resto forma la componente perpendicular.

La línea desde la punta de v hasta la proyección forma 90° con u. Esto permite comprobar visualmente que la diferencia v−proyu(v) es perpendicular a la dirección de referencia.

19.6 Ejemplo paso a paso

Sean v=(3,4) y u=(4,1), como en el gráfico anterior. Primero calculamos v·u=16 y |u|²=17:

proyu(v) = (16/17)(4,1)
proyu(v) = (64/17,16/17) ≈ (3.76,0.94)

La componente perpendicular es v−proyu(v)=(−13/17,52/17) ≈ (−0.76,3.06). El producto escalar entre esta componente y u es cero, lo que confirma que ambos vectores son perpendiculares.

19.7 Usar un vector unitario

Si n es unitario, proyectar resulta más simple:

proyn(v) = (v · n)n, cuando |n|=1

Esta forma es frecuente en motores gráficos, donde normales de superficies y direcciones importantes se almacenan normalizadas. Aun así, conviene que las funciones generales acepten referencias no normalizadas.

19.8 Signo y casos especiales

Producto v·uProyecciónInterpretación
> 0Mismo sentido que uv avanza en la dirección de u
= 0Vector nulov es perpendicular a u
< 0Sentido contrario a uv retrocede respecto de u

El vector de referencia u no puede ser nulo porque |u|² aparecería como divisor. Una implementación debe comprobar este caso.

19.9 Descomposición paralela y perpendicular

Todo vector v puede separarse respecto de una dirección u en dos componentes:

vparalela = proyu(v)
vperpendicular = v − vparalela
v = vparalela + vperpendicular

La primera sigue la dirección de u y la segunda forma 90° con u. Esta descomposición conserva exactamente el vector original.

19.10 Simulación interactiva: proyecta un vector

Modifica v y u. La simulación muestra la proyección en amarillo, la componente perpendicular con una línea discontinua y el signo de la componente escalar.

Producto escalarv·u = 16
Proyección escalar3.88
Proyección vectorial(3.76, 0.94)
Componente perpendicular(−0.76, 3.06)

19.11 Proyectar en JavaScript

function proyectar(v, sobre) {
  const denominador = sobre.x ** 2 + sobre.y ** 2;
  if (denominador === 0) return null;

  const factor = (v.x * sobre.x + v.y * sobre.y)
               / denominador;

  return {
    x: factor * sobre.x,
    y: factor * sobre.y
  };
}

const v = { x: 3, y: 4 };
const sobre = { x: 4, y: 1 };
const proyeccion = proyectar(v, sobre);

console.log(proyeccion);
// { x: 3.764705882352941, y: 0.9411764705882353 }

Al ejecutar el código se muestra la proyección de v sobre sobre: aproximadamente { x: 3.76, y: 0.94 }. La función devuelve null si la dirección base es nula. Otra estrategia válida es lanzar un error o devolver (0,0), pero la decisión debe quedar documentada.

19.12 Aplicaciones en gráficos y videojuegos

  • Colisiones: separar velocidad normal y tangencial respecto de una superficie.
  • Deslizamiento: eliminar el componente que empuja contra una pared.
  • Sombras: proyectar puntos o vectores sobre una línea.
  • Cámaras: medir cuánto se mueve un objetivo hacia delante o hacia un lado.
  • Controles: convertir un desplazamiento a ejes locales del personaje.
  • Física: calcular trabajo, velocidad radial o respuesta a impactos.
  • SAT: proyectar polígonos sobre ejes para detectar separaciones.

Animación de una colisión

Al tocar la pared, la velocidad se separa en una componente tangencial, que se conserva, y otra normal, que invierte su sentido para producir el rebote.

La pelota se aproxima

19.13 Errores comunes

  • Intercambiar el vector proyectado y el vector base.
  • Dividir por |u| en vez de por |u|² en la proyección vectorial.
  • Suponer que u está normalizado cuando no lo está.
  • No tratar el vector base nulo.
  • Eliminar el signo de la proyección escalar usando valor absoluto.
  • Confundir la proyección escalar, que es un número, con la vectorial.
  • Creer que la componente perpendicular es siempre una normal unitaria.

19.14 Qué debes recordar y conclusión

  • La proyección mide la parte de v alineada con u.
  • La proyección escalar tiene signo y expresa una longitud orientada.
  • proyu(v)=((v·u)/|u|²)u.
  • Si u es unitario, la fórmula se reduce a (v·u)u.
  • v se descompone en una parte paralela y otra perpendicular.
  • Una proyección negativa apunta en sentido contrario a u.

La proyección convierte una relación geométrica en componentes utilizables por el programa. Permite analizar un movimiento desde el punto de vista de una superficie, un eje local o cualquier dirección relevante.

En el próximo tema estudiaremos ángulos, grados y radianes para expresar orientaciones y giros.