Пересечение окна луча с первой известной точкой попадания
У меня есть точка на кубе. У меня тоже есть направление. Моя цель - получить позицию на стороне куба, пересекающуюся с вектором направления.
Я делаю это в GLSL (пример кода не должен быть GLSL). Я бы подумал, что этот случай будет решен с помощью функции пересечения коробки лучей, но я не могу заставить ее работать вообще.
float IntersectBox(vec3 orig, vec3 dir, vec3 box)
{
vec3 t1 = (- orig) / dir; // cube starts at 0,0,0
vec3 t2 = (box - orig) / dir; // cube ends at box vector coordinates
vec3 real_min = min(t1, t2);
vec3 real_max = max(t1, t2);
float minmax = min( min(real_max.x, real_max.y), real_max.z);
return minmax;
}
Затем я добавляю длину в исходное положение:
pos += normalize(rayDir) * IntersectBox(pos, rayDir, vec3(grid));
редактировать
Добавляем дополнительное объяснение.
У меня есть куб:
_____?___
| \ |
| \ | . is start point - this is known.
| \. / is direction (roughly -.3, .8 here) - this is known
|________| ? is the exit point - which I need to find out
На кубе у меня есть точка входа. Над ним точка. У меня тоже есть направление. Теперь мне нужно выяснить точку, где луч покидает куб, именно там, где это происходит. Смотрите знак вопроса, эту точку выхода мне нужно выяснить.
Конечно, это двухмерный случай, но он мне нужен для трех измерений.
1 ответ
Дан луч R = {u*t + v|t}
и самолет P = {p|<n, p> = d}
определить значение t
в котором R
а также P
пересекаются, если он существует. То есть это легко определить t > 0
такой, что <n, u*t + v> = d
если он существует.
Ваш куб имеет шесть плоских сторон: P[i], i = 1..6
, Для каждой стороны i
определить, если луч R
пересекается P[i]
для некоторой ценности t[i]
, Если любая сторона P[i]
не пересекается R
уберите эту сторону из рассмотрения.
Для каждой плоскости P[i]
что пересекается R
, u*t[i] + v
это точка пересечения. Если любая такая точка пересечения находится за пределами куба, удалите ее из рассмотрения.
Первая точка пересечения u*t[i] + v
То, что находится в кубе, - это позиция, которую вы ищете.