當(dāng)平面上取不相等的任意兩個(gè)點(diǎn)組成一個(gè)向量堡赔,與平面的法線總是垂直的殉疼,向量垂直點(diǎn)乘為0欢搜,因此可以通過一個(gè)點(diǎn)和一個(gè)法線來定義乾胶,plane方程如下:(P - P0)·N = 0
N=normal抖剿,P0表示平面上的一個(gè)點(diǎn),P表示平面上的任意點(diǎn)识窿,當(dāng)P = P0時(shí) 0·N = 0
射線方程在上一次寫過斩郎,聯(lián)立兩個(gè)方程式可求交點(diǎn)。方程如下:
( O + D·t - P0 )·N = 0
=> ( O - P0 )·N + D·N·t = 0
=> t = ( P0 - O)·N / D·N ( 其中D·N ≠0 )
注意兩點(diǎn)
- 當(dāng)
D·N = 0
時(shí)喻频,表示射線與平面垂直缩宜,則射線與平面平行。
- 解出 t < 0 時(shí)甥温,表示 射線沿著平面相反的半平面發(fā)射锻煌,也是不相交的(當(dāng)然如果是直線就沒關(guān)系啦)
代碼很容易翻譯,如下:
bool Intersect(const Ray& ray, const Plane& plane, float& t0)
{
Vector3 p0o = plane.GetPosition() - ray.GetOrigin();
float dotDN= dot(ray.GetDirection(), plane.GetNormal());
//平行
//絕對(duì)值表明從兩面交平面都是成立的
if (fabs(dotDN) < FLOAT_EPISLON)
{
return false;
}
t0 = dot(p0o, plane.GetNormal()) / determin;
return t0 > 0;
}