Я хочу определить точку пересечения между лучом и ящиком. Коробка определяется ее минимальной трехмерной координатой и максимальной трехмерной координатой, а луч определяется ее началом и направлением, на которое он указывает.
В настоящее время я формирую плоскость для каждого лица коробки, и я пересекаю луч с плоскостью. Если луч пересекает плоскость, то я проверяю, действительно ли точка пересечения находится на поверхности ящика. Если это так, я проверяю, является ли это ближайшим пересечением для этого луча, и я возвращаю ближайшее пересечение.
Как я проверяю, находится ли точка пересечения плоскости на самой поверхности коробки, через функцию
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;
}
где corner1
- это один угол прямоугольника для этой грани окна, а corner2
- противоположный угол. Моя реализация работает большую часть времени, но иногда это дает мне неправильное пересечение. См. Изображение:
На изображении показаны лучи, исходящие из глаза камеры, и попадание на поверхность коробки. Другие лучи являются нормалями к поверхности ящика. Можно видеть, что один луч, в частности (это фактически нормальный вид), выходит из "спины" окна, тогда как нормаль должна подниматься сверху. Это кажется странным, поскольку есть несколько других лучей, которые правильно попадают в верхнюю часть коробки.
Мне было интересно, правильно ли я проверяю, находится ли точка пересечения в поле, или если я должен использовать какой-то другой алгоритм.
Спасибо.