2011-12-16 235 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,那麼不需要劃分)。