專利名稱:基于樣圖覆蓋、分割的三維紋理貼圖方法
技術(shù)領(lǐng)域:
本發(fā)明屬于計(jì)算機(jī)算法、虛擬現(xiàn)實(shí)技術(shù)領(lǐng)域,具體涉及一種基于樣圖覆蓋、分割的三維紋理貼圖方法。
背景技術(shù):
紋理貼圖廣泛應(yīng)用于計(jì)算機(jī)圖形學(xué)的各個(gè)領(lǐng)域,以增加三維物體的真實(shí)感。隨著計(jì)算機(jī)仿真,計(jì)算機(jī)輔助設(shè)計(jì),計(jì)算機(jī)動(dòng)畫等技術(shù)的廣泛應(yīng)用,紋理貼圖技術(shù)越來越受到人們的重視。近年來,有許多研究關(guān)注于此問題,提出了許多新的方法和技術(shù),以提高紋理貼圖的質(zhì)量和速度。這些研究主要集中在“基于樣圖的紋理貼圖(texture-from-sample)技術(shù)”給定一個(gè)三維模型和一張紋理樣圖,然后由算法生成三維模型上的紋理。這些研究又可以大致分為兩類,一類是紋理映射(texture mapping),一類是紋理合成(texture synthesis)。紋理映射最終為每個(gè)面的每個(gè)頂點(diǎn)生成紋理坐標(biāo)。在繪制該三維模型時(shí),表面上任意一點(diǎn)的顏色根據(jù)所在面的頂點(diǎn)的紋理坐標(biāo)從樣圖中得到。而紋理合成最終為三維模型的每個(gè)頂點(diǎn)生成顏色,由所有頂點(diǎn)的顏色最終形成我們需要的紋理。在三維模型的繪制過程中,就不再需要此樣圖。顯而易見,模型上頂點(diǎn)的密度必須足夠大,以保證三維模型上的紋理能夠保留樣圖的細(xì)節(jié)。這兩類技術(shù)各有自己的優(yōu)缺點(diǎn)紋理映射應(yīng)用的范圍更廣,無論是粗糙的三維模型還是精細(xì)的三維模型都可以使用。但是效果一般沒有紋理合成好,特別是當(dāng)三維模型比較粗糙時(shí)。而紋理合成一般都有比較好的效果,但是它的三維模型必須很細(xì)密,并不適用于一般情況,比如在實(shí)時(shí)渲染中。到目前為止,在任意表面上的紋理貼圖技術(shù),無論是紋理映射還是紋理合成,都有著各種各樣的缺陷有的技術(shù)適用的紋理有限,有的技術(shù)產(chǎn)生的效果并不太好,有的技術(shù)其速度跟紋理樣圖大小有關(guān),當(dāng)紋理樣圖較大時(shí),速度下降得很快。而對(duì)于的紋理合成技術(shù)來說,基本上都需要比較大的時(shí)間代價(jià)。
發(fā)明內(nèi)容
本發(fā)明的目的在于提出一種適用性強(qiáng)、時(shí)間代價(jià)小的三維紋理貼圖方法。
本發(fā)明提出的三維紋理貼圖方法,是利用圖的分割(Graph Cut)進(jìn)行紋理貼圖,該方法能夠同時(shí)應(yīng)用于紋理映射和紋理合成。對(duì)于一個(gè)給定的三維模型和紋理樣圖,可按照下面三個(gè)步驟給三維模型貼上紋理(1)從三維物體上選取一塊表面(由相鄰的面組成的集合)。其步驟是先在模型上選取一個(gè)還沒有貼圖的面,把它作為該塊表面的種子面;然后,選取一個(gè)與該塊相鄰的面,如果該面滿足下面兩個(gè)條件,那么就把該面加入到塊中條件1該面的法向量與種子面的法向量的夾角小于一定閥值P。通過閥值的大小可以控制該塊的平坦度,從而控制紋理的形變。同時(shí),閥值也可以控制該塊的大小。在紋理貼圖技術(shù)中,形變總是越小越好,因此閥值應(yīng)該比較小。另一方面,塊的面積應(yīng)該越大越好,這樣有利于后面使用圖的分割來產(chǎn)生相鄰塊的無縫連接。因此,閥值要求比較大。根據(jù)實(shí)驗(yàn)的結(jié)果,該閥值的大小通常取在 和 之間。
條件2該塊的面積不能太大,必須保證經(jīng)步驟(2)展平縮放后的塊會(huì)超過紋理樣圖的大小。為此,我們必須再設(shè)置一閥值l。對(duì)于每個(gè)要加入該塊的面,它的每個(gè)頂點(diǎn)必須滿足下面的式子|| d×nseed||<l (1)其中,d是種子面中心到該頂點(diǎn)的向量,nseed是種子面的法向量。閥值l大小的確定,跟紋理的大小,步驟(2)中的紋理映射方法和系數(shù)有關(guān)。l的計(jì)算公式為l=λ×ts---(2)]]>其中,λ是調(diào)節(jié)系數(shù),它控制該塊的最大面積與紋理大小的關(guān)系。t是紋理的大小(這里,我們假設(shè)了紋理是長(zhǎng)寬相等的)。s是步驟(2)中要使用到的塊縮放系數(shù)。
因?yàn)橥ǔT趫D形系統(tǒng)中,紋理的大小表示為1×1。所以上面的公式又可以簡(jiǎn)化為l=λs---(3)]]>該過程一直重復(fù),直到?jīng)]有更多的面加入塊中為止。這些面的集合就是我們需要的表面塊。如果沒有這樣的塊,即所有面都已經(jīng)貼上紋理,那么算法結(jié)束。
(2)展平和縮放。展平是把該塊按其中心位置的法向量平行投影到平面上。這樣該塊中每個(gè)頂點(diǎn)在平面上都有一個(gè)對(duì)應(yīng)點(diǎn)。然后對(duì)展平后的塊進(jìn)行適當(dāng)?shù)目s放??s放的目的是使紋理中的元素以要求的大小映射到模型表面。具體是每個(gè)對(duì)應(yīng)點(diǎn)的坐標(biāo)乘上一個(gè)縮放系數(shù)s即可。s的大小,要根據(jù)模型的大小,紋理的大小和客觀要求來確定。最后,把展平和縮放的塊覆蓋在樣圖上,其覆蓋區(qū)域就是將要貼在該塊上的紋理樣圖片。
對(duì)于紋理映射來說,我們可以得到每個(gè)頂點(diǎn)的紋理坐標(biāo);對(duì)于紋理合成來說,我們可以得到每個(gè)頂點(diǎn)的顏色。對(duì)于某些紋理,通過簡(jiǎn)單地把展平后的塊隨機(jī)覆蓋在樣圖上來選擇需要的樣圖片,可能不會(huì)產(chǎn)生令人滿意的效果。為此,我們可以在樣圖中尋找一塊較好的紋理貼到該塊上,使重復(fù)貼圖區(qū)的新舊紋理較相似,即差異度較小。這樣有利于在第三步分割中使新舊紋理產(chǎn)生較好的連接。估計(jì)重復(fù)貼圖區(qū)的新舊紋理的差異度,可以在重復(fù)貼圖區(qū)中均勻地設(shè)置一些采樣點(diǎn)。對(duì)于每個(gè)采樣點(diǎn),計(jì)算在新舊紋理上的顏色。然后,差異度按如下公式計(jì)算Cost=∑||Cold_i-Cnew_i||2(4)Cold分別表示采樣點(diǎn)i上舊紋理的顏色。相應(yīng)的,Cnew分別表示采樣點(diǎn)i上新紋理的顏色,Cost為新舊紋理的差異度。
所謂選擇一塊差異度較小的紋理,先隨機(jī)選擇若干塊,然后取差異度最小的;也可以遍歷整個(gè)樣圖,尋找一塊差異度最小的紋理,但是這樣會(huì)產(chǎn)生比較大的時(shí)間代價(jià)。
(3)如果該塊中原來就有一部分面已經(jīng)貼上了紋理,那么就使用圖的分割(Graph Cut)技術(shù)對(duì)該重復(fù)貼圖區(qū)進(jìn)行分割,使新貼上的紋理與原來的紋理結(jié)合得最連續(xù)。然后返回第(1)步。
重復(fù)貼圖區(qū)中的每個(gè)面,都是新舊兩個(gè)紋理。本發(fā)明使用圖的分割(Graph Cut)技術(shù)對(duì)重復(fù)貼圖區(qū)進(jìn)行分割,使新舊紋理連接自然。下面進(jìn)一步說明重復(fù)貼圖區(qū)及其分割。
把重復(fù)貼圖區(qū)的每個(gè)面抽象成一個(gè)點(diǎn)。如果兩個(gè)面相鄰,那么這兩個(gè)面對(duì)應(yīng)的點(diǎn)各有一條指向?qū)Ψ降挠邢蜻?。邊上的?quán)重是指該面上以前的紋理與另一面上新的紋理相連接時(shí)的不連續(xù)度。例如如圖1所示,面a,b相鄰,點(diǎn)a′,b′分別是a,b對(duì)應(yīng)的抽象點(diǎn),a′,b′間存在有向邊(a′,b′)和(b′,a′)。邊(a′,b′)上的權(quán)重是指面a上的舊紋理和面b上的新紋理連接的代價(jià),即兩個(gè)紋理在連接處的差異度。相應(yīng)的,邊(b′,a′)上的權(quán)重是指b上的舊紋理和面a上的新紋理連接的代價(jià)。此外,在圖中再加上兩個(gè)輔助點(diǎn)s和t。s是圖的源點(diǎn),它代表以前貼的紋理。重復(fù)貼圖區(qū)中的面a,如果處于邊緣且于已經(jīng)貼圖的面g相鄰,那么有一條從s指向它的邊。邊上的權(quán)重即是面g上的舊紋理與a的新紋理連接的代價(jià)之和。t是圖的終點(diǎn),它代表新的紋理。如果重復(fù)貼圖區(qū)中的面d,它處于邊緣并且與第一次貼圖的面h相鄰,那么它有一條指向t的邊。邊上的權(quán)重就是面d的舊紋理與面h的新紋理連接的代價(jià)之和。邊上權(quán)重的計(jì)算,可以通過在邊上設(shè)置一定數(shù)目的采樣點(diǎn),采樣點(diǎn)的數(shù)目正比于該邊的長(zhǎng)度。然后計(jì)算每個(gè)采樣點(diǎn)上顏色差異的和得到。計(jì)算公式如公式(4)。這樣就得到了有源點(diǎn)s,終點(diǎn)t的帶權(quán)有向圖。
把該問題轉(zhuǎn)換為圖之后,求該圖s-t最小割,與s分為一組的面,仍然貼以前的舊紋理,而與t分為一組的面貼新的紋理。顯而易見,圖s-t分割得到的分割代價(jià),就是新舊紋理的連接代價(jià)。這樣,我們?yōu)樾碌膲K貼上了紋理,并且使新舊的紋理連接的代價(jià)最小。如圖2,假設(shè)虛線表示圖1的最小割,那么我們得到的最后結(jié)果如右邊的圖所示。
本發(fā)明具有以下的優(yōu)點(diǎn)(1)算法比較簡(jiǎn)單,宜于實(shí)現(xiàn)。
(2)適用于各種紋理,都可以生成比較理想的效果。
該算法速度快于大部分現(xiàn)有的算法,而且跟樣圖的大小無關(guān)。
圖1為新舊紋理的自然連接轉(zhuǎn)換為圖的演示。其中,左圖為新舊紋理重復(fù)貼示,右圖為左圖抽象后的有向圖。
圖2為轉(zhuǎn)換為圖后獲得新舊紋理連接圖的演示。其中,左圖為圖的s-t最小割,右圖為最后結(jié)果。
具體實(shí)施例方式
下面以一個(gè)簡(jiǎn)化的示例演示了如何使用這個(gè)算法將新舊紋理的自然連接問題轉(zhuǎn)換到圖的問題,以及如何根據(jù)圖的最小割得到最終我們需要的紋理。如圖1中的左圖所示,每個(gè)三角形表示網(wǎng)格上的一個(gè)面,所有的三角片構(gòu)成了我們要給其貼圖的網(wǎng)格。在這個(gè)網(wǎng)格上,有一部分網(wǎng)格已經(jīng)貼上了紋理(在圖1左圖中以正斜線陰影表示)。首先,我們按照步驟(1),選取一塊表面(即圖1左圖中的粗線包圍的區(qū)域)。在該塊表面中,既包含沒有貼圖的面,如h,也包含已經(jīng)貼圖的面,如a,b,c,d,e,f。然后按照步驟(2),展平該塊,并選擇一塊合適的紋理貼上去。這一步驟完成后的結(jié)果,即如圖1左圖所示。新的紋理以反斜線陰影表示。其中a,b,c,d,e,f就是重復(fù)貼圖區(qū)域,這些面上既有新紋理,也包含舊紋理。接著我們要利用圖的s-t最小割來決定在重復(fù)貼圖區(qū)域中的這些面應(yīng)該保留哪份紋理。
首先我們根據(jù)重復(fù)貼圖區(qū)域,按照步驟(3)給出的方法得到相應(yīng)的有向圖(如圖1右圖所示,在該圖中,沒有標(biāo)出各條邊的權(quán)重)。其中,面a,f因?yàn)榕c舊紋理區(qū)域相連,所以各有一條s指向a’,f’的邊。而面c,d因?yàn)榕c新紋理區(qū)域相連,所以各有一條c’,d’指向t的邊。然后我們對(duì)該圖求它的s-t最小割。如圖2左圖所示,虛線即是該圖的s-t最小割。該最小割把所有的點(diǎn)分成兩部分,一部分與s為一組,一部分與t為一組。其中與t為一組的e’和d’,其對(duì)應(yīng)的面e,d將用新紋理取代舊紋理,而其他的面則保留舊紋理。最終的結(jié)果如圖2右圖所示。
權(quán)利要求
1.一種基于樣圖覆蓋、分割的三維紋理貼圖方法,其特征在于具體步驟如下(1)從三維物體上選取一塊表面,其步驟是先在模型上選取一個(gè)還沒有貼圖的面,把它作為該塊表面的種子面;然后,選取一個(gè)與該塊相鄰的面,如果該面滿足下面兩個(gè)條件,那么就把該面加入到塊中條件1該面的法向量與種子面的法向量的夾角小于閥值P,p在 和 之間;條件2該面的每個(gè)頂點(diǎn)滿足下面的式子‖d×nseed‖<l(1)其中,d是種子面中心到該頂點(diǎn)的向量,nseed是種子面的法向量,l=λ×ts---(2)]]>其中,λ是調(diào)節(jié)系數(shù),t是紋理的大小,s是步驟(2)中要使用到的塊縮放系數(shù);該過程一直重復(fù),直到?jīng)]有更多的面加入塊中為止;(2)展平和縮放,其步驟是先把該塊按其中心位置的法向量平行投影到平面上,然后對(duì)展平后的塊的每個(gè)對(duì)應(yīng)點(diǎn)的坐標(biāo)乘上一個(gè)縮放系數(shù)s;最后,把展平和縮放的塊覆蓋在樣圖上,其覆蓋區(qū)域就是將要貼在該塊上的紋理樣圖片;(3)如果該塊中原來就有一部分面已經(jīng)貼上了紋理,那么就使用圖的分割技術(shù)對(duì)該重復(fù)貼圖區(qū)進(jìn)行分割,使新貼上的紋理與原來的紋理結(jié)合得最連續(xù),然后返回第(1)步。
2.根據(jù)權(quán)利要求1所述的三維紋理貼圖方法,其特征在于要尋找一塊使重復(fù)貼圖區(qū)的新舊紋理差異度較小的樣圖貼到該塊表面上,其差異度的計(jì)算式為Cost=∑‖Gold_i-Cnew_i‖2(4)Cold分別表示采樣點(diǎn)i上舊紋理的顏色,Cnew分別表示采樣點(diǎn)i上新紋理的顏色,Cost為新舊紋理的差異度。
全文摘要
本發(fā)明為一種基于樣圖覆蓋、分割的三維紋理貼圖方法。其步驟是先從三維物體上按照一定的條件,選取一塊表面,然后將該塊表面展平、縮放,并選擇新舊紋理差異度較小的塊覆蓋在樣圖上;最后使用圖的分割技術(shù)對(duì)重復(fù)貼圖區(qū)進(jìn)行分割,使新貼上的紋理與原來的紋理結(jié)合得最連續(xù)。本發(fā)明的特點(diǎn)是算法簡(jiǎn)單,速度快捷,易于實(shí)現(xiàn);適用于各種紋理的貼圖,都能產(chǎn)生比較理想的效果。
文檔編號(hào)G06T15/20GK1564201SQ200410017658
公開日2005年1月12日 申請(qǐng)日期2004年4月13日 優(yōu)先權(quán)日2004年4月13日
發(fā)明者沈一帆 申請(qǐng)人:復(fù)旦大學(xué)