專利名稱:一種模型幾何空間輪廓線查找的預(yù)處理方法
技術(shù)領(lǐng)域:
本發(fā)明涉及動畫制作技術(shù),尤其涉及一種模型幾何空間輪廓線查找的預(yù)處理方法。
背景技術(shù):
在當(dāng)前的各種游戲和動畫制作中,越來越多地追求特色和風(fēng)格,逐漸出現(xiàn)的非照片真實級渲染(NPR,Non-Photorealistic Rendering),例如卡通渲染就是其中較為容易實現(xiàn)特色和風(fēng)格的一個。在這種渲染中,關(guān)鍵技術(shù)是模型輪廓線的查找,其中3D幾何空間輪廓線的查找對硬件要求很低,易于實現(xiàn),所以被廣泛采用。
通常情況下,在3D幾何空間輪廓線的查找中,根據(jù)具體的情況,可以將需要渲染的模型分成若干個面,每個面都由一個三角形構(gòu)成,每個三角形都有三條邊,相鄰的三角形共用一條邊,參見圖1,圖1是模型結(jié)構(gòu)示意圖,其中三角形f1和f2共用邊AB。模型的輪廓線就是指在某一視點方向上,共用一條邊的兩個面具有不同的方向性,被共享的這條邊就是模型輪廓線的一部分,所有這樣的邊就組成了模型的輪廓線,參見圖2,圖2是紙盒模型的輪廓線示意圖,圖2中的黑線邊框就是紙盒在此視點方向上的紙盒模型輪廓線。面的方向性可以由法線信息確定,兩個面具有不同的方向性就是具有不同的法線方向。
從上面描述的輪廓線定義可知,查找模型的幾何空間輪廓線,需要知道組成模型的三角形的邊信息、是否有兩個三角形共用這條邊以及共用這條邊的兩個三角形的法線信息,對于沒有被兩個三角形共用的邊可以將包含這條邊的三角形的法線方向取反,作為其中的一個法線信息,也就是說,無論邊是否被共用,邊信息中一定包含雙法線信息。對于有兩個三角形共用一條邊的情況來說,雙法線信息就是共用本邊的兩個三角形的法線信息;對于只有一個三角形獨享本邊的情況來說,雙法線信息就是獨享本邊的三角形的法線信息和將其法線方向取反的信息。于是,為了查找模型的幾何空間輪廓線,需要先對模型的結(jié)構(gòu)數(shù)據(jù)進(jìn)行預(yù)處理,得到包含雙法線信息的邊序列列表。
現(xiàn)有的確定邊信息和雙法線信息的預(yù)處理方法是首先,保存組成模型的所有三角形的邊信息,邊信息中包括對應(yīng)三角形的法線信息,然后,從第一個三角形的第一條邊開始,依次遍歷所有三角形的邊,查找共用該邊的其它三角形,將共用該邊的其它三角形的法線信息加入到邊信息中,對于沒有找到共用該邊的三角形的情況,將獨享該邊的三角形的法線方向取反的信息加入到邊信息中;按照同樣的方法,依次遍歷完所有三角形的邊信息后,輸出所獲得的包含雙法線信息的邊序列列表。
從上面的描述可以看到,現(xiàn)有的預(yù)處理方法是每查找一條邊就需要遍歷所有的三角形,重復(fù)做了大量的工作,效率較低;另外,因為在組成模型的三角形中會存在大量的共用邊,例如,圖1中的三角形f1和f2就共用邊AB,然而,以三角形f1的邊AB開始查找其它共用AB的三角形時,會找到三角形f2,于是邊AB會保存f1和f2的法線信息,同樣地,以三角形f2的邊AB開始查找其它共用AB的三角形時,又會找到三角形f1,于是邊AB又會保存f1和f2的法線信息,所以在最后輸出的包括雙法線信息的邊序列中會含有大量重復(fù)的信息,這無疑會給后續(xù)的幾何空間輪廓線的查找增加多余的信息,影響幾何空間輪廓線的查找效率和處理速度。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明的目的在于提供一種模型幾何空間輪廓線查找的預(yù)處理方法,應(yīng)用本發(fā)明的方法可以提高幾何空間輪廓線的查找效率和處理速度。
為了實現(xiàn)上述發(fā)明目的,本發(fā)明提供一種模型幾何空間輪廓線查找的預(yù)處理方法,包括A、保存組成模型的所有面的所有邊信息,并在所有邊信息中加入雙法線信息,將加入雙法線信息的邊信息中的第一條邊作為當(dāng)前邊;B、判斷當(dāng)前邊的信息是否保存在邊序列列表中,如果是,舍棄當(dāng)前邊信息;否則,將當(dāng)前邊信息保存在邊序列列表中;C、判斷是否遍歷過所有保存的邊,如果不是,將下一條邊作為當(dāng)前邊,返回執(zhí)行步驟B;否則,輸出邊序列列表。
所述的面可以是三角形平面。
步驟A中所述的邊信息可以包括按照面索引號的順序依次保存兩個頂點的索引號的第一數(shù)組;用于保存頂點被哪些面所有的第二數(shù)組;用于記錄兩個頂點所確定的邊是否保存在邊序列列表中的布爾數(shù)組;步驟B所述判斷為判斷布爾數(shù)組中當(dāng)前邊的兩個頂點的布爾變量值是否都是false,如果是,未保存在邊序列列表中;否則,已保存在邊序列列表中;未保存時,步驟B進(jìn)一步包括將兩個頂點的布爾變量值改為true。
步驟A中所述在所有邊信息中加入雙法線信息,可以包括a11、將邊信息中的第一條邊作為當(dāng)前邊;a12、查找是否有共用當(dāng)前邊的面,如果有,則將所找到的面的法線信息加入到當(dāng)前邊信息中,否則,將獨享當(dāng)前邊的面的法線信息和法線方向取反的信息,加入到當(dāng)前邊信息中;a13、將下一條邊作為當(dāng)前邊,返回執(zhí)行步驟a12,直至查找完所有的邊。
步驟A中所述在所有邊信息中加入雙法線信息,可以包括a21、將第一數(shù)組中第一條邊作為當(dāng)前邊;a22、以當(dāng)前邊的一個頂點的索引號為基準(zhǔn),在第二數(shù)組中查找共用該頂點的面,并找到其中共用當(dāng)前邊的另一個頂點的面,將所找到的面的法線信息加入到兩個頂點信息中,如果未找到共用當(dāng)前邊的另一個頂點的面,將獨享該兩個頂點的面的法線信息和法線方向取反的信息加入到兩個頂點信息中;a23、將第一數(shù)組中的下一條邊作為當(dāng)前邊,返回執(zhí)行步驟a22,直至查找完第一數(shù)組中的所有的邊。
從上述方案可以看到,本發(fā)明提供的一種模型幾何空間輪廓線查找的預(yù)處理方法具有以下有益效果1、應(yīng)用本發(fā)明提供的方法,通過比較判斷,舍棄已經(jīng)保存的邊信息,只輸出不含重復(fù)邊信息的邊序列,簡化查找?guī)缀慰臻g輪廓線所需的信息,優(yōu)化模型的數(shù)據(jù)結(jié)構(gòu),從而提高幾何空間輪廓線查找的效率,在極限情況下,對于有N個三角形的模型,采用現(xiàn)有做法提取確定邊信息的頂點信息和雙法線信息后,幾何空間輪廓線查找需要處理6N個頂點,而經(jīng)過本發(fā)明的優(yōu)化后,幾何空間輪廓線查找僅需要處理3N個頂點,效率可以提高一倍;2、本發(fā)明提供的方法不需要每查找一條邊就遍歷一次模型所有面的所有的邊,而是通過確定邊的頂點所帶有的面的索引號直接定位到共用邊的其它面,查找速度非常快,在通過程序運行時,有2萬個三角形的模型在不到一秒的時間內(nèi)就可以優(yōu)化完畢,不影響幾何空間輪廓線的查找,并且經(jīng)過本發(fā)明優(yōu)化后的模型數(shù)據(jù),應(yīng)用在以后的渲染和查找過程中,可以提高效率和處理速度。
圖1是模型結(jié)構(gòu)示意圖;圖2是紙盒模型的輪廓線示意圖;圖3是根據(jù)本發(fā)明實施例的模型幾何空間輪廓線查找的預(yù)處理方法流程圖。
具體實施例方式
為了使本發(fā)明的特征和優(yōu)點更加清楚明白,下面參照附圖結(jié)合具體實施例對本發(fā)明作進(jìn)一步的描述。
本發(fā)明的主要思想是通過比較判斷舍棄已經(jīng)保存的帶雙法線信息的邊信息,輸出不含重復(fù)邊信息的帶雙法線信息的邊序列。
參見圖3,圖3是根據(jù)本發(fā)明實施例的模型幾何空間輪廓線查找的預(yù)處理方法流程圖,具體操作流程和步驟如下步驟301、遍歷模型的每個三角形,存儲三角形的每條邊的信息,并將三角形的法線信息存儲到相應(yīng)的邊信息中,將邊信息中的第一條邊作為當(dāng)前邊;組成模型的每個三角形都有自己的索引號(index),三角形的每個頂點也都有頂點索引號(vertexcount),這里,為了方便描述,設(shè)置數(shù)組vTrgledge作為第一數(shù)組,用于按照三角形索引號的順序保存所有三角形的邊信息,由于三角形的邊是由兩個頂點確定的,所以,三角形的每條邊都可以通過保存兩個頂點來保存,于是,在數(shù)組vTrgledge中,按照三角形索引號依次保存頂點信息對,并在每個頂點信息中加入對應(yīng)三角形的法線信息,于是對于一個三角形來說,就需要保存三對加入該三角形法線信息的頂點信息,參見表1,表1是將組成模型的第一個三角形的邊信息保存在數(shù)組vTrgledge中的示例,該三角形索引號為0,三個頂點的索引號分別為10、11、12,對于其它三角形則按照三角形的索引號依次保存在數(shù)組中即可,其中括號中的數(shù)字是頂點所在的三角形的索引號。
表1再引入一個數(shù)組vTrglIndex[vertexcount]作為第二數(shù)組,用于保存頂點索引號為vertexcount的頂點被索引號為index的三角形所有;參見表2,表2是數(shù)組vTrglIndex[vertexcount]的示例,其中三角形0的三個頂點分別是10、11、12,三角形1的三個頂點分別是11、12、13,也就是說,頂點11和12被三角形0和1共有;對于其它三角形的頂點依次保存在數(shù)組中即可,其中括號中的數(shù)字表示頂點被哪些三角形所有。
表2另外,再引入一個布爾數(shù)組bvertexmeet[vertexcounta][vertexcountb],用于記錄兩個頂點vertexcounta、vertexcountb所確定的邊是否保存在邊序列列表中,其中vertexcounta和vertexcountb表示兩個不同頂點的索引號,bvertexmeet[vertexcounta][vertexcountb]的初始值為false,表示這兩個頂點所確定的邊沒有保存在邊序列列表中,參見表3,表3是在初始情況下,三角形0的三條邊的布爾數(shù)組bvertexmeet[vertexcounta][vertexcountb]的示例。
表3遍歷完模型的所有三角形后,所有三角形的邊信息和頂點相關(guān)信息分別存儲到數(shù)組vTrgledge、數(shù)組vTrglIndex[vertexcount]和布爾數(shù)組bvertexmeet[vertexcounta][vertexcountb]中,于是,通過數(shù)組vTrglIndex[vertexcount]就可以知道索引號為vertexcount的頂點被哪些三角形共用,這在步驟302中可以用來定位三角形的邊,同時加快遍歷的速度。
步驟302、查找共用當(dāng)前邊的三角形,如果有共用當(dāng)前邊的三角形,則將該三角形的法線信息加入到當(dāng)前邊信息中,否則,將獨享當(dāng)前邊的三角形的法線方向取反,加入到當(dāng)前邊信息中;具體地,在按照表1所示的示例的數(shù)組vTrgledge中,以第一個三角形的第一條邊的第一個頂點開始,在表2中找到所有共用這個頂點的三角形,判斷其中是否有三角形還共用該邊的另一個頂點,如果有,則將該三角形的法線信息加入到頂點信息中,否則,將第一個三角形的法線方向取反,加入到頂點信息中。
仍然以步驟301中所舉的示例為例,從三角形0的第一條邊的第一個頂點10開始,在表2中查找頂點10還被哪些三角形共有,可知只有三角形0包括頂點10,則說明在三角形0中由頂點10和11所確定的邊只被三角形0獨享,于是,再將三角形0的法線方向取反,加入到頂點10和11的信息中,這時,頂點10和11的信息中就包括雙法線信息;對于表1中第二條邊的頂點11,在表2中查找頂點11還被哪些三角形共有,可知除了三角形0以外,還有三角形1包括頂點11,于是,再在表1中查找三角形1除了包括頂點11外,是否還包括頂點12,也就是判斷三角形1是否與三角形0共用頂點11和12確定的第二條邊,這里,由于表1所示的數(shù)組vTrgledge是根據(jù)三角形索引號的先后順序依次保存三角形的邊的,所以如果找到三角形1也包括頂點11,通常就可以知道在表1中第4到第6數(shù)組是表示三角形1的邊,因為根據(jù)數(shù)組vTrgledge的原則,前面三個數(shù)組是表示三角形0的邊,接下來的三個數(shù)組是表示三角形1的邊,于是只要在對應(yīng)位置查找是否還包括頂點12即可。
從上面的描述可以看到,相比現(xiàn)有技術(shù)每查找一條邊都需要遍歷一遍數(shù)組vTrgledge中所存儲的邊來說,以上的遍歷要快得多。
步驟303、判斷當(dāng)前邊信息是否存儲在邊序列列表中,如果是,則丟棄當(dāng)前邊信息;否則,將當(dāng)前邊信息保存在邊序列列表中;當(dāng)前邊信息是否存儲在邊序列列表中,可以通過判斷兩個頂點的布爾變量的值進(jìn)行判定,初始情況下,頂點10、11確定的邊沒有保存在邊序列列表中,因此,bvertexmeet[10][11]=false,于是,只需要判斷bvertexmeet[10][11]=false,并且同時bvertexmeet[11][10]=false,就可以認(rèn)為頂點10、11沒有保存在邊序列列表中,那么就將頂點10、11連同加入的雙法線信息一起保存在邊序列列表中,同時,令bvertexmeet[11][10]=true,bvertexmeet[10][11]=true,表示頂點10和11確定的邊已經(jīng)保存在邊序列列表中,在以后的遍歷過程中,不必再保存頂點10和11確定的邊。這里的邊序列列表就是本發(fā)明實施例最終輸出的不含重復(fù)邊信息的邊序列。
步驟304、判斷是否所有的邊都遍歷完畢,如果不是,將下一邊作為當(dāng)前邊,返回執(zhí)行步驟302;否則,輸出邊序列列表,結(jié)束。
將變量組vTrgledge中所有的邊都遍歷完,并將相應(yīng)的信息保存到邊序列列表中,這樣在邊序列列表中就保存了經(jīng)過本發(fā)明優(yōu)化的邊序列,在進(jìn)行后續(xù)的幾何輪廓線查找時,處理速度將會得到提高。
以上參照圖3描述了根據(jù)本發(fā)明實施例對模型幾何空間輪廓線的查找進(jìn)行預(yù)處理的方法和過程,采用以上所述的方法和步驟,對模型的數(shù)據(jù)結(jié)構(gòu)進(jìn)行優(yōu)化,得到不含重復(fù)信息的邊序列,為后續(xù)的幾何空間輪廓線的查找提供了最精簡的數(shù)據(jù),從而可以提高幾何空間輪廓線查找和NPR處理的速度,效率也因此得到提高。
以上所述,僅為本發(fā)明的較佳實施例而已,并非用以限定本發(fā)明的保護(hù)范圍。
權(quán)利要求
1.一種模型幾何空間輪廓線查找的預(yù)處理方法,其特征在于,該方法包括A、保存組成模型的所有面的所有邊信息,并在所有邊信息中加入雙法線信息,將加入雙法線信息的邊信息中的第一條邊作為當(dāng)前邊;B、判斷當(dāng)前邊的信息是否保存在邊序列列表中,如果是,舍棄當(dāng)前邊信息;否則,將當(dāng)前邊信息保存在邊序列列表中;C、判斷是否遍歷過所有保存的邊,如果不是,將下一條邊作為當(dāng)前邊,返回執(zhí)行步驟B;否則,輸出邊序列列表。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述的面是三角形平面。
3.根據(jù)權(quán)利要求1或2所述的方法,其特征在于,步驟A中所述的邊信息包括按照面索引號的順序依次保存兩個頂點的索引號的第一數(shù)組;用于保存頂點被哪些面所有的第二數(shù)組;用于記錄兩個頂點所確定的邊是否保存在邊序列列表中的布爾數(shù)組;步驟B所述判斷為判斷布爾數(shù)組中當(dāng)前邊的兩個頂點的布爾變量值是否都是false,如果是,未保存在邊序列列表中;否則,已保存在邊序列列表中;未保存時,步驟B進(jìn)一步包括將兩個頂點的布爾變量值改為true。
4.根據(jù)權(quán)利要求1或2所述的方法,其特征在于,步驟A中所述在所有邊信息中加入雙法線信息,包括a11、將邊信息中的第一條邊作為當(dāng)前邊;a12、查找是否有共用當(dāng)前邊的面,如果有,則將所找到的面的法線信息加入到當(dāng)前邊信息中,否則,將獨享當(dāng)前邊的面的法線信息和法線方向取反的信息,加入到當(dāng)前邊信息中;a13、將下一條邊作為當(dāng)前邊,返回執(zhí)行步驟a12,直至查找完所有的邊。
5.根據(jù)權(quán)利要求3所述的方法,其特征在于,步驟A中所述在所有邊信息中加入雙法線信息,包括a21、將第一數(shù)組中第一條邊作為當(dāng)前邊;a22、以當(dāng)前邊的一個頂點的索引號為基準(zhǔn),在第二數(shù)組中查找共用該頂點的面,并找到其中共用當(dāng)前邊的另一個頂點的面,將所找到的面的法線信息加入到兩個頂點信息中,如果未找到共用當(dāng)前邊的另一個頂點的面,將獨享該兩個頂點的面的法線信息和法線方向取反的信息加入到兩個頂點信息中;a23、將第一數(shù)組中的下一條邊作為當(dāng)前邊,返回執(zhí)行步驟a22,直至查找完第一數(shù)組中的所有的邊。
全文摘要
本發(fā)明公開一種模型幾何空間輪廓線查找的預(yù)處理方法。該方法包括保存模型所有面的所有邊信息,并在所有邊信息中加入雙法線信息,將加入雙法線信息的邊信息中的第一條邊作為當(dāng)前邊;按照下面的步驟遍歷所保存的模型的所有邊直至結(jié)束判斷當(dāng)前邊的信息是否保存在邊序列列表中,如果是,舍棄當(dāng)前邊信息;否則,將當(dāng)前邊信息保存在邊序列列表中。本發(fā)明提供的方法可以優(yōu)化模型的結(jié)構(gòu)數(shù)據(jù),為幾何空間輪廓線的查找提供最精簡的數(shù)據(jù),從而提高查找?guī)缀慰臻g輪廓線的效率和處理速度。
文檔編號G06T15/00GK101046889SQ20061006519
公開日2007年10月3日 申請日期2006年3月27日 優(yōu)先權(quán)日2006年3月27日
發(fā)明者劉皓 申請人:騰訊科技(深圳)有限公司