柚子快报激活码778899分享:Unity点到线段的最短距离

http://www.51969.com/

抄的Unity的源码

HandleUtility.DistancePointLine 是UnityEditor代码,源码如下,这样就可以在Runtime中运行

注意性能开销!

 

///

/// 计算点到线段的最短距离

///

///

///

///

///

public static float DistancePointLine(Vector3 point, Vector3 lineStart, Vector3 lineEnd)

{

Vector3 rhs = point - lineStart;

Vector3 vector3 = lineEnd - lineStart;

float magnitude = vector3.magnitude;

Vector3 lhs = vector3;

if ((double) magnitude > 9.99999997475243E-07)

lhs /= magnitude;

float num = Mathf.Clamp(Vector3.Dot(lhs, rhs), 0.0f, magnitude);

Vector3 v3 = lineStart + lhs * num;

return Vector3.Magnitude (v3 - point);

}

 

 

向量计算法:

AB为向量,求C到AB的距离,计算向量AC在向量AB上投影得到AD,可计算DC的长度

性能没问题

float GetPointToLineDistance(Vector3 point, Vector3 start, Vector3 end) {

Vector3 sp = point - start;

Vector3 se = end - start;

Vector3 project = Vector3.Project (sp, se);

Vector3 line = sp - project;

return line.magnitude;

}

 俯视角二维

private float GetPointToPlaneDistance(Vector3 point, Vector3 start, Vector3 end) {

point = new Vector3 (point.x, 0, point.z);

start = new Vector3 (start.x, 0, start.z);

end = new Vector3 (end.x, 0, end.z);

Vector3 sp = point - start;

Vector3 se = end - start;

Vector3 project = Vector3.Project (sp, se);

Vector3 line = sp - project;

return line.magnitude;

}

 

 

胶囊体计算法:

上面的方法计算量较大,这种是实际项目中用的一种

 

柚子快报激活码778899分享:Unity点到线段的最短距离

http://www.51969.com/

查看原文