Desidero determinare il punto di intersezione tra un raggio e un riquadro. La casella è definita dalla sua coordinata min 3D e dalla sua coordinata 3D massima e il raggio è definito dalla sua origine e dalla direzione verso cui punta.Teoria dell'intersezione di Ray-box
Attualmente, sto formando un piano per ogni faccia della scatola e sto incrociando il raggio con il piano. Se il raggio interseca il piano, allora controllo se il punto di intersezione si trova effettivamente sulla superficie della scatola. Se è così, controllo se è l'intersezione più vicina a questo raggio e restituisco l'intersezione più vicina.
Il modo posso controllare se il piano punto intersezione è sulla superficie scatola stessa è attraverso una funzione
bool PointOnBoxFace(R3Point point, R3Point corner1, R3Point corner2)
{
double min_x = min(corner1.X(), corner2.X());
double max_x = max(corner1.X(), corner2.X());
double min_y = min(corner1.Y(), corner2.Y());
double max_y = max(corner1.Y(), corner2.Y());
double min_z = min(corner1.Z(), corner2.Z());
double max_z = max(corner1.Z(), corner2.Z());
if(point.X() >= min_x && point.X() <= max_x &&
point.Y() >= min_y && point.Y() <= max_y &&
point.Z() >= min_z && point.Z() <= max_z)
return true;
return false;
}
dove corner1
è un angolo del rettangolo di quella scatola viso e corner2
è l'angolo opposto. La mia implementazione funziona la maggior parte del tempo ma a volte mi dà l'incrocio sbagliato. Si prega di vedere l'immagine:
L'immagine mostra raggi provenienti dall'occhio della fotocamera e che colpisce la superficie scatola. Gli altri raggi sono normali alla superficie della scatola. Si può vedere che l'un raggio in particolare (in realtà è il normale che si vede) esce dal "dietro" della scatola, mentre il normale dovrebbe venire dalla parte superiore della scatola. Questo sembra strano perché ci sono molti altri raggi che colpiscono correttamente la parte superiore della scatola.
Mi chiedevo se il modo in cui sto verificando se il punto di intersezione è sulla scatola è corretto o se dovrei usare qualche altro algoritmo.
Grazie.
Grande diagramma. Questo aiuta davvero a illustrare il problema. –