如题
计算点到线上的垂点,首先明确:
该线段必须给出确切的起始点和终点, 而不是一个向量,因为一个向量并不能代表一个线段。
所以参数列表如下:
Vector3 VerticalPoint(Vector3 point, Vector3 lStart, Vector3 lEnd);
下图中蓝色标记的是未知量,黑色为已知量
数学方法求解:
-
因为
point
,LStart
,LEnd
都已知,
所以向量vector = LEnd- LStart
,guideLine = point - LStart
都已知
首先由向量的点积公式可知
v e c t o r ⋅ g u i d e L i n e = x 1 x 2 + y 1 y 2 = ∣ v e c t o r ∣ ∣ g u i d e L i n e ∣ c o s θ vector ·guideLine =x1x2+y1y2=|vector||guideLine|cosθ vector⋅guideLine=x1x2+y1y2=∣vector∣∣guideLine∣cosθ -
又因为需要的是点到线段上的垂点
所以我们需要的实际上是|guideLine| * cosθ
的长度,
由此即可得到目标点相对LStart
的偏移量 -
由向量性质可知
向量归一化后其长度为一,所以我们可以将vector
向量转化为单位向量
此时|vector.normalize| == 1
,此时我们的公式就化为了:
v e c t o r . n o r m a l i z e ⋅ g u i d e L i n e = ∣ g u i d e L i n e ∣ c o s θ vector.normalize · guideLine = |guideLine|cosθ vector.normalize⋅guideLine=∣guideLine∣cosθ
此时计算出的值就是LStart
到target
的长度
所以target = LStart + vector * 目标长度
C#代码
public static Vector3 VerticalPoint(Vector3 point, Vector3 lStart, Vector3 lEnd)
{
Vector3 guideLine = point - lStart;
Vector3 vector = lEnd - lStart;
//float magnitude = vector.magnitude;
vector = vector.normalized;
float num2 = Vector3.Dot(vector, guideLine);
//有需要的话可以将值限制在范围之间,比如这里限制在 线段内部
//float num2 = Mathf.Clamp(Vector3.Dot(vector, guideLine), 0f, magnitude);
return lStart + (vector * num2);
}