public static Vector3 GetHoverPoint(Vector3 lp1, Vector3 lp2, Vector3 modelP, float attachR) { var _area = Geometric.GetArea(lp1, lp2, modelP); //三角形面积 var _lLength = Vector3.Distance(lp1, lp2); //lp1,lp2长度 var dis = _lLength < 1e-3 ? attachR + 1 : 2 * _area / _lLength; //modelP到lp1,lp2的距离 if (dis > attachR) //太远 { return(default(Vector3)); } Vector3 lDir = lp1 - lp2; //直线方向 Vector3 mDir = QuaternionUtility.Euler(0, 90, 0) * lDir; //xz平面上垂直直线方向 Vector3 __S = modelP - mDir * 999; Vector3 __E = modelP + mDir * 999; //临时的两个线点 if (!Geometric.Meet(__S, __E, lp1, lp2)) //不相交 { return(default(Vector3)); } //到这里还能执行的话是相交且接近, 就要计算点 Vector3 res = Geometric.GetCorssPointOfSegment(__E, __S, lp1, lp2); return(res); }
public static float GetHoverDis(Vector3 lp1, Vector3 lp2, Vector3 modelP) { var _lp1 = new Vector3(lp1.x, 0, lp1.z); var _lp2 = new Vector3(lp2.x, 0, lp2.z); var _modelP = new Vector3(modelP.x, 0, modelP.z); var _area = Geometric.GetArea(_lp1, _lp2, _modelP); //三角形面积 var _lLength = Vector3.Distance(_lp1, _lp2); //lp1,lp2长度 var dis = 2 * _area / _lLength; //modelP到lp1,lp2的距离 return(dis); }
public static Vector3 GetHoverPointOfLine(Vector3 lp1, Vector3 lp2, Vector3 modelP, float attachR) { var _area = Geometric.GetArea(lp1, lp2, modelP); //三角形面积 var _lLength = Vector3.Distance(lp1, lp2); //lp1,lp2长度 var dis = _lLength < 1e-3 ? attachR + 1 : 2 * _area / _lLength; //modelP到lp1,lp2的距离 if (dis > attachR) //太远 { return(default(Vector3)); } Vector3 lDir = lp1 - lp2; //直线方向 Vector3 mDir = QuaternionUtility.Euler(0, 90, 0) * lDir; //xz平面上垂直直线方向 Vector3 __S = modelP - mDir * 99; Vector3 __E = modelP + mDir * 99; //临时的两个线点 //if (!Geometric.Meet(__S, __E, lp1, lp2))//不相交 //{ // return default(Vector3); //} //到这里还能执行的话是相交且接近, 就要计算点 Vector3 res = Geometric.GetCrossPointOfLine(__E, __S, lp1, lp2); if ((Mathf.Abs(res.x - modelP.x) < 0.01f)) { res.x = modelP.x; } if ((Mathf.Abs(res.z - modelP.z) < 0.01f)) { res.z = modelP.z; } return(res); }