Мой Google-фу нашел только один результат, который возвращает точку пересечения между лучом и треугольником:
http://geomalgorithms.com/a06-_intersect-2.html
И мне совершенно не повезло, что он был собран. Я сделал это для точек / векторов:
typedef struct {
float x, y, z;
} Vector;
typedef struct {
float x, y, z;
} Point;
typedef struct {
Vector P0, P1;
} Ray;
typedef struct {
Point V0, V1, V2;
} Triangle;
И тогда он выдает ошибки об этом коде:
u = T.V1 - T.V0;
v = T.V2 - T.V0;
n = u * v;
«Нет соответствия для оператора — (типы операндов — Точка и Точка)»
Тогда я переписал весь код так:
u.x=T.V1.x-T.V0.x;
u.y=T.V1.y-T.V0.y;
u.z=T.V1.z-T.V0.z;
v.x=T.V2.x-T.V0.x;
v.y=T.V2.y-T.V0.y;
v.z=T.V2.z-T.V0.z;
n.x=u.x*v.x;
n.y=u.y*v.y;
n.z=u.z*v.z;
Но он все еще говорит, что луч {3, 1, -3} {3, -1, -3} не находится внутри треугольника {-10, 0, -10} {10, 0, 10} {10, 0, — 10} Я проверил это в Blender, и луч действительно пересекает треугольник.
Может кто-нибудь указать, что я делаю неправильно, или ссылку на другую страницу с функцией, которая будет возвращать точную точку, где отрезок линии пересекает треугольник? Я предпочел бы сделать это в C, чем связывать какую-то векторную библиотеку. Спасибо!
Вот проблема:
n = u * v;
Это должно быть интерпретировано как векторное произведение N знак равно U Икс v, не компонентное умножение.
Я полагаю, что автор страницы не намеревался публиковать действительный готовый C ++ там, на что намекают кавычки, которые он использовал для написания названия языка. Чтобы превратить этот псевдокод в скомпилированный код, вам нужно будет самостоятельно реализовать несколько операторов, например, перекрестное произведение двух трехмерных векторов (кстати, это тривиально).
Предположим, что классы уже даны для объектов:
…