有时候,我们经常需要计算一个点P到平面上的投影(P'),简单的讲,这个投影点P'能满足|P-P'|为P到平面的最短距离。
简单介绍一下如何计算该算法
假设平面以三点式给出,三个顶点分别为p0,p1,p2
那么以P0为原点, v0 = P1-P0 , v1 = P2-P0.
[v0 , v1] 为该平面的一个基, 注意不是正交的。
所以平面上的任意一点为 Pt = P0 + t0 * v0 + t1 * v1;
因此对P',我们能满足 P-P' = P - (P0 + t0 * v0 + t1 * v1);
同样,因为P-P' 垂直平面,那么 P-P' 垂直该平面上任意一个向量
所以
(P-P') * v0 = 0
(P-P') * v1 = 0
==>
(P - P0 ) * v0= t0 * v0 *v0 + t1 * v1 *v0 ;
(P - P0 ) * v1= t0 * v0 *v1 + t1 * v1 *v1 ;
解一个二元一次方程,可以得到t0 ,和 t1的值。
代入 Pt = P0 + t0 * v0 + t1 * v1 , 可以得到所求的点。
//延伸
注意,如果要求点到三角形的最短距离,我们首先判断t0 , t1的范围。
如果t0,t1都在[0-1]区间内,并且t0+t1 < 1 的时候,那么P'在三角形内部。上面所求的点即为点到三角形最短距离。
当P'不在三角形内部的时候。那么请看下图。
根据几个边界条件选出一个边,计算出P'到该边的最近点,并且把得到的(t0,t1) clamp到[0-1]。得到的P''就是所求的最短距离