一種基于包圍盒與空間劃分的虛擬物體碰撞檢測(cè)方法
【技術(shù)領(lǐng)域】
[0001 ]本發(fā)明屬于虛擬現(xiàn)實(shí)中的虛擬裝配領(lǐng)域,具體涉及一種基于包圍盒與空間劃分的 虛擬物體碰撞檢測(cè)方法。
【背景技術(shù)】
[0002] 虛擬現(xiàn)實(shí)(virtual reality)技術(shù)是一種可以在虛擬環(huán)境中完成一系列動(dòng)作的計(jì) 算機(jī)技術(shù),隨著計(jì)算機(jī)軟硬件的不斷發(fā)展,虛擬環(huán)境的搭建越發(fā)完整,功能越發(fā)完善。虛擬 裝配技術(shù)是虛擬現(xiàn)實(shí)技術(shù)在設(shè)計(jì)與制造領(lǐng)域的重要應(yīng)用之一,它已經(jīng)引起了企業(yè)和研究機(jī) 構(gòu)的廣泛關(guān)注。虛擬裝配技術(shù)的發(fā)展與計(jì)算機(jī)技術(shù)、虛擬現(xiàn)實(shí)技術(shù)的發(fā)展緊密相關(guān),近年來(lái) 也取得了較好的發(fā)展,有些虛擬裝配系統(tǒng)已經(jīng)走出實(shí)驗(yàn)室,走進(jìn)了企業(yè)。虛擬裝配利用計(jì)算 機(jī)工具,而不需產(chǎn)品或者支持過(guò)程的物理實(shí)現(xiàn),通過(guò)分析、預(yù)建模、可視化、數(shù)據(jù)表示等進(jìn)行 或者輔助進(jìn)行裝配相關(guān)的工程決策。
[0003] 基于虛擬現(xiàn)實(shí)的產(chǎn)品虛擬拆裝技術(shù)在新產(chǎn)品開(kāi)發(fā)、產(chǎn)品的維護(hù)以及操作培訓(xùn)方面 具有獨(dú)特的作用,在操作過(guò)程中系統(tǒng)提供實(shí)時(shí)的碰撞檢測(cè)、裝配約束處理、裝配路徑與序列 處理等功能,從而使得用戶能夠?qū)Ξa(chǎn)品的可裝配性進(jìn)行分析、對(duì)產(chǎn)品零部件裝配序列進(jìn)行 驗(yàn)證和規(guī)劃、對(duì)裝配操作人員進(jìn)行培訓(xùn)等。利用虛擬裝配,可以驗(yàn)證裝配設(shè)計(jì)和操作的正確 與否,以便及早的發(fā)現(xiàn)裝配中的問(wèn)題,對(duì)模型進(jìn)行修改,并通過(guò)可視化顯示裝配過(guò)程。
[0004] 碰撞檢測(cè)是虛擬現(xiàn)實(shí),特別是虛擬裝配中所涉及的一項(xiàng)關(guān)鍵技術(shù),碰撞檢測(cè)就是 檢測(cè)虛擬環(huán)境中虛擬物體是否發(fā)生穿透現(xiàn)象,所以碰撞檢測(cè)對(duì)虛擬環(huán)境的真實(shí)性和實(shí)時(shí)性 起到關(guān)鍵作用。就碰撞檢測(cè)中檢測(cè)較為精確的方法而言,目前研究較成熟的方法為層次包 圍盒和空間分割法等,其中基于包圍盒的碰撞檢測(cè)方法是目前世界范圍內(nèi)研究和應(yīng)用較多 的碰撞檢測(cè)方法,但包圍盒之間的檢測(cè)會(huì)增加碰撞檢測(cè)誤判的可能性,就檢測(cè)較為準(zhǔn)確的 AABB層次包圍盒二叉樹(shù)方法來(lái)說(shuō),由于引入的檢測(cè)結(jié)點(diǎn)數(shù)過(guò)多,在一定情況下會(huì)導(dǎo)致檢測(cè) 效率的下降??臻g分割法在要求高精確度的碰撞檢測(cè)中常用,但這些較成熟的方法大都不 能滿足在實(shí)時(shí)檢測(cè)的情況下提供較精確的檢測(cè)結(jié)果。
[0005] 目前,相關(guān)的碰撞檢測(cè)方法已經(jīng)比較豐富,但是隨著虛擬現(xiàn)實(shí)技術(shù)的發(fā)展,工業(yè)應(yīng) 用上對(duì)碰撞檢測(cè)從真實(shí)性和實(shí)時(shí)性兩方面的要求也越來(lái)越高。國(guó)內(nèi)外學(xué)者對(duì)虛擬現(xiàn)實(shí)技術(shù) 方面的碰撞檢測(cè)方法研究比較多,但是真正能讓虛擬裝配技術(shù)應(yīng)用到工業(yè)上的碰撞檢測(cè)方 法卻較少。
【發(fā)明內(nèi)容】
[0006] 針對(duì)現(xiàn)有技術(shù)存在的問(wèn)題,本發(fā)明提供一種基于包圍盒與空間劃分的虛擬物體碰 撞檢測(cè)方法。
[0007] 本發(fā)明的技術(shù)方案是:
[0008] -種基于包圍盒與空間劃分的虛擬物體碰撞檢測(cè)方法,包括以下步驟:
[0009] 步驟1:對(duì)兩個(gè)不規(guī)則的虛擬物體進(jìn)行虛擬物體碰撞預(yù)檢測(cè);
[0010]步驟1.1:采用構(gòu)建AABB包圍盒的方法來(lái)查找兩個(gè)不規(guī)則的虛擬物體之間的可能 相交區(qū)域,即待檢測(cè)區(qū)域;
[0011]步驟1.2:根據(jù)兩個(gè)虛擬物體在待檢測(cè)區(qū)域中的點(diǎn)集,判斷當(dāng)前兩個(gè)虛擬物體產(chǎn)生 碰撞的可能性;
[0012]步驟2:對(duì)待檢測(cè)區(qū)域進(jìn)行區(qū)域分割;
[0013] 步驟2.1:根據(jù)虛擬物體的移動(dòng)方向確定分割平面;
[0014] 步驟2.2:根據(jù)分割平面將待檢測(cè)區(qū)域分割成K個(gè)子區(qū)域;
[0015] 步驟3:在待檢測(cè)區(qū)域劃分好的各個(gè)子區(qū)域中進(jìn)行相交測(cè)試;
[0016] 步驟3.1:將移動(dòng)的虛擬物體表面視為由多個(gè)極小的點(diǎn)構(gòu)成,各點(diǎn)定義為點(diǎn)向量; 將當(dāng)前不需要裝配的虛擬物體視為由無(wú)數(shù)個(gè)三角面包圍而成;
[0017] 步驟3.2:利用代表移動(dòng)中的虛擬物體的點(diǎn)向量集合以及代表當(dāng)前不需要裝配的 虛擬物體的三角面,檢測(cè)移動(dòng)前后的點(diǎn)向量集合與三角面所在平面的位置關(guān)系;
[0018] 步驟3.3:利用點(diǎn)向量移動(dòng)前后所形成的空間線段與三角面相交狀態(tài),進(jìn)行虛擬物 體碰撞檢測(cè):若相交,則兩個(gè)虛擬物體發(fā)生碰撞,否則兩個(gè)虛擬物體不發(fā)生碰撞。
[0019] 所述步驟1.1具體步驟如下:
[0020] 步驟1.1.1:構(gòu)建兩個(gè)虛擬物體的AABB包圍盒,該AABB包圍盒被定義為包含虛擬物 體且各邊平行于坐標(biāo)軸的最小六面體;
[0021 ]所述構(gòu)建兩個(gè)虛擬物體的AABB包圍盒的方法如下:
[0022] 通過(guò)遍歷虛擬物體中的每一個(gè)頂點(diǎn)并找出頂點(diǎn)X坐標(biāo)的最小值Xmin、X坐標(biāo)的最大 值Xmax、Y坐標(biāo)的最小值Ymin、Y坐標(biāo)的最大值Ym ax、Z坐標(biāo)的最小值Zmin、Z坐標(biāo)的最大值Zmax,用 這六個(gè)值構(gòu)成最小六面體的八個(gè)頂點(diǎn),構(gòu)建出給定虛擬物體的AABB包圍盒。
[0023] 步驟1.1.2:利用構(gòu)建出的虛擬物體的AABB包圍盒在X、Y、Z軸上的最大值和最小 值,分別確定虛擬物體在3個(gè)坐標(biāo)軸上的投影區(qū)間;
[0024] 步驟1.1.3:判斷兩個(gè)虛擬物體的AABB包圍盒在3個(gè)坐標(biāo)軸上的投影區(qū)間是否都重 疊:若是,則兩個(gè)虛擬物體的AABB包圍盒相交,對(duì)兩個(gè)相交的AABB包圍盒的軸向坐標(biāo)求交 集,包括兩個(gè)相交的AABB包圍盒的在X軸上投影的交集、兩個(gè)相交的AABB包圍盒的在Y軸上 投影的交集、兩個(gè)相交的AABB包圍盒的在Z軸上投影的交集,執(zhí)行步驟1.1.4;否則,兩個(gè)虛 擬物體的AABB包圍盒不相交,兩個(gè)虛擬物體不可能發(fā)生碰撞,結(jié)束檢測(cè);
[0025]步驟1.1.4:利用兩個(gè)相交的AABB包圍盒的在X軸上投影的交集、兩個(gè)相交的AABB 包圍盒的在Y軸上投影的交集、兩個(gè)相交的AABB包圍盒的在Z軸上投影的交集,構(gòu)成待檢測(cè) 區(qū)域。
[0026] 所述步驟1.2的具體步驟如下:
[0027] 步驟1.2.1:分別確定兩個(gè)虛擬物體在待檢測(cè)區(qū)域中的點(diǎn)集;
[0028] 步驟1.2.2:若兩個(gè)點(diǎn)集中至少一個(gè)為空集,則表明當(dāng)前兩個(gè)虛擬物體中至少有一 個(gè)在待檢測(cè)區(qū)域中不存在點(diǎn),則兩個(gè)虛擬物體不可能產(chǎn)生碰撞;
[0029] 步驟1.2.3:若兩個(gè)點(diǎn)集均非空,則表明當(dāng)前兩個(gè)虛擬物體在待檢測(cè)區(qū)域中都存在 點(diǎn),則兩個(gè)虛擬物體可能產(chǎn)生碰撞,執(zhí)行步驟2。
[0030] 所述步驟2.1中確定分割平面的方法如下:取待檢測(cè)區(qū)域中任一點(diǎn),利用其移動(dòng)前 后兩位置所形成的線段投影到X、Y、Z坐標(biāo)軸上,選取投影最短的坐標(biāo)軸,以該坐標(biāo)軸正方向 為法向量確定分割平面。
[0031 ]所述步驟3.2的具體步驟如下:
[0032]步驟3.2.1:將三角面點(diǎn)化;
[0033]步驟3.2.2:判斷移動(dòng)前后點(diǎn)向量集合的位置是否分布在三角面所在平面的兩側(cè): 是,則點(diǎn)向量移動(dòng)可能會(huì)與三角面產(chǎn)生碰撞,否則點(diǎn)向量移動(dòng)不會(huì)與三角面產(chǎn)生碰撞。 [0034]所述步驟3.2.2的具體步驟如下:
[0035]步驟3.2.2.1:利用三角面的兩條邊向量,求得三角面所在平面法向量N;
[0036] Vi = b-a
[0037] v2 = c-a
[0038] N=Normalize(Vi X V2)
[0039] 其中,a、b、c分別為三角面的三個(gè)頂點(diǎn),別是三角面的兩條邊向量, Normalize是將兩條邊向量單位化處理;
[0040] 步驟3.2.2.2:利用三角面所在平面法向量N及移動(dòng)前后點(diǎn)向量的位置坐標(biāo),求得 三角面所在平面距離原點(diǎn)的距離、移動(dòng)前后點(diǎn)向量在三角面所在平面法向量N上的投影; [0041 ] D = N · a
[0042] Dqi = N · Qi
[0043] Dq2 = N · Q2
[0044] 其中,D表示頂點(diǎn)a在三角面所在平面法向量N上的投影,即三角面所在平面距離原 點(diǎn)的距離,Ql、Q2分別代表移動(dòng)前后點(diǎn)向量的位置坐標(biāo),Dql、Dq2分別代表Ql、Q2在三角面所在 平面法向量N上的投影;
[0045] 步驟3.2.2.3:計(jì)算移動(dòng)前點(diǎn)向量在三角面所在平面法向量N上的投影與三角面所 在平面距離原點(diǎn)的距離之差Di、移動(dòng)后點(diǎn)向量在三角面所在平面法向量N上的投影與三角 面所在平面距離原點(diǎn)的距離之差D 2;
[0046] Di = Dqi-D
[0047] D2 = Dq2-D
[0048] 步驟3.2.2.4:判斷移動(dòng)前后當(dāng)前點(diǎn)向量的位置是否分布在當(dāng)前三角面所在平面 的兩側(cè):如果Di、D2同號(hào),則當(dāng)前點(diǎn)向量移動(dòng)前后的位置在當(dāng)前三角面所在平面的同側(cè),該點(diǎn) 向量的移動(dòng)不會(huì)與當(dāng)前三角面產(chǎn)生碰撞,結(jié)束檢測(cè);如果Di、D 2異號(hào),則當(dāng)前點(diǎn)向量移動(dòng)前后 的位置在當(dāng)前三角面所在平面的兩側(cè),該點(diǎn)向量的移動(dòng)可能會(huì)與當(dāng)前三角面產(chǎn)生碰撞,執(zhí) 行步驟3.3。
[0049] 所述步驟3.3具體步驟如下:
[0050] 步驟3.3.1:確定空間中穿過(guò)移動(dòng)前后點(diǎn)向量在三角面所在平面法向量N上的投影 的直線參數(shù)方程;
[0051]
[0052]其中,Dql、Dq2分別代表移動(dòng)前后點(diǎn)向量的位置坐標(biāo)&、〇2在三角面所在平面法向量 N上的投影;
[0053] 步驟3.3.2:確定空間平面的點(diǎn)法式方程;
[0054] N.XX (χ-a.x)+N.y X (y-a.y)+N. z X (z~a. z) =0
[0055] 其中,N為三角面所在平面法向量,a為三角面頂點(diǎn);
[0056] 步驟3.3.3:根據(jù)步驟3.3.1中的直線參數(shù)方程和步驟3.3.2中的空間平面的點(diǎn)法 式方程,求出參數(shù)t的值;
[0057]
[0058]步驟3.3.4:將步驟3.3.3中求出的t值帶入到步驟3.3.1中的直線參數(shù)方程中,求 得點(diǎn)向量移動(dòng)前和移動(dòng)后的位置所在直線與三角面所