射線與平面相交

當(dāng)平面上取不相等的任意兩個(gè)點(diǎn)組成一個(gè)向量,與平面的法線總是垂直的,向量垂直點(diǎn)乘為0,因此可以通過(guò)一個(gè)點(diǎn)和一個(gè)法線來(lái)定義,plane方程如下:(P - P0)·N = 0
N=normal,P0表示平面上的一個(gè)點(diǎn),P表示平面上的任意點(diǎn),當(dāng)P = P0時(shí) 0·N = 0

射線方程在上一次寫(xiě)過(guò),聯(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)

  1. 當(dāng) D·N = 0 時(shí),表示射線與平面垂直,則射線與平面平行。
  • 解出 t < 0 時(shí),表示 射線沿著平面相反的半平面發(fā)射,也是不相交的(當(dāng)然如果是直線就沒(méi)關(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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容