判断一个点P是否在三角形ABC内,我们只需要分别求出cross(AB,AP),cross(BC,BP),cross(CA,CP)三个叉积方向是否一致。
代码如下:
/// <summary>
/// 是否在三角形内
/// </summary>
/// <returns></returns>
static bool IsInTriangle(Vector3 A,Vector3 B,Vector3 C,Vector3 P)
{
Vector3 AB = B - A;
Vector3 BC = C - B;
Vector3 CA = A - C;
Vector3 AP = P - A;
Vector3 BP = P - B;
Vector3 CP = P - C;
return IsConvexAngle(AB, AP)== IsConvexAngle(BC, BP) && IsConvexAngle(BC, BP)== IsConvexAngle(CA, CP);
}
/// <summary>
/// 是否是凸角
/// </summary>
/// <returns></returns>
public static bool IsConvexAngle(Vector3 p1, Vector3 p2)
{
Vector3 p3 = new Vector3(p1.x, 0, p1.z);
Vector3 p4 = new Vector3(p2.x, 0, p2.z);
Vector3 crossVal = Vector3.Cross(p3, p4);
return Vector3.Dot(Vector3.up, crossVal) >= 0;
}
unity是左手坐标系。所以叉乘要使用左手。