在3D中兩條射線的相交性檢測

摘自[3D數學基礎: 圖形與遊戲開發]spa

考慮在3D中兩條以參數形式定義的射線:遊戲

\(\vec{r_1}(t_1)=\vec{p_1}+t_1\vec{d_1}\)
\(\vec{r_2}(t_2)=\vec{p_2}+t_2\vec{d_2}\)遊戲開發

咱們可以解得它們的交點。暫時先不考慮\(t_1,t_2\)的取值範圍。所以,咱們考慮的是無限長的射線;一樣,向量\(\vec{d_1},\vec{d_2}\)也沒必要是單位向量。若是這兩條射線在一個平面中,那麼和前一節的狀況同樣,也存在有一種可能性:開發

  • 兩條射線交於一點;
  • 兩條射線平行,沒有交點;
  • 兩條射線重合,有無限多交點。

在3D中,還有第四種可能性:兩條射線不在一個平面中。數學

下面演示如何解得交點處的\(t_1,t_2\):class

\(\vec{r_1}(t_1)=\vec{r_2}(t_2)\)
\(\Rightarrow \vec{p_1}+t_1\vec{d_1}=\vec{p_2}+t_2\vec{d_2}\)
\(\Rightarrow t_1\vec{d_1}=\vec{p_2}+t_2\vec{d_2}-\vec{p_1}\)
\(\Rightarrow (t_1\vec{d_1})\times\vec{d_2} =(\vec{p_2}+t_2\vec{d_2}-\vec{p_1})\times\vec{d_2}\)
\(\Rightarrow t_1(\vec{d_1}\times\vec{d_2}) =t_2(\vec{d_2}\times\vec{d_2})+(\vec{p_2}-\vec{p_1})\times\vec{d_2}\)
\(\Rightarrow t_1(\vec{d_1}\times\vec{d_2}) =t_2\vec{0}+(\vec{p_2}-\vec{p_1})\times\vec{d_2}\)
\(\Rightarrow t_1(\vec{d_1}\times\vec{d_2})\cdot(\vec{d_1}\times\vec{d_2}) =(\vec{p_2}-\vec{p_1})\times\vec{d_2}\cdot(\vec{d_1}\times\vec{d_2})\)
\(\Rightarrow t_1 =\cfrac{(\vec{p_2}-\vec{p_1})\times\vec{d_2}\cdot(\vec{d_1}\times\vec{d_2})}{(\vec{d_1}\times\vec{d_2})\cdot(\vec{d_1}\times\vec{d_2})}\)
\(\Rightarrow t_1 =\cfrac{(\vec{p_2}-\vec{p_1})\times\vec{d_2}\cdot(\vec{d_1}\times\vec{d_2})}{\Vert\vec{d_1}\times\vec{d_2}\Vert^2}\)基礎

也能夠用相似的方法求出\(t_2\):方法

\(t_2 =\cfrac{(\vec{p_1}-\vec{p_2})\times\vec{d_1}\cdot(\vec{d_2}\times\vec{d_1})}{\Vert\vec{d_2}\times\vec{d_1}\Vert^2}\)im

\(\Rightarrow t_2 =\cfrac{(\vec{p_2}-\vec{p_1})\times\vec{d_1}\cdot(\vec{d_1}\times\vec{d_2})}{\Vert\vec{d_1}\times\vec{d_2}\Vert^2}\)浮點數

若是兩條射線平行或重合,\(\vec{d_1},\vec{d_2}\)的叉乘爲零,因此上面兩個等式的分母都爲零。若是兩條射線不在一個平面內,那麼\(\vec{r_1}(t_1),\vec{r_2}(t_2)\)是相距最近的點。經過檢查\(\vec{r_1}(t_1),\vec{r_2}(t_2)\)間的距離便可肯定兩條射線相交的狀況。固然,在實踐中,由於浮點數的精度問題,精確的相交不多出現,這時就須要用到一個誤差值。

上面的討論假設沒有限定\(t_1,t_2\)的取值範圍,若是射線的長度有限(或只沿一個方向沿伸),在計算出\(t_1,t_2\)後,還應做適當的邊界檢測。

相關文章
相關標籤/搜索