2011-12-16 158 views
1

所以我读了一些这个页面上(http://gamedeveloperjourney.blogspot.com/2009/04/point-plane-collision-detection.html距离(最短)

笔者提到

d = - D3DXVec3Dot(&vP1, &vNormal); 

其中VP1是在平面上的点和vNormal是正常的到飞机。我很好奇这是怎么让你从世界起源的距离,因为结果将始终是0.此外,只是要清楚(因为我仍然是在平面方程的d部分朦胧),在平面方程中,d是从通过世界起源的直线到飞机起源的距离吗?

回答

6

在通用的情况下的点p和一个平面之间的距离可以通过

<p - p0, normal> 

其中<a, b>计算是点积操作

<a, b> = ax*bx + ay*by + az*bz 

并且其中p0是在一个点平面。

plane-point distance

n是统一长度的矢量之间的点积,它是矢量的对正常

公式您所报告的突起的(有符号的)长度仅仅是特殊情况下点p是原点。在这种情况下

distance = <origin - p0, normal> = - <p0, normal> 

这种平等是正式错误的,因为点积约矢量,没有点...但仍持有数字。写下明确的公式你得到

(0 - p0.x)*n.x + (0 - p0.y)*n.y + (0 - p0.z)*n.z 

相同

- (p0.x*n.x + p0.y*n.y + p0.z*n.z) 

确实是一个很好的方式来存储一个平面,以节省正常nk = <p0, n>的值,其中p0任何点在飞机上(k的值与您选择飞机的哪个点无关)。

+0

尽管法线是从表面平面的法线。如果该点已经是飞机上的一个点,那么它们将处于90度角,因此,答案将始终为0.我不明白这是从原点到飞机的距离,特别是如果飞机是飞机距离原点的随机距离。 此外,我确实从逻辑上和几何学角度上找出了点与表面的关系。唯一让我陷入困境的是这个。 – Ilya 2011-12-16 22:07:11

1

你可以用拉格朗日乘子法来解决这一问题:

你知道飞机上的最近点必须是这样的形式:

c = p + v 

哪里c是最近点与v是一个向量沿着飞机(因此与正常的n正交)。您正在尝试寻找具有最小范数(或范数平方)的c。因此,您正试图最小化dot(c,c),但vn正交(因此dot(v,n) = 0)。

因此,设置拉格朗日:

L = dot(c,c) + lambda * (dot(v,n)) 
L = dot(p+v,p+v) + lambda * (dot(v,n)) 
L = dot(p,p) + 2*dot(p,v) + dot(v,v) * lambda * (dot(v,n)) 

并采取相对于所述衍生物v(和设置为0)来获得:

2 * p + 2 * v + lambda * n = 0 

可以由以下等式在求解拉姆达以上由点生产双方n得到

2 * dot(p,n) + 2 * dot(v,n) + lambda * dot(n,n) = 0 
2 * dot(p,n) + lambda = 0 
lambda = - 2 * dot(p,n) 

再次请注意,dot(n,n) = 1dot(v,n) = 0(因为v在平面中,并且n与其正交)。然后subtitute lambda早在获得:

2 * p + 2 * v - 2 * dot(p,n) * n = 0 

和解决v获得:

v = dot(p,n) * n - p 

,接着再将这回c = p + v获得:

c = dot(p,n) * n 

这个向量的长度是|dot(p,n)|并且符号告诉您该点是否在从原点开始的法向矢量的方向上,还是与第e起源。

2

结果并不总是为零。如果飞机经过原点,结果只会为零。 (这里我们假设飞机没有穿过原点。)

基本上,您会得到一条从原点到飞机上某点的直线。 (即,你有一个从原点到vP1的矢量)。这个矢量的问题在于,它很可能是倾斜的,并且会飞到飞机上很远的地方,而不是飞机上的最近点。所以,如果你只是把vP1的长度,你会得到一个太大的距离。

你需要做的是将vP1投影到某个你知道垂直于平面的矢量上。那当然是vNormal。因此,取vP1和vNormal的点积,再除以vNormal的长度,就得到了答案。 (如果他们友善地给你一个已经是一级的vNormal,那么不需要划分)。