У меня есть линия (A
, B
) и треугольник (P0
, P1
, P2
) где-то в трехмерном пространстве. Другими словами, у меня есть 3 точки ([x, y, z] каждая) для треугольника и две точки (также [x, y, z]) для линии. Одна точка линии лежит внутри треугольника (A
или B
). Основная цель - найти пересечение по краю треугольника, который является частью линии (A
, B
) на экране.
Что я делаю:
1. Рассчитать плоскость Normal от начала линии (A
), конца линии (B
) и положения камеры:
Vector3 Normal = Vector3.Cross(A - cameraPos, B - cameraPos);
2. Найдите два пересечения, проверив каждый край треугольника:
bool IsPlaneIntersectLine(Vector3 Normal, Vector3 A, Vector3 B, Vector3 EdgePoint1, Vector3 EdgePoint2, out Vector3 Intersection)
{
float dotProduct = Vector3.Dot(Normal, (EdgePoint1 - EdgePoint2));
if (dotProduct == 0f)
return false;
float dot1 = Vector3.Dot(Normal, (A - EdgePoint2));
float distance = dot1 / dotProduct;
if (distance > 1f || distance < 0f)
return false;
Intersection = EdgePoint2 + distance * (EdgePoint1 - EdgePoint2);
return true;
}
Vector3 intersection1, intersection2, intersection3;
bool isEdge1Intersected = IsPlaneIntersectLine(Normal, A, B, triangle.P0, triangle.P1, out intersection1);
bool isEdge2Intersected = IsPlaneIntersectLine(Normal, A, B, triangle.P1, triangle.P2, out intersection2);
bool isEdge3Intersected = IsPlaneIntersectLine(Normal, A, B, triangle.P2, triangle.P0, out intersection3);
В результате у меня есть два пересечения, но только один является правильным - пересечение, то есть часть линии (A
, B
) на экране . Также у меня есть ограничения - я не могу преобразовать эти точки в пространство экрана для проверки - какая из двух точек пересечения находится между A
и B
.
Также я попытался проверить произведение точки между вектором линии и вектором пересечения:
float dot = Vector3.Dot((Intersection - A), (B - A));
if (dot < 0f)
{
return false;
}
Но есть некоторые треугольники / ребра, которые не подходят для этого условия.
Как найти одно пересечение на ребре треугольника, которое является частью линии (A
, B
) на экране?