【发布时间】:2019-09-28 13:20:55
【问题描述】:
我在 3D 空间的某处有一条线(A、B)和一个三角形(P0、P1、P2)。换句话说,三角形有 3 个点(每个 [x,y,z]),直线有两个点(也有 [x,y,z])。线的一点位于三角形内(A 或 B)。主要目标是在屏幕上找到构成线条一部分的三角形边缘的交点(A,B)。
我做什么:
1.从线开始(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)?
【问题讨论】:
-
"还有两个点(也叫 [x,y,z])作为线"
标签: c# vector 3d geometry intersection