這內容屬于計算幾何,在 3D游戲開發編程基礎 或者在游戲開發中的數學和物理算法?這種資料上也可以找到相關的內容和代碼。或者更廣泛點稱為是計算機圖形學,
? ? ? 接下來我們進入正題,如果直線不與平面平行,將存在交點。如下圖所示,已知直線L過點m(m1,m2,m3),且方向向量為VL(v1,v2,v3),平面P過點n(n1,n2,n3),且法線方向向量為VP(vp1,vp2,vp3),
求得直線與平面的交點O的坐標(x,y,z):
? ? ? ?將直線方程寫成參數方程形式,即有:
x = m1+ v1 * ty = m2+ v2 * t (1)式z = m3+ v3 * t
? ? ? ?將平面方程寫成點法式方程形式,即有:
vp1 * (x – n1) + vp2 * (y – n2) + vp3 * (z – n3) = 0 (2)式
? ? ? ?則直線與平面的交點一定滿足式(1)式和(2)式,聯立兩式,求得:
t = ((n1 – m1)*vp1+(n2 – m2)*vp2+(n3 – m3)*vp3) / (vp1* v1+ vp2* v2+ vp3* v3) (3)式
? ? ? 如果(3)式中分母(vp1* v1+ vp2* v2+ vp3* v3)為0,則表示直線與平面平行,即直線與平面沒有交點。求解出t后,然后將t代入式(1)即可求得交點O的坐標(x,y,z)。定義一個求直線與平面交點坐標的函數CalPlaneLineIntersectPoint(),
其代碼如下:
1 /// <summary> 2 /// 求一條直線與平面的交點 3 /// </summary> 4 /// <param name="planeVector">平面的法線向量,長度為3</param> 5 /// <param name="planePoint">平面經過的一點坐標,長度為3</param> 6 /// <param name="lineVector">直線的方向向量,長度為3</param> 7 /// <param name="linePoint">直線經過的一點坐標,長度為3</param> 8 /// <returns>返回交點坐標,長度為3</returns> 9 10 private float[] CalPlaneLineIntersectPoint(float[] planeVector, float[] planePoint, float[] lineVector, float[] linePoint) 11 { 12 float[] returnResult = new float[3]; 13 float vp1, vp2, vp3, n1, n2, n3, v1, v2, v3, m1, m2, m3, t,vpt; 14 vp1 = planeVector[0]; 15 vp2 = planeVector[1]; 16 vp3 = planeVector[2]; 17 n1 = planePoint[0]; 18 n2 = planePoint[1]; 19 n3 = planePoint[2]; 20 v1 = lineVector[0]; 21 v2 = lineVector[1]; 22 v3 = lineVector[2]; 23 m1 = linePoint[0]; 24 m2 = linePoint[1]; 25 m3 = linePoint[2]; 26 vpt = v1 * vp1 + v2 * vp2 + v3 * vp3; 27 //首先判斷直線是否與平面平行 28 if (vpt == 0) 29 { 30 returnResult = null; 31 } 32 else 33 { 34 t = ((n1 - m1) * vp1 + (n2 - m2) * vp2 + (n3 - m3) * vp3) / vpt; 35 returnResult[0] = m1 + v1 * t; 36 returnResult[1] = m2 + v2 * t; 37 returnResult[2] = m3 + v3 * t; 38 } 39 return returnResult; 40 } 41
?
參考了:http://m.blog.csdn.net/article/details?id=6688080