Если Вам необходимо проверить, пересекается ли отрезок с треугольником (ами) и не требуется особо шустрого способа и нет желания самому писать проверку, можете воспользоваться этой dll.
Как использовать:

Объявляем:
////////////////////////////////////////////////////////////////////////////////////
struct Peresechenie { int cros; int nom; double T[3]; } Per;
typedef Peresechenie (*Crossing)(double Nx, double Ny, double Nz, double Kx, double Ky, double Kz, double **V_x, double **V_y, double **V_z, int Kol);
Crossing  crossing;
HINSTANCE hLib;
////////////////////////////////////////////////////////////////////////////////////


Загружаем:
////////////////////////////////////////////////////////////////////////////////////
hLib=LoadLibrary("Crossing.dll");
crossing=(Crossing)GetProcAddress((HMODULE)hLib, "Crossing");
////////////////////////////////////////////////////////////////////////////////////


Данные о треугольниках и отрезке такие:
////////////////////////////////////////////////////////////////////////////////////
double Nx, Ny, Nz, Kx, Ky, Kz;//Координаты начала и конца отрезка

int Kol;//Количество треугольников

//Выделение памяти для вершин треугольников
double **t_x=(double **)calloc(3,sizeof(double *));
double **t_y=(double **)calloc(3,sizeof(double *));
double **t_z=(double **)calloc(3,sizeof(double *));
for (int i=0; i<3; i++)
{
t_x[i]=(double *)calloc(Kol ,sizeof(double));
t_y[i]=(double *)calloc(Kol ,sizeof(double));
t_z[i]=(double *)calloc(Kol ,sizeof(double));
}

1й треугольник:
t_x[0][0]=x первой вершины
t_x[1][0]=x второй вершины
t_x[2][0]=x третей вершины

t_y[0][0]=y первой вершины
t_y[1][0]=y второй вершины
t_y[2][0]=y третей вершины

t_z[0][0]=z первой вершины
t_z[1][0]=z второй вершины
t_z[2][0]=z третей вершины

2й треугольник:
t_x[0][1]=x первой вершины
t_x[1][1]=x второй вершины
t_x[2][1]=x третей вершины

t_y[0][1]=y первой вершины
t_y[1][1]=y второй вершины
t_y[2][1]=y третей вершины

t_z[0][1]=z первой вершины
t_z[1][1]=z второй вершины
t_z[2][1]=z третей вершины

и так далее.
////////////////////////////////////////////////////////////////////////////////////

Используем:
////////////////////////////////////////////////////////////////////////////////////
Входящие параметры:
crossing(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

1-X начала отрезка
2-Y начала отрезка
3-Z начала отрезка
4-X конца отрезка
5-Y конца отрезка
6-Z конца отрезка
7-Указатель на масивы вершин треугольников X
8-Указатель на масивы вершин треугольников Y
9-Указатель на масивы вершин треугольников Z
10-Количество треугольников

Функция проверки возвращает:
1) 1 при пересечение и 0 при не пересечение
2) координаты x y z точки пересечения
3) номер пересекаемого треугольника (каким он был в масиве) при пересечение.

if ((Per=crossing(Nx, Ny, Nz, Kx, Ky, Kz, t_x, t_y, t_z, Kol)).cros)
{
//Есть пересечение
Координата точки пересечения X = Per.T[0];
Координата точки пересечения Y = Per.T[1];
Координата точки пересечения Z = Per.T[2];
Номер треугольника в масиве = Per.nom;
}

else
{
//Нет пересечения
}
////////////////////////////////////////////////////////////////////////////////////


Удаляем:
////////////////////////////////////////////////////////////////////////////////////
FreeLibrary((HMODULE)hLib);