Это продолжение той же самой темы, что была раннее описана мной, но я теперь немного расширю сферу применения. В прошлый раз я вывел формулы, которые пересекают линию с плоскостью, но так, что линия исходит из точки (0,0,0), а теперь я поправлю формулы так, чтобы можно было рассчитать любую исходящую линию для расчета пересечений.
§ Вывод формулы
Задаем снова параметрические уравнения для плоскости и прямой:
Плоскость
Прямая
Здесь нет ничего необычного. Вектор AB и вектор AC рассчитываются путем вычитания точек B-A и C-A по всем трем компонентам координат.
Требуется найти u,v,t. Здесь (u,v) будет найденной текстурной позицией, а t – расстоянием от точки P до точки M. Прямая задается вектором PN и позицией P. То есть при t=0, M будет равно P.
Теперь, для того, чтобы параметры, необходимо приравнять оба уравнения между собой, отчего получится:
Здесь вектор AP это разность между точкой P (начала прямой) и точкой A (треугольник). Если разложить покомпонентно, то получим вот такую систему линейных алгебраических уравнений (СЛАУ):
§ Нахождение решений
Чтобы найти u,v,t необходимо применить формулу Крамера, которую уже неоднократно применяли. Для начала, надо вычислить детерминант:
Он будет равен:
Вообще, каждый раз коэффициенты для треугольника для этого детерминанта не надо высчитывать, они могут быть рассчитаны только один раз на всю сцену. Меняется только лишь PN. И потому их достаточно высчитать лишь единожды. Пересчитывание этих коэффициентов может быть только тогда, когда как-то меняется положение треугольника в пространстве.
Теперь ищется u:
, ,
Получается
В данном случае, для t менять коэффициенты требуется только при перемещении точки вида относительно треугольника. То есть, фактически, один раз на фрейм.
Стоит обратить внимание, что вектор это разница между точкой исходящего луча и точкой A в треугольнике.
Внимательно отмечу что коэффициенты для t являются вектором, перпендикулярным плоскости, то есть, из этого вектора можно найти вектор нормали:
§ Код
Ниже представлена функция для расчета параметров треугольника: