Clase Colisiones
Computacionales
Colisiones
Licenciatura en Multimedia y Animación Digital
Clase 22
Introducción
Para la detección de colisiones vamos a usar algoritmos que
son en su mayoría usados en el trazado de rayos.
Un rayo (usando una representación vectorial) se representa
mediante un vector que denota el comienzo y un vector
(usualmente normalizado) que muestra la dirección hacia
donde sedirige el rayo.
Rayo
Un rayo empieza en el punto de inicio y sigue la dirección del
vector. Por lo tanto, la ecuación del rayo es:
PointOnRay = Raystart + t*Raydirection
t es un float que toma valores del intervalo [0, infinito).
Con 0 obtenemos el punto de inicio y sustituyendo los otros
valores conseguimos los puntos correspondientes a lo largo del
rayo.
PointOnRay, Raystart, Raydirection sonvectores 3D con
valores (x, y, z).
Rayo
Ahora podemos usar esta representación del rayo y calcular
las intersecciones con planos o cilindros.
Intersección plano-rayo
Un plano se representa usando su representación en forma
de vector como:
Xn • X = d
Xn, X son vectores y d es un valor flotante.
Xn es su normal.
X es un punto en su superficie.
d es un flotante que representa la distancia del plano alo
largo de la normal, desde el centro del sistema de
coordenadas
Intersección plano-rayo
Esencialmente un plano representa una división en el
espacio. Así, todo lo que necesitamos para definir un plano
es un punto 3D y una normal desde ese punto que es
perpendicular a ese plano.
Estos dos vectores (Xn, X) forman un plano.
Intersección plano-rayo
Por ejemplo, si tenemos para el punto 3D elvector (0, 0, 0)
y para la normal (0, 1, 0), definimos un plano en los ejes x,
z. Por lo tanto definir un punto y una normal es suficiente
para obtener la representación vectorial de un plano.
Intersección plano-rayo
Usando la ecuación vectorial del plano, la normal es
sustituida por Xn y el punto 3D a partir del cual se origina
la normal, es sustituido por X.
El único valor que falta es d que sepuede calcular
fácilmente multiplicando vectorialmente X y Xn.
Intersección plano-rayo
Las dos ecuaciones que tenemos hasta ahora son:
PointOnRay = Raystart + t*Raydirection
Xn • X = d
Intersección plano-rayo
Si un rayo interseca el plano en algún punto entonces debe
haber algún punto en el rayo que satisfaga la ecuación del
plano:
Xn • PointOnRay = d
O
(Xn • Raystart) + t* (Xn • Raydirection)= d
Intersección plano-rayo
Despejando la t:
t = (d - Xn • Raystart) / (Xn • Raydirection)
O sustituyendo la d:
t= (Xn • PointOnRay - Xn • Raystart) / (Xn • Raydirection)
O resumiendo:
t= (Xn •(PointOnRay - Raystart)) / (Xn • Raydirection)
Intersección plano-rayo
t representa la distancia desde el comienzo hasta el punto de
intersección a lo largo de la dirección del rayo.
Por lo tanto,sustituyendo t en la ecuación del rayo podemos
obtener el punto de colisión.
Hay unos pocos casos especiales.
Intersección plano-rayo
a. Si Xn dot Raydirection = 0 entonces estos 2 vectores son
perpendiculares (el rayo se desarrolla paralelamente al plano)
y no habrá colisión.
b. Si t es negativo, la colisión tiene lugar detrás del punto de
comienzo del rayo a lo largo de la dirección opuesta, y denuevo no hay intersección.
Todo esto se pone de manifiesto en el código de la función
siguiente:
Intersección plano-rayo
int TestIntersionPlane(const Plane& plane, const TVector& position,
const TVector& direction, double& lamda, TVector& pNormal)
{
double DotProduct=direction.dot(plane._Normal);
// Dot Product Between Plane Normal And Ray Direction
double l2;
// Determine If Ray Parallel ToPlane
if ((DotProduct
return 0;
l2=(plane._Normal.dot(plane._Position-position))/DotProduct;
// Find Distance To Collision Point
if (l2<-ZERO)
return 0;
pNormal=plane._Normal;
lamda=l2;
return 1;
}
// Test If Collision Behind Start
Intersección plano-rayo
La función calcula y devuelve la intersección.
Devuelve 1 si hay una intersección y en cualquier otro caso,
0.
Los...
Regístrate para leer el documento completo.