平面與三維網(wǎng)格求交

平面與網(wǎng)格相交

計算截面與三角形網(wǎng)格的相交可以分解為三角形面與平面的相交瀑粥。而三角形面與平面的相交又可以分解為線段與平面的相交竭宰,那么現(xiàn)在問題就變?yōu)榱?strong>線段與平面相交的計算。

直線–平面相交

在3D中留量,直線 L或者平行于平面π或者與平面π相交于一點吼具。
  描述L的函數(shù)是 $L = P(s) = P_0 + s(P_1-P_0) = P_0 + su$  
  描述平面π可以用平面上一點$V_0$和法線n表示

是否平行

如果直線與平面平行,則直線與平面不交
  u表示直線的法線从橘,如果$n·u=0$念赶,那就意味著直線法向量 u垂直于平面法向量n。如果成立恰力,直線 L和平面π平行叉谜,即或者不相交,或者完全在平面p內(nèi)踩萎。通過驗證L上是否存在點P在平面π內(nèi)停局,可以判斷L和平面π是否相交,也就是說是否滿足隱式直線方程:$n·(P-V_0) = 0$香府。

直線與平面相較于平面內(nèi)一點

如果直線和平面不平行董栽,即直線L和平面π相交于點$P(s_I)$,利用類似于2D中兩條直線相交的方法企孩,我們可以計算出點P(sI)的值锭碳。如圖所示:

圖片
圖片

在相交點,當$w=P_0-V_0$勿璃,向量$P(s)-V_0 = w+su$垂直于n擒抛。這等同于點乘:$n · (w+su) = 0$推汽。求解得出:
$$s_I=\frac{-n \cdot w}{n\cdot u} = \frac{n \cdot (V_0-P0)}{n \cdot(P_1 - P_0)} $$

線段-直線相交

如果L 是從$P_0$到$P_1$的有限線段,我們必須檢查sI是否滿足 $0<= s_I <=1$歧沪,從而證明線段和平面是否相交歹撒。對于正方向的射線,當$s_I >=0$時诊胞,和平面相交暖夭。
而交點的坐標就等于$P(s_I ) = P_0 + s_I (P_1-P_0) = P_0 + s_I u$

需要處理的特殊情況是$n·(P_1-P_0) = 0$時,即線段與平面平行厢钧,這時由于除數(shù)為0不能計算鳞尔,只需要判斷P1在平面內(nèi)即可(計算平面方程$n·(V_0 - P_0) = 0$)

float lineCrossFace(glm::vec3& point0,glm::vec3& point1,glm::vec3& v0,glm::vec3& normals)
{
    glm::vec3 ver = point1 - point0;
    float norDotVer = glm::dot(normals,ver);
    if (norDotVer == 0)
    {
        if (glm::dot(normals,(v0 - point1)) == 0)
        {
            return 1;
        }
        return -1;
    }
    float scale = (glm::dot(normals,(v0 - point0)))/norDotVer;
    return scale;
}
 

平面與網(wǎng)格相交實現(xiàn)

有了lineCrossFace,函數(shù)計算線段與平面相交,現(xiàn)在只需要將網(wǎng)格的每一條邊作為一個線段遍歷和平面求交就完成了早直。

 
 std::vector<glm::vec3>  sectionLine(std::vector<glm::vec4>& vertex,
                                                   std::vector<glm::ivec3>& indexArray,
                                                   glm::vec3& normal, glm::vec3& surfacePoint)
{
    std::vector<glm::vec3> sectionLine;
        normal = glm::normalize(normal);
        int crossPointIndex = 0;
        glm::vec3 curCrossVec[2];
        for (auto index : indexArray)
        {
            if (crossPointIndex == 2)
            {
                glm::vec3 point0 = curCrossVec[0];
                glm::vec3 point1 = curCrossVec[1];
                sectionLine.push_back(point0);
                sectionLine.push_back(point1);
            }
            crossPointIndex = 0;
            for (int lineIndex = 0;lineIndex < 3;lineIndex++)
            {
                float scale = lineCrossFace(vertex[index[lineIndex]],
                    vertex[index[(lineIndex+1)%3]],
                    surfacePoint,normal);
                if (scale <= 1 && scale > 0)
                {
                    curCrossVec[crossPointIndex] = scale * (vertex[index[(lineIndex+1)%3]] -
                            vertex[index[lineIndex]]) + vertex[index[lineIndex]];
                    ++crossPointIndex;
                }
                else if (scale == 0)
                {
                    curCrossVec[crossPointIndex] = vertex[index[lineIndex]];
                    ++crossPointIndex;
                }
 
                if ( crossPointIndex > 1)
                    break;
            }
        }
 
    return sectionLine;
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寥假,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子霞扬,更是在濱河造成了極大的恐慌糕韧,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喻圃,死亡現(xiàn)場離奇詭異萤彩,居然都是意外死亡,警方通過查閱死者的電腦和手機斧拍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門雀扶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肆汹,你說我怎么就攤上這事愚墓。” “怎么了昂勉?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵浪册,是天一觀的道長。 經(jīng)常有香客問我岗照,道長村象,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任攒至,我火速辦了婚禮厚者,結果婚禮上,老公的妹妹穿的比我還像新娘迫吐。我一直安慰自己库菲,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布渠抹。 她就那樣靜靜地躺著蝙昙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梧却。 梳的紋絲不亂的頭發(fā)上奇颠,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音放航,去河邊找鬼烈拒。 笑死,一個胖子當著我的面吹牛广鳍,可吹牛的內(nèi)容都是我干的荆几。 我是一名探鬼主播颜屠,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼顿痪,長吁一口氣:“原來是場噩夢啊……” “哼斗幼!你這毒婦竟也來了姆坚?” 一聲冷哼從身側響起懒构,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤颅筋,失蹤者是張志新(化名)和其女友劉穎寻定,沒想到半個月后暴匠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竭缝,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡房维,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了抬纸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咙俩。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖湿故,靈堂內(nèi)的尸體忽然破棺而出阿趁,到底是詐尸還是另有隱情,我是刑警寧澤晓锻,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布歌焦,位于F島的核電站,受9級特大地震影響砚哆,放射性物質發(fā)生泄漏独撇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一躁锁、第九天 我趴在偏房一處隱蔽的房頂上張望纷铣。 院中可真熱鬧,春花似錦战转、人聲如沸搜立。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啄踊。三九已至忧设,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間颠通,已是汗流浹背址晕。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留顿锰,地道東北人谨垃。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像硼控,于是被迫代替她去往敵國和親刘陶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容