Encuentra el punto más cercano a lo largo de un rectángulo, dado otro punto y dirección

8

Dado un rectángulo y un punto con una dirección vectorial hacia el rectángulo. ¿Cómo puedo encontrar el punto más cercano en el exterior de ese rectángulo al punto en cuestión?

Rectángulo de orientación de punto

onedayitwillmake
fuente
¿Puedes explicar más lo que estás preguntando? Realmente no lo entiendo.
Digamos que tengo un personaje frente a un objeto (un rectángulo), y dibujo una línea imaginaria desde ese personaje hasta el rectángulo. Me gustaría saber cómo puedo saber qué punto a lo largo del exterior del objeto rectangular toca la línea.
onedayitwillmake
1
La palabra clave para buscar en Google es "AABB" (cuadro delimitador alineado con el eje). Si su "caja" (rectángulo) aún no está alineada con el eje, una matriz de transformación simple, utilizada en todos los elementos que le interesan, obviamente, puede usarse primero para cambiarla a una.
Martin Sojka

Respuestas:

6

Una técnica que podría utilizar se llama "fundición de rayos". Se usa comúnmente para renderizar gráficos, pero tiene otras aplicaciones, como la línea de visión (como desea hacer) y la búsqueda de rutas. En términos generales, funciona al encontrar la intersección de un rayo y un objeto. En tu ejemplo, el rayo es el vector para la dirección del personaje.

Una referencia útil para las intersecciones de rayos / objetos (y, por cierto, otras intersecciones de objetos / objetos) es www.realtimerendering.com/intersections.html (busque en las referencias ray / aabb y ray / obb).

Luke Van In
fuente
9

El rectángulo tiene cuatro lados. Cada lado es un segmento de línea.

Prueba cada uno de los cuatro lados para la intersección con el rayo. Rastrea el golpe más cercano.

Aquí hay un código para averiguar en qué parte del segmento impacta el rayo:

bool intersect(const ray& ray, const segment& segment,point& hit) {
    // where do we intersect this line?
    float t = ((ray.direction.x * ray.origin.y + ray.direction.y *
        (segment[0].x - ray.origin.x)) -
        (ray.direction.x * segment[1].y)) /
        (ray.direction.y * (segment[0].x + segment[1].x) -
        ray.direction.x * (segment[0].y + segment[1].y));
    if(t >= 0.0 && t<=1.0) { // in the segment
        hit = segment[0] + (segment[1]-segment[0]*t);  // lerp
        return true;
    }
    return false; // no hit
}
Será
fuente
1

Si su caja está alineada con el eje, solo tiene que sujetar cada eje de coordenadas a la caja si el punto está fuera de la caja.

De RTCD pg 130:

// Do this for all 3 axes
if( point.x < min.x )  point.x = min.x ;
else if( point.x > max.x )  point.x = max.x ;

Si hace esto para los ejes x, y, z, entonces se pointcerrará de golpe a la pared más cercana de la caja, si está fuera de la caja, para empezar. si ya está dentro de la caja, se dejará solo (donde está).

bobobobo
fuente