Trova il punto più vicino lungo un rettangolo, dato un altro punto e direzione


8

Dato un rettangolo e un punto con una direzione vettoriale verso il rettangolo. Come posso trovare il punto più vicino all'esterno di quel rettangolo rispetto al punto in questione?

Rettangolo rivolto verso il punto


Puoi spiegare di più cosa stai chiedendo? Non lo capisco davvero.

Diciamo che ho un personaggio di fronte a un oggetto (un rettangolo) e traccio una linea immaginaria da quel personaggio al rettangolo. Vorrei sapere come posso sapere quale punto lungo l'esterno dell'oggetto rettangolare tocca la linea.
onedayitwillmake il

1
La parola chiave da cercare in Google è "AABB" (riquadro di selezione allineato agli assi). Se la tua "scatola" (rettangolo) non è ancora allineata agli assi, una semplice matrice di trasformazione - usata su tutti gli oggetti che ti interessano, ovviamente - può essere usata prima per cambiarla in una.
Martin Sojka,

Risposte:


6

Una tecnica che potresti usare è chiamata "ray casting". È comunemente usato per il rendering di grafica, ma ha altre applicazioni come la visuale (come si desidera fare) e la ricerca del percorso. In termini generali, funziona trovando l'intersezione di un raggio e un oggetto. Nel tuo esempio il raggio è il vettore per la direzione del personaggio.

Un riferimento utile per le intersezioni raggio / oggetto (e per inciso altri incroci oggetto / oggetto) è www.realtimerendering.com/intersections.html (guardare sotto i riferimenti per ray / aabb e ray / obb).


9

Il rettangolo ha quattro lati. Ogni lato è un segmento di linea.

Prova ciascuno dei quattro lati per l'intersezione con il raggio. Traccia il colpo più vicino.

Ecco un po 'di codice per scoprire dove colpisce il segmento sul raggio:

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
}

1

Se il riquadro è allineato all'asse, è sufficiente bloccare ciascun asse di coordinate sul riquadro se il punto si trova all'esterno del riquadro.

Da 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 ;

Se lo fai per gli assi x, y, z, allora pointverrà sbattuto contro la parete più vicina della scatola, se è fuori dalla scatola per cominciare. se è già all'interno della scatola, verrà lasciato solo (dove si trova).


0

Bene, puoi usare solo l'algebra lineare (geometria analitica, per essere più specifici) per risolvere questo problema. Dipende da come hai modellato il rettangolo.

Ecco un caso generale: http://paulbourke.net/geometry/lineline2d/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.