專(zhuān)利名稱(chēng):在網(wǎng)格表面和立體對(duì)象上產(chǎn)生和測(cè)量表面線(xiàn)的系統(tǒng)和方法以及網(wǎng)格分割技術(shù)(“曲線(xiàn)測(cè)量”)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及3D數(shù)據(jù)集合的交互顯示,更精確地說(shuō)涉及在網(wǎng)格表面和立體對(duì)象上產(chǎn)生和測(cè)量表面線(xiàn)的系統(tǒng)和方法。
背景技術(shù):
測(cè)量一個(gè)立體上的點(diǎn)之間的線(xiàn)性距離在可視醫(yī)學(xué)中是有用的定量工具。然而,3D空間中點(diǎn)之間的絕對(duì)線(xiàn)性距離的測(cè)量并不總是足夠的。經(jīng)常所需要的是在一個(gè)對(duì)象自身的表面上測(cè)量距離的能力,諸如,比方說(shuō),在手術(shù)計(jì)劃期間測(cè)量計(jì)劃開(kāi)顱的大小的時(shí)候、或者在計(jì)劃從身體的一個(gè)區(qū)域到另一個(gè)區(qū)域移植皮膚組織的時(shí)候。這種表面測(cè)量可以產(chǎn)生關(guān)于立體對(duì)象的其它有用信息,諸如,比方說(shuō),一個(gè)對(duì)象的尺寸沿著其部分表面隨時(shí)間的變化,諸如,比方說(shuō),黑素瘤的直徑,或者傷疤或皺紋的長(zhǎng)度。
常規(guī)的沿一個(gè)對(duì)象的表面測(cè)量一條線(xiàn)的方法包括,通過(guò)在所述對(duì)象的表面上作多個(gè)小的線(xiàn)性測(cè)量來(lái)對(duì)這樣一個(gè)測(cè)量作近似。然而,這種方法的操作會(huì)不夠精確并花費(fèi)時(shí)間。當(dāng)一個(gè)對(duì)象的表面有多條曲線(xiàn)時(shí),正確地進(jìn)行這種線(xiàn)性測(cè)量以便精確地對(duì)實(shí)際的表面測(cè)量作近似是困難的。
因此,目前大多數(shù)的軟件只允許在2D數(shù)據(jù)段上作測(cè)量。被限制到單一平面上的這種表面測(cè)量不能輕易地讓用戶(hù)在3D域中的任何點(diǎn)之間進(jìn)行表面測(cè)量。在這項(xiàng)技術(shù)中所需要的是一個(gè)沿著被限制在一個(gè)給定對(duì)象的表面上的曲線(xiàn)進(jìn)行測(cè)量的方便的方法。
發(fā)明內(nèi)容
給出了在網(wǎng)格表面和三維像素(體素,voxel)對(duì)象上產(chǎn)生表面線(xiàn)的系統(tǒng)和方法。在針對(duì)網(wǎng)格表面的本發(fā)明的示范性實(shí)施例中,這種方法包括預(yù)處理三角形網(wǎng)格數(shù)據(jù)結(jié)構(gòu)、為三角形網(wǎng)格對(duì)象構(gòu)造一個(gè)柵格數(shù)據(jù)結(jié)構(gòu)、表示三角形和頂點(diǎn)的關(guān)系、確定邊界的邊和頂點(diǎn)、計(jì)算一系列表面點(diǎn)、以及產(chǎn)生一條表面線(xiàn)。在本發(fā)明的示范性實(shí)施例中,這個(gè)技術(shù)能夠被用來(lái)沿著所產(chǎn)生的線(xiàn)切割網(wǎng)格表面。在本發(fā)明的示范性實(shí)施例中,能夠基于起點(diǎn)以及從起點(diǎn)到終點(diǎn)的矢量的方向,沿著一個(gè)任意曲面從起點(diǎn)A到終點(diǎn)B產(chǎn)生一條表面線(xiàn)。在這些實(shí)施例中,離起點(diǎn)有一小段位移的點(diǎn)被定義為參考點(diǎn),這種參考點(diǎn)能夠沿著由所定義的平面的法向所確定的軸轉(zhuǎn)動(dòng),以獲得一個(gè)初始表面點(diǎn)。利用每個(gè)獲得的表面點(diǎn)作為新的起點(diǎn)來(lái)重復(fù)上述過(guò)程,可以在一個(gè)三維像素對(duì)象的表面上從點(diǎn)A到點(diǎn)B產(chǎn)生一條表面線(xiàn)。在本發(fā)明的示范性實(shí)施例中,這種表面線(xiàn)能夠被用來(lái)測(cè)量所述三維像素對(duì)象的體積。
圖1描繪了根據(jù)本發(fā)明的一個(gè)示范性實(shí)施例的用于曲線(xiàn)測(cè)量的一個(gè)示范性起點(diǎn)的放置;圖2描繪了根據(jù)本發(fā)明的一個(gè)示范性實(shí)施例的用于曲線(xiàn)測(cè)量的一個(gè)示范性終點(diǎn)的放置;圖3描繪了根據(jù)本發(fā)明的一個(gè)示范性實(shí)施例在一個(gè)示范性表面上一條示例性曲線(xiàn)的產(chǎn)生;圖4描繪了根據(jù)本發(fā)明的一個(gè)示范性實(shí)施例在一個(gè)示范性表面上穿過(guò)網(wǎng)格邊界的一條示例性曲線(xiàn)的產(chǎn)生;圖5描繪了根據(jù)本發(fā)明的一個(gè)示范性實(shí)施例在一個(gè)示范性表面上穿過(guò)網(wǎng)格邊界的一條示例性曲線(xiàn)的產(chǎn)生;
圖6描繪了根據(jù)本發(fā)明的一個(gè)示范性實(shí)施例在一個(gè)三維像素體表面上產(chǎn)生一條線(xiàn)時(shí)一個(gè)初始參考點(diǎn)的獲得;圖7描繪了根據(jù)本發(fā)明的一個(gè)示范性實(shí)施例對(duì)圖6中的參考點(diǎn)所進(jìn)行的初始轉(zhuǎn)動(dòng);圖8(a)和(b)描繪了根據(jù)本發(fā)明的一個(gè)示范性實(shí)施例從圖6和圖7中的參考點(diǎn)進(jìn)行的向前掃描以及一個(gè)示范性三維像素體的表面點(diǎn)的探測(cè);圖9描繪了根據(jù)本發(fā)明的一個(gè)示范性實(shí)施例使用圖8(b)中所找到的表面點(diǎn)作為基礎(chǔ)尋找下一個(gè)參考點(diǎn);圖10描繪了根據(jù)本發(fā)明的一個(gè)示范性實(shí)施例從圖9中的參考點(diǎn)進(jìn)行的向前掃描以及示范性三維像素體的下一個(gè)表面點(diǎn)的探測(cè);圖11描繪了根據(jù)本發(fā)明的一個(gè)示范性實(shí)施例使用每一個(gè)獲得的表面點(diǎn)作為下一次掃描的基礎(chǔ)來(lái)重復(fù)這個(gè)過(guò)程;圖12描繪了根據(jù)本發(fā)明的一個(gè)示范性實(shí)施例進(jìn)行曲線(xiàn)測(cè)量時(shí)在一個(gè)三維像素體表面上放置一個(gè)示范性起點(diǎn);圖13描繪了根據(jù)本發(fā)明的一個(gè)示范性實(shí)施例進(jìn)行曲線(xiàn)測(cè)量時(shí)在一個(gè)三維像素體表面上放置一個(gè)示范性終點(diǎn);圖14描繪了根據(jù)本發(fā)明的一個(gè)示范性實(shí)施例在一個(gè)示范性三維像素體表面上一條示范性曲線(xiàn)的產(chǎn)生;圖14A分別描繪了根據(jù)本發(fā)明的一個(gè)示范性實(shí)施例的一個(gè)相交測(cè)試的頂視圖和側(cè)視圖。
圖14B-14D顯示了使用根據(jù)本發(fā)明的一個(gè)示范性實(shí)施例的方法所獲得的示范性測(cè)量結(jié)果;圖15描繪了根據(jù)本發(fā)明的一個(gè)示范性實(shí)施例的要進(jìn)行切割的一個(gè)網(wǎng)格表面;圖16描繪了根據(jù)本發(fā)明的一個(gè)示范性實(shí)施例的圖15中的畫(huà)出了切割區(qū)域的網(wǎng)格表面;圖17描繪了根據(jù)本發(fā)明的一個(gè)示范性實(shí)施例的圖15中的畫(huà)出了切割區(qū)域的線(xiàn)框模式的網(wǎng)格表面;
圖18-19分別描繪了根據(jù)本發(fā)明的一個(gè)示范性實(shí)施例的圖16和圖17中的移去了切割區(qū)域的網(wǎng)格表面;圖20-23顯示了根據(jù)本發(fā)明的一個(gè)示范性實(shí)施例的對(duì)圖15-19中的一個(gè)更為復(fù)雜的區(qū)域進(jìn)行的切割過(guò)程;圖24-25描繪根據(jù)本發(fā)明的一個(gè)示范性實(shí)施例延展一個(gè)已有的孔洞并完成其切割;圖26-30描繪了根據(jù)本發(fā)明的一個(gè)示范性實(shí)施例在一個(gè)三角形的水平上進(jìn)行的網(wǎng)格切割的細(xì)節(jié);以及圖31-39描繪了線(xiàn)框網(wǎng)格對(duì)象中網(wǎng)格切割的其它例子。
要注意,本專(zhuān)利或者說(shuō)本申請(qǐng)文件中包含至少一個(gè)彩色繪圖。在提出要求并支付所需費(fèi)用的情況下,可由美國(guó)專(zhuān)利局(US Patent Office)提供帶有彩色繪圖的本專(zhuān)利或本專(zhuān)利申請(qǐng)出版物的拷貝。
也要注意到,一些讀者或許只有灰度版的繪圖可用。因此,為了盡量全面地描述原始文本,繪圖中色彩的涉及有另外的描述,以指明正在描述的是什么元素或結(jié)構(gòu)。
具體實(shí)施例方式
本發(fā)明允許用戶(hù)在3D域中在一個(gè)對(duì)象的表面上直接指定任意兩點(diǎn),然后獲得連接起點(diǎn)到終點(diǎn)的測(cè)量線(xiàn)。用戶(hù)能夠?qū)崟r(shí)地交互地操作起點(diǎn)和終點(diǎn),能夠容易地對(duì)測(cè)量點(diǎn)進(jìn)行定位。也能夠?qū)崟r(shí)地產(chǎn)生連接起點(diǎn)和終點(diǎn)的表面線(xiàn),顯示其長(zhǎng)度,使用戶(hù)看到線(xiàn)的測(cè)量并作出所需要的調(diào)整。
醫(yī)學(xué)對(duì)象的兩個(gè)常用代表是三角形網(wǎng)格表面(triangle mesh surface)和三維像素體對(duì)象(voxel volume object)。本發(fā)明提供技術(shù),用于網(wǎng)格對(duì)象和三維像素體對(duì)象的表面線(xiàn)的產(chǎn)生。在本發(fā)明的示范性實(shí)施例中,只使用用戶(hù)所確定的兩個(gè)點(diǎn)就能測(cè)量曲面上距離。在本發(fā)明的示范性實(shí)施例中,用戶(hù)也能夠交互地放置這些點(diǎn),并實(shí)時(shí)地看到表面線(xiàn),也能夠去除已經(jīng)放置的點(diǎn)并重新開(kāi)始。
A.三角形網(wǎng)格表面線(xiàn)的產(chǎn)生實(shí)現(xiàn)1.三角形網(wǎng)格數(shù)據(jù)結(jié)構(gòu)的預(yù)處理為了能測(cè)量網(wǎng)格對(duì)象的各點(diǎn)之間的表面線(xiàn),用戶(hù)必須首先能夠在所述網(wǎng)格對(duì)象的表面上放置這些點(diǎn)。這就要求在由用戶(hù)工具方向(user tooldirection)所表示的線(xiàn)與網(wǎng)格的三角形表面之間進(jìn)行相交測(cè)試。為了便于實(shí)時(shí)指定表面上的點(diǎn),實(shí)現(xiàn)一個(gè)能夠快速計(jì)算所述三角形網(wǎng)格上的交點(diǎn)的有效算法是必要的。一條線(xiàn)與一個(gè)三角形的相交可以基于通過(guò)下述示范性偽代碼實(shí)現(xiàn)的示范性函數(shù)來(lái)計(jì)算函數(shù)名CheckForIntersectionWithTriangle輸入line(線(xiàn))-與所述三角形相交的一條線(xiàn)的起點(diǎn)和終點(diǎn)。
ptA、ptB、ptC-在其中進(jìn)行相交測(cè)試的三角形的三個(gè)點(diǎn)。
輸出flag(標(biāo)記)-指示是否發(fā)現(xiàn)了相交。True表示所述線(xiàn)與所指定的三角形發(fā)生了相交。
IntersectPt(交點(diǎn))-與所述三角形發(fā)生相交時(shí)的交點(diǎn)。
CheckForIntersectionWithTriangle ()計(jì)算從ptA到ptB的矢量計(jì)算從ptA到ptC的矢量通過(guò)計(jì)算上述兩個(gè)矢量的叉積來(lái)計(jì)算所述三角形的法向矢量歸一化所述法向矢量所述三角形的平面方程可表示為Ax+By+Cz+D=0D可以被計(jì)算出來(lái),因?yàn)閰?shù)Ax、By、Cz為法向矢量的分量通過(guò)解線(xiàn)方程和面方程可以找到與平面的相交處設(shè)所述交點(diǎn)被稱(chēng)為ptDIf發(fā)現(xiàn)有相交then
計(jì)算從ptA到ptD的矢量作為矢量A計(jì)算從ptB到ptD的矢量作為矢量B計(jì)算從ptC到ptD的矢量作為矢量C有了這三個(gè)矢量,可以計(jì)算角ADB、角BDC和角CDAif三個(gè)角度的和等于360度then交點(diǎn)ptD在三角形的內(nèi)部Return trueElseReturn falseElseReturn falseEnd function三角形網(wǎng)格能夠被表示為頂點(diǎn)和三角形的集合。頂點(diǎn)的集合包含著關(guān)于網(wǎng)格點(diǎn)的坐標(biāo)的信息。三角形集合包含著關(guān)于頂點(diǎn)的信息,而這些頂點(diǎn)構(gòu)成了網(wǎng)格的各個(gè)三角形。盡管這種表示對(duì)于畫(huà)出一個(gè)網(wǎng)格對(duì)象來(lái)說(shuō)簡(jiǎn)單而有效,但是這種數(shù)據(jù)通常所呈現(xiàn)的隨機(jī)空間順序使得上述相交測(cè)試的進(jìn)行變得困難。為了計(jì)算表面點(diǎn),基于上述偽代碼的相交測(cè)試將不得不在所有的三角形上進(jìn)行。盡管一條線(xiàn)與一個(gè)三角形的相交測(cè)試可以很快進(jìn)行,但是對(duì)于具有大量三角形的網(wǎng)格來(lái)說(shuō),這種方法在計(jì)算上就很昂貴。所以,在本發(fā)明的示范性實(shí)施例中,需要進(jìn)行預(yù)處理,將已有數(shù)據(jù)結(jié)構(gòu)更改為其它形式,以便于有效地計(jì)算表面點(diǎn)并產(chǎn)生表面線(xiàn)。
2.三角形網(wǎng)格對(duì)象的柵格數(shù)據(jù)結(jié)構(gòu)的構(gòu)造柵格數(shù)據(jù)結(jié)構(gòu)的目標(biāo)是將所述網(wǎng)格對(duì)象分為不同的更小的區(qū)域。基于網(wǎng)格對(duì)象的包圍體(bounding volume),所述網(wǎng)格對(duì)象可以被分為更小的塊。對(duì)網(wǎng)格對(duì)象中的每個(gè)三角形進(jìn)行處理,以確定含有該三角形的塊。在這個(gè)預(yù)處理步驟完成后,表示三角形網(wǎng)格邊界一部分的每個(gè)塊將在塊的邊界內(nèi)包含一系列的三角形。為了找到表面點(diǎn),首先需要確定與所述線(xiàn)相交的塊。這個(gè)計(jì)算很普通,可以輕易完成。一旦確定了所述塊,通過(guò)在與所述塊相關(guān)的三角形上進(jìn)行相交測(cè)試可以找到所述的表面點(diǎn)。這種作法很有效,因?yàn)槊總€(gè)塊只包含網(wǎng)格對(duì)象中的三角形的一個(gè)小子集。因此,使用這種數(shù)據(jù)結(jié)構(gòu)可以不必為了找到表面點(diǎn)而檢查網(wǎng)格上的所有的三角形,從而使計(jì)算更快更有效。
3.三角形和頂點(diǎn)的關(guān)系的表示這個(gè)預(yù)處理步驟的目的是產(chǎn)生,例如,一種數(shù)據(jù)結(jié)構(gòu),它能夠快速訪(fǎng)問(wèn)一個(gè)頂點(diǎn)的近鄰頂點(diǎn)。網(wǎng)格中的每個(gè)三角形由三個(gè)頂點(diǎn)構(gòu)成。對(duì)于每個(gè)頂點(diǎn),其三角形中的另外兩個(gè)頂點(diǎn)就是它的近鄰。三角形具有共同頂點(diǎn)表示這些三角形互相直接相連。通過(guò)處理網(wǎng)格對(duì)象中的每個(gè)三角形,就可以獲得一系列的頂點(diǎn)及與其直接相連的頂點(diǎn)。類(lèi)似地,可以獲得例如一系列的頂點(diǎn)及與其直接相連的三角形。這種結(jié)構(gòu)對(duì)于有效產(chǎn)生表面線(xiàn)以及提高計(jì)算網(wǎng)格上表面點(diǎn)的性能是重要的。
4.確定邊界上的邊和頂點(diǎn)這個(gè)預(yù)處理步驟的目的是產(chǎn)生一個(gè)數(shù)據(jù)結(jié)構(gòu),該數(shù)據(jù)結(jié)構(gòu)維持著一系列指定網(wǎng)格對(duì)象邊界的頂點(diǎn)。在網(wǎng)格中,每個(gè)三角形由三條邊構(gòu)成。一個(gè)三角形的某個(gè)邊也可以是網(wǎng)格中其它三角形的邊。在這種情況下,該邊是一個(gè)公共邊。所以,不是公共邊的邊就是網(wǎng)格對(duì)象的邊界上的邊。使用從上述構(gòu)造的數(shù)據(jù)結(jié)構(gòu)中得來(lái)的結(jié)果,容易確定網(wǎng)格對(duì)象的邊界上的邊。由于在網(wǎng)格對(duì)象的邊界上每個(gè)邊被連接到其它的邊,所以可以追蹤界定網(wǎng)格對(duì)象的某個(gè)具體邊界的邊。這個(gè)預(yù)處理結(jié)束后,可以得到網(wǎng)格對(duì)象的邊界以及與每個(gè)邊界相關(guān)的頂點(diǎn)。這個(gè)信息是表面線(xiàn)的產(chǎn)生過(guò)程所需要的,其中所述線(xiàn)與網(wǎng)格對(duì)象的邊界相交。下面給出的偽代碼中顯示了預(yù)處理階段的程序流。
在本發(fā)明的示范性實(shí)施例中,下面的偽代碼可以,例如,被用來(lái)實(shí)現(xiàn)表面點(diǎn)計(jì)算的預(yù)處理階段。
預(yù)處理階段的示范性偽代碼函數(shù)名GenerateGridStructureForMesh輸入網(wǎng)格對(duì)象數(shù)據(jù)結(jié)構(gòu),包括表示每個(gè)三角形的頂點(diǎn)的陣列表示每個(gè)頂點(diǎn)的坐標(biāo)的陣列輸出柵格結(jié)構(gòu),包括塊的陣列,這些塊構(gòu)成了網(wǎng)格對(duì)象的包圍空間(bounding box)與這些塊中的每一個(gè)塊相關(guān)的一系列三角形GenerateGridStructureForMesh()通過(guò)檢查網(wǎng)格對(duì)象的所有頂點(diǎn)的坐標(biāo)來(lái)計(jì)算minimum X、Y、Z值通過(guò)檢查網(wǎng)格對(duì)象的所有頂點(diǎn)的坐標(biāo)來(lái)計(jì)算maximum X、Y、Z值StepX=(maximumX-minimumX)/x軸方向上塊的數(shù)量StepY=(maximumY-minimumY)/y軸方向上塊的數(shù)量StepZ=(maximumZ-minimumZ)/z軸方向上塊的數(shù)量For網(wǎng)格對(duì)象中的每個(gè)三角形獲取該三角形的頂點(diǎn)獲取該三角形的坐標(biāo)通過(guò)檢查該三角形的三個(gè)頂點(diǎn)的坐標(biāo)來(lái)獲取min X、Y、Z值通過(guò)檢查該三角形的三個(gè)頂點(diǎn)的坐標(biāo)來(lái)獲取max X、Y、Z值采用下面的公式計(jì)算包含該三角形的塊StartX=(minX-minimumX)/StepXEndX=(maxX-minimumX)/StepXStartY=(minY-minimumY)/StepYEndY=(maxY-minimumY)/StepYStartZ=(minZ-minimumZ)/StepZ
EndZ=(maxZ-minimumZ)/StepZFor x=StartX to EndXFor y=StartY to EndYFor z=StartZ to EndZ將該三角形加入到與索引為(x,y,z)的所述塊相關(guān)的列表NextNextNextNextEnd function函數(shù)名ConstructVertexLinkStructure輸入網(wǎng)格對(duì)象數(shù)據(jù)結(jié)構(gòu),包括表示每個(gè)三角形的頂點(diǎn)的陣列表示每個(gè)頂點(diǎn)的坐標(biāo)的陣列輸出相連三角形的陣列。該陣列的每個(gè)元素是連接到參考頂點(diǎn)的一系列三角形。
相鄰頂點(diǎn)的陣列。該陣列的每個(gè)元素是連接到參考頂點(diǎn)的一系列相鄰頂點(diǎn),且不管由這些頂點(diǎn)與參考頂點(diǎn)所構(gòu)成的邊是否被公用ConstructVertexLinkStructure()For網(wǎng)格對(duì)象中的每個(gè)三角形設(shè)定當(dāng)前參考頂點(diǎn)為該三角形的第一個(gè)頂點(diǎn)該頂點(diǎn)的近鄰頂點(diǎn)為該三角形的第二和第三頂點(diǎn)將相鄰的頂點(diǎn)加入到與當(dāng)前參考頂點(diǎn)相關(guān)的列表中If這些相鄰的頂點(diǎn)已經(jīng)在列表中了這表明由參考頂點(diǎn)及相鄰頂點(diǎn)限定的邊與其它三角形共享。設(shè)定公享邊為trueEnd if將當(dāng)前的三角形加入到與當(dāng)前參考頂點(diǎn)相關(guān)的相連三角形的列表中設(shè)定當(dāng)前參考頂點(diǎn)為該三角形的第二頂點(diǎn)該頂點(diǎn)的近鄰頂點(diǎn)為該三角形的第一和第三頂點(diǎn)將鄰近頂點(diǎn)加入到與當(dāng)前參考頂點(diǎn)相關(guān)的列表中If這些鄰近頂點(diǎn)已經(jīng)在列表中了這表明由所述參考頂點(diǎn)及相鄰頂點(diǎn)限定的邊與其它三角形共享。設(shè)定公享邊為trueEnd if將當(dāng)前三角形加入到與當(dāng)前參考頂點(diǎn)相關(guān)的相連三角形的列表中設(shè)定當(dāng)前參考頂點(diǎn)為該三角形的第三頂點(diǎn)該頂點(diǎn)的近鄰頂點(diǎn)為該三角形的第一和第二頂點(diǎn)將近鄰頂點(diǎn)加入到與當(dāng)前參考頂點(diǎn)相關(guān)的列表中If這些近鄰頂點(diǎn)已經(jīng)在列表中了這表明由參考所述頂點(diǎn)及相鄰頂點(diǎn)限定的邊與其它三角形共享。設(shè)定公享邊為trueEnd if將當(dāng)前三角形加入到與當(dāng)前參考頂點(diǎn)相關(guān)的相連三角形的列表中NextEnd function函數(shù)名ConstructBoundaryStructure輸入網(wǎng)格對(duì)象數(shù)據(jù)結(jié)構(gòu),包括表示每個(gè)三角形的頂點(diǎn)的陣列表示每個(gè)頂點(diǎn)的坐標(biāo)的陣列輸出邊界列表的陣列,每個(gè)列表表示頂點(diǎn)的一個(gè)集合,這些頂點(diǎn)指定了網(wǎng)格對(duì)象上孔洞的邊界ConstructBoundaryStructure()For網(wǎng)格對(duì)象中的每個(gè)頂點(diǎn)If該頂點(diǎn)被處理過(guò)了thenGet網(wǎng)格對(duì)象中的下一個(gè)頂點(diǎn)Get與該頂點(diǎn)相連的近鄰頂點(diǎn)的列表For與該當(dāng)前頂點(diǎn)相連的每個(gè)頂點(diǎn)If由相連頂點(diǎn)到當(dāng)前頂點(diǎn)所構(gòu)成的邊不是公共的這表明該相連頂點(diǎn)位于孔洞的邊界上Loop指派該相連頂點(diǎn)為當(dāng)前頂點(diǎn)將該頂點(diǎn)標(biāo)記為已處理過(guò)將該頂點(diǎn)加入到表示該孔洞邊界的列表中檢查當(dāng)前頂點(diǎn)的相連頂點(diǎn),尋找下一個(gè)位于該孔洞邊界上的相連頂點(diǎn)If沒(méi)有發(fā)現(xiàn)其它的邊界頂點(diǎn),exit loopEnd loopEnd ifNextNextEnd function函數(shù)名PerformSetup輸入
網(wǎng)格對(duì)象數(shù)據(jù)結(jié)構(gòu),包括表示每個(gè)三角形的頂點(diǎn)的陣列表示每個(gè)頂點(diǎn)的坐標(biāo)的陣列PerformSetup()GenerateGridStru ctureForMesh()ConstructVertexLinkStructure()ConstructBoundaryStructure()End function5.計(jì)算表面點(diǎn)在本發(fā)明的示范性實(shí)施例中,為了產(chǎn)生一條表面線(xiàn),用戶(hù)要能夠在網(wǎng)格對(duì)象的表面上指定起點(diǎn)和終點(diǎn)。所述表面點(diǎn)可以被確定為一條射線(xiàn)(由虛擬工具的方向形成)與網(wǎng)格對(duì)象表面的交點(diǎn)??梢赃M(jìn)行快速相交測(cè)試,以檢查與柵格數(shù)據(jù)結(jié)構(gòu)中的任何塊的相交情況。一旦獲得了要找的塊,可以在與這些塊相關(guān)的三角形上進(jìn)行相交測(cè)試,以確定網(wǎng)格對(duì)象上實(shí)際的表面點(diǎn)。由于相關(guān)三角形的數(shù)目比網(wǎng)格對(duì)象中三角形的總數(shù)要顯著地少,所以這種方法是有效的,并能夠讓用戶(hù)實(shí)時(shí)地更新表面點(diǎn)。
為了進(jìn)一步提高計(jì)算表面點(diǎn)的效率,可以使用一種啟發(fā)式方法并將之集成到上述程序中??梢钥吹?,一旦用戶(hù)在網(wǎng)格對(duì)象上指定了一個(gè)初始表面點(diǎn),隨后對(duì)該表面點(diǎn)的調(diào)整可以產(chǎn)生一個(gè)離以前的點(diǎn)很近的一個(gè)新點(diǎn)。利用這個(gè)事實(shí),一旦獲得了初始的三角形表面,隨后的相交測(cè)試就可以被限制到與初始三角形鄰近的三角形上。這就使計(jì)算非??欤?yàn)榻徣切蔚臄?shù)目通常非常少。由于有先前的預(yù)處理階段,可以快速而容易地獲得鄰近的三角形。這種聯(lián)合方法可以快速而有效的計(jì)算表面點(diǎn),而表面點(diǎn)是用戶(hù)有效定義表面測(cè)量的起點(diǎn)和終點(diǎn)所需要的。下面給出計(jì)算表面點(diǎn)的示范性偽代碼。因此,在本發(fā)明的示范性實(shí)施例中,下面的偽代碼能夠,例如,被用來(lái)完成表面點(diǎn)的計(jì)算。
計(jì)算表面點(diǎn)的示范性偽代碼函數(shù)名GetMeshIntersection輸入一條由工具方向所表示的射線(xiàn)一個(gè)先前相交的三角形的索引輸出flag(標(biāo)記)-指明是否發(fā)現(xiàn)有相交。True表明該射線(xiàn)與網(wǎng)格對(duì)象發(fā)生了相交intersectPt-與網(wǎng)格對(duì)象發(fā)生相交時(shí)的交點(diǎn)triangleIndex-指明發(fā)生相交的三角形表面GetMeshIntersection()If存在先前相交的三角形的索引If checkForIntersectionWithTriangle()為trueReturn trueEnd ifEnd ifIf射線(xiàn)與網(wǎng)格對(duì)象的包圍空間相交For從該包圍空間交點(diǎn)出發(fā)的射線(xiàn)路徑上的每個(gè)點(diǎn)If該點(diǎn)在網(wǎng)格對(duì)象的包圍空間內(nèi)提取與網(wǎng)格對(duì)象中每個(gè)子塊相關(guān)的三角形列表For該列表中的每個(gè)三角形If CheckForIntersectionWithTriangle()為trueReturn交點(diǎn)和相交三角形的索引Return trueEnd ifNext
ElseReturn falseEnd ifNextElseReturn falseEnd ifEnd function當(dāng)用戶(hù)激活所述工具時(shí),PerformSetup()函數(shù)能夠被調(diào)用來(lái)運(yùn)行所有所需要的預(yù)處理函數(shù)。當(dāng)用戶(hù)移動(dòng)該工具時(shí),GetMeshIntersection()函數(shù)能夠被連續(xù)調(diào)用以獲得網(wǎng)格對(duì)象上當(dāng)前的表面點(diǎn)。
6.表面線(xiàn)的產(chǎn)生當(dāng)用戶(hù)在網(wǎng)格表面上指定了起點(diǎn)和終點(diǎn)時(shí),可以畫(huà)出一條連接這兩點(diǎn)的線(xiàn),并顯示出該線(xiàn)的測(cè)量長(zhǎng)度。產(chǎn)生所述線(xiàn)的主要挑戰(zhàn)是,產(chǎn)生一條連接起點(diǎn)和終點(diǎn)的線(xiàn)有無(wú)數(shù)的路徑和方向。選擇連接這兩點(diǎn)的路徑的主要標(biāo)準(zhǔn)是,所產(chǎn)生的線(xiàn)對(duì)于用戶(hù)來(lái)說(shuō)要直觀。選擇所述線(xiàn)的方法是,首先定義一個(gè)平面,只要使之含有所述起點(diǎn)和終點(diǎn)就行。該平面和網(wǎng)格對(duì)象的交點(diǎn)就定義了連接所述起點(diǎn)和終點(diǎn)的線(xiàn)。只用起點(diǎn)和終點(diǎn)還不足以定義這個(gè)平面。眼球位置(eye position)被用來(lái)作為第三點(diǎn)來(lái)定義所述平面。這將產(chǎn)生一條正交于用戶(hù)眼球位置的線(xiàn),這對(duì)于用戶(hù)來(lái)說(shuō)更自然而直觀。在本發(fā)明的示范性實(shí)施例中,眼球位置可以被設(shè)定到沿z軸離開(kāi)3D環(huán)境的原點(diǎn)、離開(kāi)屏幕約40厘米處。
定義了所述平面后,下一個(gè)重要步驟是定義趨近的方向(direction ofapproach)。一個(gè)平面與一個(gè)三角形的面相交于該三角形的邊上的兩點(diǎn)(即,其中,如在網(wǎng)格中一樣,只有三角形-邊和頂點(diǎn)-在其內(nèi)部什么也沒(méi)有)。
所以,在含起點(diǎn)的三角形面上,所述平面的相交從起點(diǎn)到終點(diǎn)會(huì)產(chǎn)生兩個(gè)可能的線(xiàn)的趨近方向。為了決定使用哪一個(gè)交點(diǎn),采用被認(rèn)為是更多地與從起點(diǎn)到終點(diǎn)的方向相符合的那個(gè)點(diǎn)。計(jì)算指示著從起點(diǎn)到終點(diǎn)的方向的矢量。起點(diǎn)和終點(diǎn)可以分別用3D坐標(biāo)x0,y0,z0以及x1,y1,z1來(lái)表示。所述矢量可以被計(jì)算為(x1-x0,y1-y0,z1-z0)。對(duì)每一個(gè)交點(diǎn),可以推導(dǎo)出含有該交點(diǎn)且垂直于該方向的平面。相交測(cè)試可以在,例如,含有由起點(diǎn)和終點(diǎn)構(gòu)成的線(xiàn)段的平面上進(jìn)行。所在平面能產(chǎn)生相交的點(diǎn)被選擇為趨近的點(diǎn)(point ofapproach),如下面的圖14A中的頂視圖和側(cè)視圖所分別顯示的。如果兩個(gè)點(diǎn)都不能產(chǎn)生相交(例如,所形成的平面位于線(xiàn)段的起點(diǎn)上),那么最靠近終點(diǎn)的那個(gè)點(diǎn)可以被選為趨近的點(diǎn)。
在本發(fā)明的示范性實(shí)施例中,下面的偽代碼能夠,例如,被用來(lái)完成趨近點(diǎn)的確定。
確定趨近點(diǎn)的示范性偽代碼函數(shù)名GetPointOfApproach輸入StartPt線(xiàn)節(jié)點(diǎn)(line node)的起點(diǎn)EndPt線(xiàn)節(jié)點(diǎn)的終點(diǎn)IntersectA第一種可能的趨近點(diǎn)IntersectB第二種可能的趨近點(diǎn)輸出ApproachPt所選擇的趨近點(diǎn)GetPointOfApproach()計(jì)算從StartPt到EndPt的趨近矢量(vector of approach)定義由StartPt和EndPt表示的線(xiàn)段用方程Ax+By+Cz+D=0表示平面分量A,B,C由趨近矢量給出通過(guò)使用IntersectA或IntersectB的x,y,z位置,可以計(jì)算由這兩個(gè)點(diǎn)沿著趨近矢量形成的垂面所形成的兩個(gè)面被定義為planeA和planeBIf planeA與所述線(xiàn)段相交IntersectA被用作趨近點(diǎn)ReturnEnd ifIf planeB與所述線(xiàn)段相交IntersectB被用作趨近點(diǎn)ReturnEnd ifIf planeA和planeB都不與所述線(xiàn)段相交或者這兩個(gè)平面都與線(xiàn)段相交then計(jì)算從IntersectA到EndPt的距離distA計(jì)算從IntersectB到EndPt的距離distBIf distA小于distB thenIntersectA被用作趨近點(diǎn)ReturnElseIntersectB被用作趨近點(diǎn)ReturnEnd ifEnd ifEnd function定義了起點(diǎn)和趨近點(diǎn)(也稱(chēng)作聯(lián)接點(diǎn),link point)后,下一步是在表面上找到下一個(gè)聯(lián)接點(diǎn),并重復(fù)這個(gè)過(guò)程直到達(dá)到終點(diǎn)?;诤吔c(diǎn)的三角形表面,利用預(yù)處理過(guò)的數(shù)據(jù)結(jié)構(gòu),容易訪(fǎng)問(wèn)其近鄰三角形。在每個(gè)近鄰三角形上可以進(jìn)行與所述平面的相交測(cè)試。與所述平面相交的三角形會(huì)有兩個(gè)交點(diǎn)。如果一個(gè)交點(diǎn)是所述聯(lián)接點(diǎn),那么另一個(gè)交點(diǎn)就是所述線(xiàn)的連接點(diǎn)(connecting point)。然后,所述聯(lián)接點(diǎn)就可以被更新為這個(gè)新的連接點(diǎn)。重復(fù)上述步驟,可以獲得表面線(xiàn)上的點(diǎn)。一旦獲得了與終點(diǎn)具有同一個(gè)三角形表面的點(diǎn)(意味著所述線(xiàn)已經(jīng)到達(dá)了終點(diǎn)),這個(gè)重復(fù)過(guò)程就終止。
在計(jì)算下一個(gè)聯(lián)接點(diǎn)的過(guò)程中,有可能找不到直接被連接的聯(lián)接點(diǎn)(比如,如果當(dāng)前聯(lián)接點(diǎn)已經(jīng)到達(dá)了網(wǎng)格對(duì)象的邊界等等)。在這種情況下,需要在邊界上找到下一個(gè)合適的聯(lián)接點(diǎn),并繼續(xù)向終點(diǎn)趨近。當(dāng)聯(lián)接點(diǎn)達(dá)到邊界時(shí),使用在預(yù)處理階段所產(chǎn)生的數(shù)據(jù)結(jié)構(gòu),容易獲取定義邊界的邊的信息。通過(guò)找到與定義的平面相交的邊界上的下一個(gè)邊,能夠確定穿過(guò)邊界的下一個(gè)聯(lián)接點(diǎn),所述線(xiàn)就能繼續(xù)向終點(diǎn)趨近。
把沿著所產(chǎn)生的表面線(xiàn)的各點(diǎn)之間的距離加起來(lái),可以獲得從起點(diǎn)到終點(diǎn)的表面線(xiàn)的總距離。
7.在“有噪聲”的數(shù)據(jù)集合中的曲線(xiàn)測(cè)量有時(shí),三維像素對(duì)象或許是有噪聲的(即,存在處于對(duì)象之“外”的三維像素,但是該像素具有大于確定閾值的值)。這可以導(dǎo)致將起點(diǎn)被計(jì)算為在對(duì)象表面之外而不是在對(duì)象表面自身之上。在這種情況下,初始掃描會(huì)導(dǎo)致對(duì)不在對(duì)象表面上的下一個(gè)點(diǎn)進(jìn)行計(jì)算。這個(gè)錯(cuò)誤會(huì)因此傳播到其余的掃描過(guò)程中,結(jié)果是,可能不會(huì)產(chǎn)生一條從起點(diǎn)到終點(diǎn)的表面線(xiàn)。
為了解決這個(gè)問(wèn)題,在本發(fā)明的示范性實(shí)施例中,可以采用,例如,多通道趨近(multi-pass approach)。不是采用一個(gè)固定的閾值來(lái)確定一個(gè)對(duì)象的表面以及一個(gè)固定的位移來(lái)確定參考點(diǎn),而是采用幾個(gè)值?;谶@組新值可以產(chǎn)生一條線(xiàn)。重復(fù)這個(gè)過(guò)程直到這組值的組合能夠成功地產(chǎn)生從起點(diǎn)到終點(diǎn)的表面線(xiàn)。然而,太多的通道(pass)會(huì)用去更多的計(jì)算時(shí)間并且會(huì)減慢用戶(hù)互動(dòng)。因此,所述通道的數(shù)目可以限制到,比如,三個(gè),在每一個(gè)通道處可以使用一組不同的值。基于已有數(shù)據(jù)的研究可以被用來(lái)確定在大多數(shù)情形中起作用的不同組的值。
8.示范性測(cè)量結(jié)果本發(fā)明的示范性實(shí)施例所給出的表面測(cè)量在含有球形三維像素對(duì)象以及球形網(wǎng)格對(duì)象的測(cè)試數(shù)據(jù)上進(jìn)行。在所述球的兩個(gè)極點(diǎn)上進(jìn)行直線(xiàn)測(cè)量以估計(jì)該球的直徑。從這個(gè)測(cè)量中發(fā)現(xiàn),球的直徑約為24.46mm。該球的周長(zhǎng)可以這樣計(jì)算球的周長(zhǎng)=Pi*球的直徑=3.141×24.46=76.84mm因此,該例子中的球的周長(zhǎng)之半應(yīng)該等于76.84×0.5=38.42mm在該球形對(duì)象上進(jìn)行表面測(cè)量以測(cè)量周長(zhǎng)之半,得到的近似值為38.57mm。在皮膚對(duì)象上進(jìn)行同樣的測(cè)量給出的近似值為38.94mm。因此,在這個(gè)測(cè)量中發(fā)現(xiàn),本發(fā)明所給出的方法是相當(dāng)精確。
9.描繪網(wǎng)格對(duì)象表面上表面線(xiàn)的產(chǎn)生及測(cè)量的屏幕圖片圖1-5顯示了本發(fā)明的示范性實(shí)施例中在曲面上線(xiàn)的產(chǎn)生。
B.在曲面上產(chǎn)生線(xiàn)來(lái)進(jìn)行網(wǎng)格切割上述的方法指明了如何在表面上從點(diǎn)到點(diǎn)產(chǎn)生一條線(xiàn)。這個(gè)方法可以擴(kuò)展為包括在表面上為一系列點(diǎn)產(chǎn)生一條線(xiàn)??梢赃@樣來(lái)實(shí)現(xiàn),即將這系列的點(diǎn)按對(duì)分成組,并用上述的實(shí)現(xiàn)方法在各對(duì)點(diǎn)之間產(chǎn)生表面線(xiàn)。通過(guò)從這系列點(diǎn)中最后一個(gè)點(diǎn)到這系列中的第一個(gè)點(diǎn)產(chǎn)生表面線(xiàn),可以在網(wǎng)格表面對(duì)象上用線(xiàn)來(lái)定義一個(gè)閉合區(qū)域。這可以用來(lái)在網(wǎng)格表面上定義一個(gè)區(qū)域,并且隨后測(cè)量這個(gè)區(qū)域的周長(zhǎng)??梢赃M(jìn)一步處理所指定的區(qū)域,以從網(wǎng)格對(duì)象上移去這個(gè)表面。
圖15-25顯示了這個(gè)方法,根據(jù)本發(fā)明的示范性實(shí)施例,從網(wǎng)格表面切掉兩個(gè)示范性區(qū)域。在本發(fā)明的示范性實(shí)施例中,網(wǎng)格表面由三角形構(gòu)成。如下面所描述,當(dāng)所述區(qū)域正好跨過(guò)了一個(gè)已知三角形時(shí)如何將該三角形切割的細(xì)節(jié)顯示在圖26-30中。圖31-39給出了網(wǎng)格切割的其它例子。
如上面所述,經(jīng)常需要根據(jù)用戶(hù)定義的閉合曲線(xiàn)將一個(gè)表面對(duì)象分為兩部分-所述曲線(xiàn)應(yīng)該是閉合的或者關(guān)于邊界是閉合的。例如,切割一個(gè)表面對(duì)象,使內(nèi)部可以看見(jiàn)。所述表面對(duì)象用一個(gè)3D三角形網(wǎng)格來(lái)表示。指明在哪里切割表面對(duì)象的曲線(xiàn)可以用一個(gè)3D多邊形來(lái)定義-所述多邊形的邊上的每個(gè)點(diǎn)都必須位于所述表面上。
假設(shè)在三角形網(wǎng)格中每個(gè)三角形都是逆時(shí)針的。當(dāng)一個(gè)3D多邊形P切割一個(gè)三角形網(wǎng)格時(shí),P的一條邊上的每個(gè)點(diǎn)都必須位于所述表面上。為了切割所述三角形網(wǎng)格,需要找到那些被P切割的三角形,并將所述三角形分為兩部分一部分在由P定義的區(qū)域之內(nèi)(標(biāo)記為in),另一部分在由P定義的區(qū)域之外(標(biāo)記為out)。關(guān)于如何構(gòu)造所述多邊形,沒(méi)有方向的要求(逆時(shí)針或順時(shí)針)。
對(duì)于一個(gè)被P切割的三角形T,P的至少兩個(gè)頂點(diǎn)必須落在T的一條或多條邊上。這個(gè)問(wèn)題可以被簡(jiǎn)化為切割相應(yīng)三角形T的P的一個(gè)邊條(edgestrip)ss的兩個(gè)末端頂點(diǎn)(進(jìn)入頂點(diǎn)v1和離開(kāi)頂點(diǎn)v2)必須落在T的一個(gè)或多個(gè)邊上,并且s的所有其它頂點(diǎn)必須在T之內(nèi)。根據(jù)這個(gè)簡(jiǎn)化,所述3D切割可以被簡(jiǎn)化為2D切割,如圖26所示,P從v1點(diǎn)進(jìn)入T,P從v2點(diǎn)離開(kāi)T。
當(dāng)一個(gè)三角形被一個(gè)邊條所切割時(shí),該三角形總是被分成兩個(gè)多邊形。根據(jù)s如何進(jìn)入并離開(kāi)T,這兩個(gè)多邊形的構(gòu)造在本發(fā)明的示范性實(shí)施例中可以不同。圖26-30給出如何構(gòu)造這兩個(gè)多邊形的例子。為了用邊條切割三角形,假設(shè)進(jìn)入頂點(diǎn)位于邊t1t2上,有幾種情況。
有許多辦法將2D多邊形分成若干三角形。對(duì)于一個(gè)2D多邊形,一個(gè)辦法是找一個(gè)內(nèi)部對(duì)角線(xiàn)(不與多邊形的任何邊相交)并將所述2D多邊形分為兩個(gè)多邊形。對(duì)于這兩個(gè)多邊形,可以進(jìn)行例如上述的過(guò)程。繼續(xù)這個(gè)過(guò)程直到輸入的多邊形只有三個(gè)頂點(diǎn)為止。
有時(shí),例如,一個(gè)T可以被P切割多次。圖30給出了一個(gè)三角形被兩個(gè)邊條切割的例子。當(dāng)處理邊條v1v2時(shí),T將被分為三個(gè)三角形T1、T2、T3。因此需要為邊條v3v4更新信息1)是否有新的交點(diǎn)。如果是,將它插進(jìn)P中。在圖30中,有一個(gè)交點(diǎn)v5,其應(yīng)該被插入P中。原始的邊條v3v4就變成兩個(gè)邊條v3v5和v5v4。
2)另外,應(yīng)該更新被邊條切割的三角形索引。例如,被邊條v3v5切割的三角形應(yīng)該為T(mén)2,被邊條v5v4切割的三角形應(yīng)該為T(mén)1。
如上所述,在本發(fā)明的示范性實(shí)施例中,一個(gè)表面對(duì)象可以被分為兩部分一部分被標(biāo)記為in-在由P定義的區(qū)域之內(nèi),而另一部分被標(biāo)記為out-在由P定義的區(qū)域之外。在圖26-29中,例如,對(duì)于每個(gè)被標(biāo)記為in的多邊形,將該多邊形分成的所有的三角形都被標(biāo)記為in。因此,對(duì)于每個(gè)被標(biāo)記為out的多邊形,將該多邊形分成的所有的三角形都被標(biāo)記為out。在所有的邊條被處理之后,可以進(jìn)行下面的計(jì)算1)對(duì)于每個(gè)in(out)三角形,除了其屬于P的頂點(diǎn)之外,其其它的頂點(diǎn)被標(biāo)記為in(out);2)如果一個(gè)三角形的頂點(diǎn)被標(biāo)記為in(out),那么該三角形應(yīng)該被標(biāo)記為in(out)。
在本發(fā)明的示范性實(shí)施例中,可以重復(fù)上述過(guò)程直到所有的三角形被標(biāo)記為in或out。
根據(jù)上述的算法,一個(gè)表面對(duì)象(三角形網(wǎng)格)能夠被分為兩部分。這種劃分的結(jié)果可以被用于許多的應(yīng)用中。根據(jù)應(yīng)用的要求,通常方便的作法是根據(jù)一些用戶(hù)定義的標(biāo)準(zhǔn)(例如,區(qū)域的大小、三角形的數(shù)量等)只顯示一部分(in或out)。這種劃分也能被用來(lái)構(gòu)建兩個(gè)新對(duì)象。
網(wǎng)格切割的進(jìn)一步的例子如下面所描述,圖31-39描繪了本發(fā)明的示范性實(shí)施例所述的網(wǎng)格切割的三個(gè)其它的例子。
1.圖31-34給出了第一個(gè)例子。圖31描繪了一個(gè)三角形網(wǎng)格對(duì)象的線(xiàn)框。這個(gè)網(wǎng)格對(duì)象是一個(gè)要切割的候選。圖32描繪了在網(wǎng)格對(duì)象的表面上所畫(huà)出的一條曲線(xiàn)(在彩色版本中為紅色,在灰度版本中為淺灰色)。圖33給出了網(wǎng)格對(duì)象被圖32所示的曲線(xiàn)切割后的結(jié)果。圖34給出了和圖33所示相同的結(jié)果,除了這里的網(wǎng)格對(duì)象以固態(tài)模式繪出之外。這里能夠容易地看到切割曲線(xiàn)的輪廓。
2.圖35-37給出了第二個(gè)例子。圖35描繪了一個(gè)固態(tài)模式中的三角形網(wǎng)格對(duì)象(基本上是圖31所繪的同一個(gè)對(duì)象)。這個(gè)網(wǎng)格對(duì)象是一個(gè)要切割的候選。圖36描繪了一個(gè)切割曲線(xiàn)(在彩色版本中為紅色,在灰度版本中為淺灰色),這條曲線(xiàn)已經(jīng)被畫(huà)在網(wǎng)格對(duì)象的表面上了,這里以線(xiàn)框模式顯示。圖37描繪了該網(wǎng)格對(duì)象被圖36所示的曲線(xiàn)切割后的結(jié)果,以線(xiàn)框模式顯示。
3.圖38-39顯示了第三個(gè)例子。圖38描繪了已經(jīng)被畫(huà)在以固態(tài)模式顯示的網(wǎng)格對(duì)象表面上的一條曲線(xiàn)(在彩色版本中為紅色,在灰度版本中為白色)。所述網(wǎng)格對(duì)象再一次與圖35以固態(tài)模式所描繪的和圖31中以線(xiàn)框模式所描繪的網(wǎng)格對(duì)象相同。圖39描繪了所述網(wǎng)格對(duì)象被圖38所示曲線(xiàn)切割后的結(jié)果。
用于網(wǎng)格切割的示范性偽代碼在本發(fā)明的示范性實(shí)施例中,下面的偽代碼能夠,例如,被用來(lái)完成網(wǎng)格切割。
用于網(wǎng)格切割的偽代碼輸入三角形網(wǎng)格MM上的多邊形P輸出三角形網(wǎng)格McutCutMesh()在P中尋找未被處理的邊條v1v2,如圖27、28和29所示;如果所有的邊條都被處理過(guò)了,那么,除了那些被標(biāo)記為in和removed之外,返回結(jié)果三角形;
標(biāo)記相應(yīng)的三角形為removed;將所述相應(yīng)的三角形分為兩部分P1和P2,P1應(yīng)該在P之內(nèi),而P2應(yīng)該在P之外;將多邊形P1分成若干三角形,并把從該分成三角形過(guò)程所新產(chǎn)生的所有三角形標(biāo)記為in;將多邊形P2分成若干三角形,并把從該分成三角形過(guò)程所新產(chǎn)生的所有三角形標(biāo)記為out;檢查P中未被處理的邊是否與從P1和P2的分成三角形過(guò)程所新產(chǎn)生的三角形相交,如果是,對(duì)P更新多邊形P對(duì)于要被切割的網(wǎng)格的每個(gè)頂點(diǎn)A,定義如下的結(jié)構(gòu)
對(duì)于一個(gè)要切割的網(wǎng)格的每個(gè)三角形TA,定義下面的結(jié)構(gòu)
C.立體對(duì)象表面線(xiàn)的產(chǎn)生實(shí)現(xiàn)1.計(jì)算一個(gè)表面點(diǎn)為了產(chǎn)生一條表面線(xiàn),用戶(hù)需要能夠在立體對(duì)象的表面指定起點(diǎn)和終點(diǎn)。所述表面點(diǎn)被確定為射線(xiàn)(由虛擬工具的方向所形成)與立體對(duì)象表面的交點(diǎn)。立體對(duì)象由三維像素構(gòu)成,其值指明了這些三維像素的透明度。其值高出一個(gè)具體閾值的三維像素表示所述對(duì)象的結(jié)構(gòu)(即為“內(nèi)部”三維像素),而值低于該閾值則表明它不是所述對(duì)象結(jié)構(gòu)的一部分(即為一個(gè)“外部”三維像素)。
要找到立體對(duì)象的表面點(diǎn)要求找到沿著工具射線(xiàn)的點(diǎn),其中能探測(cè)到閾值之下的三維像素值到閾值之上的三維像素的轉(zhuǎn)變。從虛擬工具的尖端開(kāi)始,檢索三維像素的值。如果該值高于所定義的閾值,這表明所述工具的尖端在立體對(duì)象的內(nèi)部,因此沒(méi)有表面點(diǎn)可計(jì)算。一個(gè)值在閾值之下表明,所述工具的尖端不在立體對(duì)象之內(nèi),并且有可能找到一個(gè)表面點(diǎn)。通過(guò)朝著立體對(duì)象沿著工具尖端所定義的射線(xiàn)逐漸移動(dòng),一旦找到了一個(gè)其值高于閾值的三維像素,就可以獲得所述表面點(diǎn)。
2.產(chǎn)生一條表面線(xiàn)當(dāng)用戶(hù)在立體對(duì)象的表面上指定了起點(diǎn)和終點(diǎn)的時(shí)候,連接這兩點(diǎn)可以畫(huà)出一條線(xiàn),并且顯示這條線(xiàn)的測(cè)量長(zhǎng)度。產(chǎn)生所述線(xiàn)的主要挑戰(zhàn)是,有無(wú)數(shù)的路徑和方向可以產(chǎn)生一條連接起點(diǎn)和終點(diǎn)的線(xiàn)。連接這些點(diǎn)的路徑的主要選擇標(biāo)準(zhǔn)是,所產(chǎn)生的線(xiàn)對(duì)于用戶(hù)來(lái)說(shuō)應(yīng)該是直觀的。選擇所述線(xiàn)的方法是,首先定義一個(gè)平面,只要它含有起點(diǎn)和終點(diǎn)就行。該平面與所述立體對(duì)象的相交則定義了連接所述起點(diǎn)和所述終點(diǎn)的線(xiàn)。使用起點(diǎn)和終點(diǎn)還不足以定義所述平面。眼球位置被用作第三點(diǎn)來(lái)定義該平面。這將產(chǎn)生一條線(xiàn),能直接面對(duì)用戶(hù)的眼球位置,對(duì)用戶(hù)來(lái)說(shuō)就更自然而直觀。
不像網(wǎng)格對(duì)象,其具有定義表面對(duì)象的定義好了的相互連接的頂點(diǎn)和三角形,立體對(duì)象只是由三維像素強(qiáng)度值來(lái)定義。所以,強(qiáng)度值的轉(zhuǎn)變被用來(lái)作為立體對(duì)象表面的指示。使用圓形區(qū)域的掃描技術(shù)被用來(lái)產(chǎn)生連接起點(diǎn)和終點(diǎn)的表面線(xiàn)。在所述線(xiàn)上的每一點(diǎn),在預(yù)定半徑范圍進(jìn)行掃描以確定下一個(gè)聯(lián)接點(diǎn)。重復(fù)這個(gè)過(guò)程直到到達(dá)了終點(diǎn),或者直到完成了預(yù)先定義的重復(fù)的次數(shù)為止。
上述過(guò)程被顯示在,比如,圖6-14中。
a.為了進(jìn)行弧形掃描(radical scanning),需要一個(gè)相對(duì)于起點(diǎn)的初始參考點(diǎn)?;谒銎瘘c(diǎn)以及從起點(diǎn)到終點(diǎn)的矢量的方向,離開(kāi)所述起點(diǎn)有一段小位移的點(diǎn)可以被定義為所述參考點(diǎn)。
b.然后該點(diǎn)繞著由被定義的平面的法向所定義的軸轉(zhuǎn)動(dòng),以獲得初始點(diǎn),弧形掃描將從該初始點(diǎn)開(kāi)始。這里所完成的初始轉(zhuǎn)動(dòng)被用來(lái)定義一個(gè)起點(diǎn),使得能夠獲得一個(gè)更加合適的掃描范圍。
c.提取所述參考點(diǎn)的三維像素值。如果該值低于閾值,那么該點(diǎn)在所述對(duì)象之外;因此,向高于閾值的值的轉(zhuǎn)變就指明了所述表面點(diǎn)。反過(guò)來(lái)也是成立的,如果當(dāng)前測(cè)試點(diǎn)三維像素值高于閾值的話(huà)。
d.可以進(jìn)行向前的掃描,以便探測(cè)所需要的轉(zhuǎn)變從而獲得表面點(diǎn)。這可以通過(guò)下面步驟來(lái)實(shí)現(xiàn),例如,首先轉(zhuǎn)動(dòng)參考點(diǎn)到所述平面上的不同的位置,然后在每個(gè)這些新位置處對(duì)轉(zhuǎn)變進(jìn)行探測(cè)。
e.獲得新的表面點(diǎn)之后,先前的點(diǎn)就被用作新的參考點(diǎn)。然后像步驟2中所描述的來(lái)轉(zhuǎn)動(dòng)這個(gè)新參考點(diǎn)。
f.然后可以用步驟4所描述的過(guò)程來(lái)獲得下一個(gè)表面點(diǎn)。
g.用新的表面點(diǎn)可以重復(fù)上述步驟(a)-(f),直到產(chǎn)生了從點(diǎn)A到點(diǎn)B的表面線(xiàn)。
用于產(chǎn)生三維像素對(duì)象的表面線(xiàn)的示范性偽代碼在本發(fā)明的示范性實(shí)施例中,下面的偽代碼能夠,例如,被用來(lái)實(shí)現(xiàn)趨近點(diǎn)的確定。
函數(shù)名GetPointOnVolumeSurface輸入由工具方向所表示的一條射線(xiàn)輸出flag(標(biāo)記)-指明所述射線(xiàn)是否與所述立體對(duì)象發(fā)生相交intersectPt-如果發(fā)生了相交,指明在立體對(duì)象上的表面點(diǎn)GetPointOnVolumeSurface()計(jì)算立體對(duì)象的包圍空間If射線(xiàn)與立體對(duì)象的包圍空間相交For從包圍空間交點(diǎn)開(kāi)始的射線(xiàn)路徑上的每個(gè)點(diǎn)If點(diǎn)在立體對(duì)象的包圍空間之內(nèi)提取所述點(diǎn)處的三維像素值If三維像素值高于定義的閾值0.10then已經(jīng)找到了表面點(diǎn)Return trueEnd ifElseReturn falseEnd ifNextElseReturn falseEnd ifEnd function函數(shù)名GetNeighbourPoint輸入PrevPt先前的點(diǎn)curPt當(dāng)前的參考點(diǎn)normal所述平面法向輸出flag-指明是否能夠找到一個(gè)近鄰點(diǎn)nextPt-指明下一個(gè)近鄰點(diǎn),如果能夠找到的話(huà)GetNeighbourPoint()計(jì)算從prevPt到curPt的矢量將該矢量轉(zhuǎn)動(dòng)90度以得到起始矢量沿著由該起始矢量定義的方向離開(kāi)curPt一段距離設(shè)定起點(diǎn)提取該起點(diǎn)處的三維像素值If三維像素值高于定義的閾值0.10then初始態(tài)被定義為在立體對(duì)象的內(nèi)部else初始態(tài)被定義為不在立體對(duì)象的內(nèi)部定義當(dāng)前的掃描范圍等于零度While掃描范圍小于270度設(shè)定起始矢量偏離其當(dāng)前方向5度設(shè)定起點(diǎn)沿著由所述起始矢量定義的方向偏離curPt一段距離加5度到掃描范圍提取起點(diǎn)處的三維像素值If三維像素值高于定義的閾值0.10thenIf初始態(tài)不在立體對(duì)象之內(nèi)then找到了表面點(diǎn)ReturnEnd ifElseif初始態(tài)在立體對(duì)象之內(nèi)then找到了表面點(diǎn)ReturnEnd ifEnd ifLoopEnd function
函數(shù)名GetLineFromAToBOnVolumeSruface輸入startPt表面線(xiàn)的起點(diǎn)endPt表面線(xiàn)的終點(diǎn)plane將被用來(lái)與立體對(duì)象相交的平面輸出flag-指明已經(jīng)找到了從A到B的表面線(xiàn)line-包含立體對(duì)象的表面上從A到B的點(diǎn)的列表GetLineFromAToBOnVolumeSurface()將起點(diǎn)加到所述線(xiàn)的列表中得到從終點(diǎn)到起點(diǎn)的矢量定義先前的點(diǎn)沿著上述矢量的方向離開(kāi)起點(diǎn)一段距離Do用GetNeighbourPoint()函數(shù)來(lái)得到沿所述線(xiàn)的下一個(gè)點(diǎn)將下一個(gè)點(diǎn)加到線(xiàn)的列表中Loop if下一個(gè)點(diǎn)不靠近終點(diǎn)End function示范性系統(tǒng)本發(fā)明可以在數(shù)據(jù)處理器上運(yùn)行的軟件中、在一個(gè)或多個(gè)專(zhuān)用芯片的硬件中、或者在上述兩者的任何組合中實(shí)現(xiàn)。示范性系統(tǒng)可以包括,例如,立體顯示、數(shù)據(jù)處理器、交互顯示控制命令和功能所映射到的一個(gè)或多個(gè)接口、一個(gè)或多個(gè)存儲(chǔ)器或存儲(chǔ)器件、和圖形處理器以及相關(guān)系統(tǒng)。例如,由Volume Interactions Pte Ltd of Singapore制造的、運(yùn)行RadioDexterTM軟件的DextroscopeTM和DextrobeamTM系統(tǒng),或任何類(lèi)似的或功能上等價(jià)的3D數(shù)據(jù)集合交互可視系統(tǒng),都是能夠容易地實(shí)現(xiàn)本發(fā)明的方法的系統(tǒng)。
本發(fā)明的示范性實(shí)施例可以作為指令的模塊化軟件程序來(lái)實(shí)現(xiàn),這些程序可以由合適的數(shù)據(jù)處理器來(lái)執(zhí)行,以實(shí)現(xiàn)本發(fā)明的優(yōu)選示范性實(shí)施例,如在本技術(shù)領(lǐng)域中所公知的那樣。所述示范性軟件程序可以被存儲(chǔ)在,例如,硬驅(qū)、閃存、存儲(chǔ)棒、光盤(pán)存儲(chǔ)介質(zhì)、或其它數(shù)據(jù)存儲(chǔ)器件上,如在本技術(shù)領(lǐng)域中所知道的那樣。當(dāng)這樣一個(gè)程序被合適的數(shù)據(jù)處理器的CPU存取并運(yùn)行時(shí),它能夠在本發(fā)明的示范性實(shí)施例中執(zhí)行上述的方法,在3D數(shù)據(jù)顯示系統(tǒng)中顯示3D計(jì)算機(jī)模型或管狀結(jié)構(gòu)模型。
盡管本發(fā)明參考了其一個(gè)或多個(gè)示范性實(shí)施例來(lái)描述,但它并不限于此,附屬的權(quán)利要求書(shū)被用來(lái)進(jìn)行詮釋?zhuān)员悴粌H僅涵蓋所示的本發(fā)明的具體形式和變化,而且進(jìn)一步涵蓋諸如由本領(lǐng)域技術(shù)人員設(shè)計(jì)的不偏離本發(fā)明真正范圍的那些內(nèi)容。
權(quán)利要求
1.一種在曲面上產(chǎn)生線(xiàn)條的方法,包括預(yù)處理三角形網(wǎng)格數(shù)據(jù)結(jié)構(gòu);為三角形網(wǎng)格對(duì)象構(gòu)造柵格數(shù)據(jù)結(jié)構(gòu);表示三角形和頂點(diǎn)的關(guān)系;決定邊界的邊和頂點(diǎn);計(jì)算表面點(diǎn);以及產(chǎn)生表面線(xiàn)。
2.根據(jù)權(quán)利要求1所述的方法,其中所述表面線(xiàn)被用來(lái)從網(wǎng)格對(duì)象上切割出一個(gè)區(qū)域。
3.在三維像素對(duì)象上產(chǎn)生從點(diǎn)A到點(diǎn)B的表面線(xiàn)的方法,包括基于起點(diǎn)A以及從起點(diǎn)A到終點(diǎn)B的矢量的方向來(lái)定義一個(gè)參考點(diǎn);沿著由定義了的平面的法向所定義的軸轉(zhuǎn)動(dòng)所述參考點(diǎn),以獲得初始表面點(diǎn);在掃描范圍內(nèi)的各個(gè)點(diǎn)處探測(cè)所要求的轉(zhuǎn)變,以找到初始表面點(diǎn);使用所述初始表面點(diǎn)作為新的參考點(diǎn);重復(fù)上述過(guò)程直到從點(diǎn)A到點(diǎn)B產(chǎn)生了一條表面線(xiàn)。
4.根據(jù)權(quán)利要求3所述的方法,其中,所述參考點(diǎn)被定義為離開(kāi)所述起點(diǎn)一小段位移的一個(gè)點(diǎn)。
5.根據(jù)權(quán)利要求3所述的方法,其中,所述定義了的平面是一個(gè)包含所述起點(diǎn)、終點(diǎn)和用戶(hù)眼球位置的平面。
6.根據(jù)權(quán)利要求3所述的方法,其中,所述所要求的轉(zhuǎn)變是指一個(gè)三維像素強(qiáng)度的轉(zhuǎn)變,它表示從不在所述對(duì)象的所述表面上的三維像素移動(dòng)到在所述對(duì)象的所述表面上的三維像素。
7.根據(jù)權(quán)利要求4所述的方法,其中,所述小位移是用戶(hù)定義的。
8.一個(gè)計(jì)算機(jī)程序產(chǎn)品,包括計(jì)算機(jī)可用的介質(zhì),其上含有計(jì)算機(jī)可讀程序代碼資料,所述計(jì)算機(jī)程序產(chǎn)品中的所述計(jì)算機(jī)可讀程序代碼資料所包含的資料能夠使計(jì)算機(jī)基于起點(diǎn)A以及從起點(diǎn)A到終點(diǎn)B的矢量的方向來(lái)定義參考點(diǎn);沿著由定義了的平面的法向所定義的軸轉(zhuǎn)動(dòng)所述參考點(diǎn),以獲得初始表面點(diǎn);在所述掃描范圍內(nèi)的各個(gè)點(diǎn)處探測(cè)所要求的轉(zhuǎn)變,以找到初始表面點(diǎn);使用所述初始表面點(diǎn)作為一個(gè)新的參考點(diǎn);重復(fù)上述過(guò)程直到從點(diǎn)A到點(diǎn)B產(chǎn)生了一條表面線(xiàn)。
9.根據(jù)權(quán)利要求8所述的計(jì)算機(jī)程序產(chǎn)品,其中,所述參考點(diǎn)被定義為離開(kāi)所述起點(diǎn)一小段位移的點(diǎn)。
10.根據(jù)權(quán)利要求8所述的計(jì)算機(jī)程序產(chǎn)品,其中,所述定義了的平面是一個(gè)包含所述起點(diǎn)、終點(diǎn)和用戶(hù)眼球位置的平面。
11.根據(jù)權(quán)利要求8所述的計(jì)算機(jī)程序產(chǎn)品,其中,所述所要求的轉(zhuǎn)變是三維像素強(qiáng)度的轉(zhuǎn)變,它表示從不在所述對(duì)象的所述表面上的三維像素移動(dòng)到在所述對(duì)象的所述表面上的三維像素。
12.根據(jù)權(quán)利要求9所述的計(jì)算機(jī)程序產(chǎn)品,其中,所述小位移是用戶(hù)定義的。
13.根據(jù)權(quán)利要求8所述的計(jì)算機(jī)程序產(chǎn)品,其中,起點(diǎn)A和終點(diǎn)B是用戶(hù)定義的。
14.根據(jù)權(quán)利要求3所述的方法,其中,起點(diǎn)A和終點(diǎn)B是用戶(hù)定義的。
15.沿著任意的3D曲面找到一條曲線(xiàn)的方法,包括定義起點(diǎn)和終點(diǎn),每個(gè)點(diǎn)都包含在3D空間中的一個(gè)3D曲面上;找到在所述起點(diǎn)和所述終點(diǎn)之間的在所述3D空間中的線(xiàn);定義一個(gè)包含所述線(xiàn)和用戶(hù)視點(diǎn)的平面;定義一個(gè)在正交于所述曲面的方向上從所述起點(diǎn)逐漸延伸長(zhǎng)度的線(xiàn)段;繞著正交于所述平面的軸朝著所述終點(diǎn)轉(zhuǎn)動(dòng)所述線(xiàn)段,直到定位在所述3D曲面上的一個(gè)點(diǎn)上;用所述3D面上所定位的點(diǎn)作為新的起點(diǎn)重復(fù)所述過(guò)程,直到所述線(xiàn)段與所述終點(diǎn)相交。
16.根據(jù)權(quán)利要求15所述的方法,其中,通過(guò)在所述3D空間內(nèi)探測(cè)不在所述3D面上的點(diǎn)到在所述3D面上的點(diǎn)之間的轉(zhuǎn)變,來(lái)定位所述3D面上的所述點(diǎn)。
17.根據(jù)權(quán)利要求16所述的方法,其中,通過(guò)測(cè)量所述3D空間內(nèi)每個(gè)點(diǎn)的特性來(lái)探測(cè)所述的轉(zhuǎn)變,該特性能夠區(qū)分在所述3D曲面內(nèi)的點(diǎn)和不在所述3D曲面內(nèi)的點(diǎn)。
18.根據(jù)權(quán)利要求15所述的方法,其中,所述轉(zhuǎn)動(dòng)通過(guò)使用定義過(guò)的增量來(lái)完成。
19.根據(jù)權(quán)利要求18所述的方法,其中,所述轉(zhuǎn)動(dòng)增量隨著所述3D數(shù)據(jù)集合內(nèi)的位置而變化。
20.根據(jù)權(quán)利要求15所述的方法,其中,所述曲線(xiàn)被用來(lái)測(cè)量一些或全部的所述3D曲面所包含的體積。
21.一種用任意的封閉曲線(xiàn)來(lái)切割網(wǎng)格結(jié)構(gòu)的方法,包括用一組三角形和頂點(diǎn)來(lái)定義一個(gè)網(wǎng)格結(jié)構(gòu);在所述網(wǎng)格結(jié)構(gòu)上畫(huà)出一個(gè)任意的閉合曲線(xiàn);對(duì)于每一個(gè)與所述曲線(xiàn)相交的三角形,確定被所述曲線(xiàn)的線(xiàn)段分割的該三角形的里面部分和外面部分;將所述網(wǎng)格結(jié)構(gòu)再分成若干三角形,以便只包括被相交的三角形的里面部分。
全文摘要
給出了在網(wǎng)格表面和三維像素對(duì)象上產(chǎn)生表面線(xiàn)的系統(tǒng)和方法。在涉及網(wǎng)格表面的本發(fā)明的示范性實(shí)施例中,這種方法包括預(yù)處理三角形網(wǎng)格數(shù)據(jù)結(jié)構(gòu)、為所述三角形網(wǎng)格對(duì)象構(gòu)造一個(gè)柵格數(shù)據(jù)結(jié)構(gòu)、表示三角形和頂點(diǎn)的關(guān)系、確定邊界的邊和頂點(diǎn)、計(jì)算一系列表面點(diǎn)、以及產(chǎn)生一條表面線(xiàn)。這個(gè)技術(shù)能夠被用來(lái)沿著所產(chǎn)生的線(xiàn)切割網(wǎng)格表面。基于起點(diǎn)以及從起點(diǎn)到終點(diǎn)的矢量的方向,沿著一個(gè)任意曲面從起點(diǎn)A到終點(diǎn)B產(chǎn)生一條表面線(xiàn)。離起點(diǎn)有一小段位移的點(diǎn)被定義為參考點(diǎn),這種參考點(diǎn)能夠沿著由一個(gè)定義了的平面的法向所定義的軸轉(zhuǎn)動(dòng),以獲得一個(gè)初始表面點(diǎn)。利用每個(gè)獲得的表面點(diǎn)作為新的起點(diǎn)來(lái)重復(fù)上述過(guò)程,可以在一個(gè)三維像素對(duì)象的表面上從點(diǎn)A到點(diǎn)B產(chǎn)生一條表面線(xiàn)。這種表面線(xiàn)能夠被用來(lái)測(cè)量所述三維像素對(duì)象的體積。
文檔編號(hào)G06F19/00GK101065782SQ200580040444
公開(kāi)日2007年10月31日 申請(qǐng)日期2005年11月28日 優(yōu)先權(quán)日2004年11月27日
發(fā)明者W·K·謝, C·陶 申請(qǐng)人:布雷克成像有限公司