S01E05:点到平面的最近点(投影点、垂足)

1,268 阅读1分钟

说明

上一篇中,我们已经得到了点到平面的距离,要求投影点坐标,可以利用已经得到的距离。

几何

按照前面的过程,我们已经得到了向量 AC 在平面法线上的投影长,即向量 AD 的长度。那么求投影点坐标,只需要将 C 点沿着某个方向移动一定长度就可以了,移动长度等于 C 到平面的距离,方向等于平面法线 AB 方向。

代码

static func projectionOnPlane(from point:simd_float3, to plane:Plane) -> simd_float3 {
// 这里还需要用到 vector 变更,所以将`projectionOnPlane(from point:simd_float3, to plane:Plane)`中的代码直接重写一遍
    let vector = point - plane.position
    let normalizedNormal = normalize(plane.normal)
    
    let dotValue = dot(vector, normalizedNormal)
    let tarPoint = point - dotValue * normalizedNormal
    return tarPoint
}

这里用到了点到平面距离的方向性,即正负号代表了点在法线的正方向还是负方向。这里需要注意:当点在平面背面时,应该沿法线移动;当点在平面正方向时,应沿法线反方向移动。