本發(fā)明涉及虛擬仿真領(lǐng)域,具體涉及一種將dgn模型轉(zhuǎn)化成輕量模型的方法。
背景技術(shù):
dgn文件是一種在工程設(shè)計領(lǐng)域應(yīng)用非常廣泛的三維模型文件格式,dgn文件中不僅包含模型的幾何信息還有編碼、顏色、材質(zhì)等屬性信息。但是dgn文件并不能被很多三維軟件兼容,無法被它們直接打開,所以用三維軟件打開dgn模型之前需要將dgn文件轉(zhuǎn)化成其它格式。目前利用一些軟件自帶的轉(zhuǎn)換插件雖然能dgn模型轉(zhuǎn)化成面片模型,但是這些插件只使用了一些通用的、簡單的算法對模型整體進(jìn)行面片化,轉(zhuǎn)換出來的模型存在占用內(nèi)存較大;屬性信息丟失;模型是一個整體,三維軟件無法對文件中特定的幾何體進(jìn)行操作。這給對模型的操作如移動、屬性查詢等造成了很大的不便。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明針對現(xiàn)有技術(shù)的不足,提出一種將dgn模型轉(zhuǎn)化成輕量模型的方法。
將dgn模型轉(zhuǎn)化成輕量模型的方法,包括以下步驟:
s1,首先打開dgn文件,若打開成功則創(chuàng)建文本格式的輕量化文件;然后掃描dgn文件中的所有的模型描述算子,將其存入數(shù)組arraya;模型描述算子為mdl中定義的一種描述模型的數(shù)據(jù)結(jié)構(gòu),為雙向鏈表形式,含有模型的幾何信息、屬性信息等;
s2,判斷arraya是否為空;若為空說明dgn文件是空文件,不需要處理;若不為空,進(jìn)行以下步驟;
s3,讀取arraya中的第一個模型描述算子存入dsc;
s4,提取模dsc中編碼信息即linkage;然后獲取dsc中的模型的材質(zhì)、顏 色等屬性信息;
s5,提取dsc中模型的類型;
s6,模型面片化處理;
s7,將數(shù)據(jù)及屬性信息按照wrl文件或者obj文件的格式寫入創(chuàng)建的輕量化文件中;
s8,判斷arraya中是否有模型描述算子未處理,若有,則繼續(xù)從s3開始處理,直至所有模型描述算子處理完畢;若沒有,則結(jié)束。
優(yōu)選地,s5具體包含以下步驟;
s51,判斷dsc中的模型是否為點(diǎn)、線段獨(dú)立元素,若是則無需處理,若不是,進(jìn)行以下步驟;
s52,判斷dsc中模型的類型是否為cell_header_elm,若不是,則可以直接對模型進(jìn)行面片化處理,若是,進(jìn)行以下步驟;
s53,判斷dsc中模型是否為groupedhole或者smartsolid,若是,則可以直接面片化處理,若不是,則說明該模型描述算子含有子模型描述算子(子模型描述算子數(shù)據(jù)結(jié)構(gòu)與模型描述算子相同),則需要通過進(jìn)行以下循環(huán)逐個處理子模型描述算子;
s54,將第一個子模型描述算子賦給tempdsc;
s55,獲取tempdsc中模型類型,然后跳轉(zhuǎn)到s52,進(jìn)行遞歸處理;
s56,將下一個子模型描述子算子賦給tempdsc;
s57,判斷tempdsc是否為空,若為空,則說明已經(jīng)處理完所有子模型描述算子,結(jié)束;若不為空,則跳轉(zhuǎn)到s55繼續(xù)處理。
優(yōu)選地,s6具體包括以下步驟:
首先,平面或曲面的面片化數(shù)據(jù)存儲在兩個數(shù)組中,第一個數(shù)組pointarray存放構(gòu)成曲面的所有點(diǎn)的三維坐標(biāo);第二個數(shù)組indexarray存放構(gòu)成面片的點(diǎn)在pointarray中的索引號,每個面片的索引號之間用數(shù)字“-1”隔開;
然后,對于只包含一個平面或曲面即無須“爆炸”的幾何體可直接面片化得到其數(shù)據(jù);對于可“爆炸”成多個平面或曲面的幾何體或者平面、曲面則先進(jìn)行“爆炸”,獲取每個平面或曲面的面片化數(shù)據(jù),依次存放在indexarray1、pointarray1、indexarray2、pointarray2...indexarrayn、pointarrayn中。然后 拼接成一個平面或曲面,拼接方式為:新建一個數(shù)據(jù)數(shù)組pointarray,大小為pointarray1、pointarray2...pointarrayn中元素數(shù)目之和,將每個子平面或子曲面的數(shù)據(jù)數(shù)組中的元素按順序存放到pointarray中;新建一個索引數(shù)組indexarray,大小為indexarray1、indexarray2...indexarrayn之和,第一個子平面或子曲面索引數(shù)組所有元素原樣依次放入indexarray,第二個子平面或子曲面索引數(shù)組中所有的索引值加上第一個子平面或子曲面數(shù)據(jù)數(shù)組元素個數(shù)后存入新的索引數(shù)組,以此類推將其他子平面或子曲面的索引數(shù)組元素存入新的索引數(shù)組。這樣拼接好的幾何體或平面、曲面的面片化數(shù)據(jù)存放到了兩個數(shù)組pointarray與indexarray中。
與現(xiàn)有技術(shù)相比,本發(fā)明具有以下有益效果:
1、本發(fā)明提供的將dgn模型轉(zhuǎn)化成輕量模型的方法,可以實(shí)現(xiàn)將dgn格式的模型轉(zhuǎn)成輕量化模型,輕量化模型中包含了原dgn文件中每個模型的編碼,材質(zhì)、顏色等屬性信息,為其它軟件對模型進(jìn)行操作特別是屬性查詢創(chuàng)造了條件。
2、本發(fā)明提供的將dgn模型轉(zhuǎn)化成輕量模型的方法,能夠?qū)gn文件中的幾何模型進(jìn)行拆解并單獨(dú)輕量化,導(dǎo)出時再重新合并;并能夠?qū)⒚總€幾何體的編碼、材質(zhì)、顏色等屬性取出,然后將其寫入到輕量化模型文件中。通過這個方法轉(zhuǎn)化的輕量化模型包含了原dgn文件中所有幾何體的編號、屬性等信息,為其他三維軟件進(jìn)行查詢、漫游等操作提供支持。
附圖說明
圖1為符合本發(fā)明優(yōu)選實(shí)施例的將dgn模型轉(zhuǎn)化成輕量模型的方法的流程圖。
圖2為符合本發(fā)明優(yōu)選實(shí)施例的將dgn模型轉(zhuǎn)化成輕量模型的方法的s5的流程圖。
圖3為符合本發(fā)明優(yōu)選實(shí)施例的將dgn模型轉(zhuǎn)化成輕量模型的方法的s6的流程圖。
圖4為符合本發(fā)明優(yōu)選實(shí)施例的dgn文件對應(yīng)的輕量化模型文件的結(jié)構(gòu)樹。
具體實(shí)施方式
為使本發(fā)明的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖和具體實(shí)施方式對本發(fā)明作進(jìn)一步詳細(xì)的說明。
如圖1所示,將dgn模型轉(zhuǎn)化成輕量模型的方法,包括以下步驟:
s1,首先打開dgn文件,若打開成功則創(chuàng)建文本格式的輕量化文件;然后掃描dgn文件中的所有的模型描述算子,將其存入數(shù)組arraya;模型描述算子為mdl中定義的一種描述模型的數(shù)據(jù)結(jié)構(gòu),為雙向鏈表形式,含有模型的幾何信息、屬性信息等;
s2,判斷arraya是否為空;若為空說明dgn文件是空文件,不需要處理;若不為空,進(jìn)行以下步驟;
s3,讀取arraya中的第一個模型描述算子存入dsc;
s4,提取模dsc中編碼信息即linkage;然后獲取dsc中的模型的材質(zhì)、顏色等屬性信息;
s5,提取dsc中模型的類型;
s6,模型面片化處理;
s7,將數(shù)據(jù)及屬性信息按照wrl文件或者obj文件的格式寫入創(chuàng)建的輕量化文件中;
s8,判斷arraya中是否有模型描述算子未處理,若有,則繼續(xù)從s3開始處理,直至所有模型描述算子處理完畢;若沒有,則結(jié)束。
如圖2所示,s5具體包含以下步驟;
s51,判斷dsc中的模型是否為點(diǎn)、線段獨(dú)立元素,若是則無需處理,若不是,進(jìn)行以下步驟;
s52,判斷dsc中模型的類型是否為cell_header_elm,若不是,則可以直接對模型進(jìn)行面片化處理,若是,進(jìn)行以下步驟;
s53,判斷dsc中模型是否為groupedhole或者smartsolid,若是,則可以直接面片化處理,若不是,則說明該模型描述算子含有子模型描述算子(子模型描述算子數(shù)據(jù)結(jié)構(gòu)與模型描述算子相同),則需要通過進(jìn)行以下循環(huán)逐個處理子模型描述算子;
s54,將第一個子模型描述算子賦給tempdsc;
s55,獲取tempdsc中模型類型,然后跳轉(zhuǎn)到s52,進(jìn)行遞歸處理;
s56,將下一個子模型描述子算子賦給tempdsc;
s57,判斷tempdsc是否為空,若為空,則說明已經(jīng)處理完所有子模型描述算子,結(jié)束;若不為空,則跳轉(zhuǎn)到s55繼續(xù)處理。
如圖3所示,s6具體包括以下步驟:
首先,平面或曲面的面片化數(shù)據(jù)存儲在兩個數(shù)組中,第一個數(shù)組pointarray存放構(gòu)成曲面的所有點(diǎn)的三維坐標(biāo);第二個數(shù)組indexarray存放構(gòu)成面片的點(diǎn)在pointarray中的索引號,每個面片的索引號之間用數(shù)字“-1”隔開;
然后,對于只包含一個平面或曲面即無須“爆炸”的幾何體可直接面片化得到其數(shù)據(jù);對于可“爆炸”成多個平面或曲面的幾何體或者平面、曲面則先進(jìn)行“爆炸”,獲取每個平面或曲面的面片化數(shù)據(jù),依次存放在indexarray1、pointarray1;indexarray2、pointarray2;...indexarrayn、pointarrayn中。然后拼接成一個平面或曲面,拼接方式為:新建一個數(shù)據(jù)數(shù)組pointarray,大小為pointarray1、pointarray2...pointarrayn中元素數(shù)目之和,將每個子平面或子曲面的數(shù)據(jù)數(shù)組中的元素按順序存放到pointarray中;新建一個索引數(shù)組indexarray,大小為indexarray1、indexarray2...indexarrayn之和,第一個子平面或子曲面索引數(shù)組所有元素原樣依次放入indexarray,第二個子平面或子曲面索引數(shù)組中所有的索引值加上第一個子平面或子曲面數(shù)據(jù)數(shù)組元素個數(shù)后存入新的索引數(shù)組,以此類推將其他子平面或子曲面的索引數(shù)組元素存入新的索引數(shù)組。這樣拼接好的幾何體或平面、曲面的面片化數(shù)據(jù)存放到了兩個數(shù)組pointarray與indexarray中。
如圖4所示為dgn文件對應(yīng)的輕量化模型文件的結(jié)構(gòu)樹:第1層為文件層級,一個dgn文件對應(yīng)一個輕量化文件;第2層為編碼層級即linkage層級,模型的顏色、材質(zhì)等屬性信息位于該層級,在三維軟件中能對該層級的某個幾何體進(jìn)行平移、旋轉(zhuǎn)等單獨(dú)操作;第3層為模型描述算子層級,若模型描述算子無子描述算子,則該層級只有一個幾何體,若有子描述算子則可能是多個該層級的結(jié)合體組成一個編碼級別的幾何模型;第4層級為最底層,描述的是“爆炸”后的曲面數(shù)據(jù),不過由于“爆炸”后的曲面進(jìn)行了合并在輕量化文件中體現(xiàn)不出這一層。
與現(xiàn)有技術(shù)相比,本發(fā)明具有以下有益效果:
1、本發(fā)明提供的將dgn模型轉(zhuǎn)化成輕量模型的方法,可以實(shí)現(xiàn)將dgn格式的模型轉(zhuǎn)成輕量化模型,輕量化模型中包含了原dgn文件中每個模型的編碼,材質(zhì)、顏色等屬性信息,為其它軟件對模型進(jìn)行操作特別是屬性查詢創(chuàng)造了條件。
2、本發(fā)明提供的將dgn模型轉(zhuǎn)化成輕量模型的方法,能夠?qū)gn文件中的幾何模型進(jìn)行拆解并單獨(dú)輕量化,導(dǎo)出時再重新合并;并能夠?qū)⒚總€幾何體的編碼、材質(zhì)、顏色等屬性取出,然后將其寫入到輕量化模型文件中。通過這個方法轉(zhuǎn)化的輕量化模型包含了原dgn文件中所有幾何體的編號、屬性等信息,為其他三維軟件進(jìn)行查詢、漫游等操作提供支持。
本說明書中各個實(shí)施例采用遞進(jìn)的方式描述,每個實(shí)施例重點(diǎn)說明的都是與其他實(shí)施例的不同之處,各個實(shí)施例之間相同相似部分互相參見即可。對于實(shí)施例公開的系統(tǒng)而言,由于與實(shí)施例公開的方法相對應(yīng),所以描述的比較簡單,相關(guān)之處參見方法部分說明即可。
本領(lǐng)域技術(shù)人員可以對每個特定的應(yīng)用來使用不同方法來實(shí)現(xiàn)所描述的功能,但是這種實(shí)現(xiàn)不應(yīng)認(rèn)為超出本發(fā)明的范圍。
顯然,本領(lǐng)域的技術(shù)人員可以對發(fā)明進(jìn)行各種改動和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包括這些改動和變型在內(nèi)。