本發(fā)明涉及信息處理技術(shù)領(lǐng)域,特別涉及一種適用于三維場景中三維模型并行繪制的方法。
背景技術(shù):
在地理信息場景三維中,要準(zhǔn)確再現(xiàn)地表場景不免要用到數(shù)字高程模型數(shù)據(jù)、數(shù)字正射影像數(shù)據(jù)以及三維模型數(shù)據(jù)。隨著社會經(jīng)濟(jì)的快速發(fā)展,三維地理信息場景在社會各個(gè)領(lǐng)域的運(yùn)用而生,其中三維模型能夠準(zhǔn)確的模擬現(xiàn)實(shí)環(huán)境,不同行業(yè)根據(jù)自身要求對三維模型設(shè)計(jì)也不同,有精細(xì)模型和簡化的模型之分。
快速地將三維地理信息場景在計(jì)算機(jī)終端顯示器上展現(xiàn),一直是各種地理信息三維場景軟件系統(tǒng)需要解決的問題。如何在三維場景中快速高效地繪制顯示三維模型一直是三維場景系統(tǒng)關(guān)心的問題,這也是具有挑戰(zhàn)性的問題。
三維模型能夠在計(jì)算機(jī)終端快速繪制顯示,必然要能夠快速的訪問數(shù)據(jù)實(shí)體。在三維場景中海量的三維模型中,需要設(shè)計(jì)高效的數(shù)據(jù)管理方法和索引機(jī)制,另外,三維模型的渲染繪制,需要在三維場景中根據(jù)三維模型與視點(diǎn)的位置,在不影響三維模型外觀的情況下,實(shí)時(shí)動態(tài)地簡化三維模型以使得三維模型能夠快速渲染繪制。
隨著多核CPU技術(shù)體系的出現(xiàn),在應(yīng)用上的有兩個(gè)方面的優(yōu)勢:為用戶帶來更強(qiáng)大的計(jì)算性能;滿足用戶同時(shí)進(jìn)行多任務(wù)處理、多任務(wù)計(jì)算環(huán)的要求。在三維場景中海量的三維模型繪制顯示,能夠利用多核CPU實(shí)時(shí)動態(tài)并行簡化、渲染繪制三維模型。
當(dāng)前在地理信息系統(tǒng)領(lǐng)域,大多數(shù)的三維地理信息系統(tǒng)軟件在進(jìn)行三維場景渲染的過程中,仍然是采用傳統(tǒng)的串行處理方式,采用單線程模式循環(huán)遍歷每個(gè)三維模型進(jìn)行繪制。三維場景中需要很強(qiáng)的交互性,對于每繪制一次海量的三維模型數(shù)據(jù),需要用戶等待,用戶體驗(yàn)感極差。在早期的單核CPU計(jì)算機(jī)硬件水平條件下,這種繪制方式是可行的,隨著多核CPU的計(jì)算出現(xiàn),這種串行的繪制已經(jīng)不是最優(yōu)處理方式,它既不能提高三維模型的效率,也不能有效地利用多核CPU的硬件優(yōu)勢。另外,在多數(shù)的三維軟件系統(tǒng)中三維模型的渲染繪制仍就采用原始模型渲染繪制,不論離視點(diǎn)多遠(yuǎn)都采用原始精細(xì)程度的模型繪制,這也是導(dǎo)致渲染效率不高的原因。
因此,目前急需一種能夠提高三維模型顯示的效率的、新型的適用于三維場景中三維模型繪制方法。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明提出一種適用于三維場景中三維模型并行繪制的方法,可充分地消除由于現(xiàn)有技術(shù)的限制和缺陷導(dǎo)致的一個(gè)或多個(gè)問題。
本發(fā)明在三維場景中基于CPU核數(shù)構(gòu)建線程隊(duì)列模型,線程隊(duì)列模型中每個(gè)線程包含數(shù)據(jù)獲取和數(shù)據(jù)渲染兩個(gè)互斥線程,在線程隊(duì)列中并行獲取、簡化、渲染三維模型數(shù)據(jù);建立顯示列表模型,每個(gè)三維模型對應(yīng)一個(gè)顯示符號,渲染繪制過程中實(shí)時(shí)更新屏幕,把三維模型渲染繪制結(jié)果生成顯示符號,并放入顯示列表管理。
本發(fā)明另外的優(yōu)點(diǎn)、目的和特性,一部分將在下面的說明書中得到闡明,而另一部分對于本領(lǐng)域的普通技術(shù)人員通過對下面的說明的考察將是明顯的或從本發(fā)明的實(shí)施中學(xué)到。通過在文字的說明書和權(quán)利要求書及附圖中特別地指出的結(jié)構(gòu)可實(shí)現(xiàn)和獲得本發(fā)明目的和優(yōu)點(diǎn)。
本發(fā)明提供了一種適用于三維場景中三維模型并行繪制的方法,其特征在于,所述方法包括以下步驟:
步驟S101,對不同數(shù)據(jù)格式、不同來源的三維模型數(shù)據(jù)進(jìn)行預(yù)處理,得到預(yù)處理后的三維模型數(shù)據(jù);
步驟S102,根據(jù)計(jì)算機(jī)終端的CPU的核數(shù)建立線程隊(duì)列模型,其中,所述線程模型隊(duì)列中包括多個(gè)線程模型,每個(gè)線程模型均優(yōu)選的包括IO線程和RC線程,線程模型隊(duì)列中所有的線程模型并行工作,每個(gè)線程模型輸出一個(gè)模型符號,每個(gè)模型符號對應(yīng)一個(gè)三維模型;
步驟S103,根據(jù)三維模型的數(shù)量建立顯示列表模型,其中,一個(gè)三維模型對應(yīng)一個(gè)顯示符號,所有三維模型的顯示符號均由顯示列表模型管理。
步驟S104,利用每個(gè)線程模型的IO線程并行獲取所述預(yù)處理后的三維模型數(shù)據(jù);
步驟S105,利用每個(gè)線程模型的IO線程并行簡化通過步驟S104獲得的三維模型數(shù)據(jù);
步驟S106,利用每個(gè)線程模型的RC線程對所述簡化后的多個(gè)三維模型進(jìn)行并行渲染繪制以得到與每個(gè)所述三維模型對應(yīng)的顯示符號,并終端屏幕上顯示所述顯示符號。
優(yōu)選的,所述步驟S105具體包括以下子步驟:
步驟S1051,計(jì)算三維模型的所有頂點(diǎn)的剔除值;
步驟S1052,選取最大剔除值,設(shè)最大剔除值為cost(a,b);
步驟S1053,剔除所有包含以頂點(diǎn)a和頂點(diǎn)b組成的邊的三角面;
步驟S1054,重新計(jì)算與頂點(diǎn)a相鄰頂點(diǎn)的剔除值。
步驟S1055,將頂點(diǎn)a移動到頂點(diǎn)b,以頂點(diǎn)b替換頂點(diǎn)a;
重復(fù)上述步驟S1052-S1055,直到處理完三維模型的所有頂點(diǎn),并對三維模型的頂點(diǎn)按照剔除值由小到大的順序進(jìn)行排序。
優(yōu)選的,所述步驟S1051具體包括:
通過下述公式計(jì)算三維模型的某個(gè)頂點(diǎn)a的剔除值:
其中,表示頂點(diǎn)a的剔除值,頂點(diǎn)b是與頂點(diǎn)a相鄰的一個(gè)頂點(diǎn),表示包含頂點(diǎn)a的三角形的集合,表示同時(shí)包含頂點(diǎn)a和頂點(diǎn)b的三角形的集合,表示三角面n的法線向量值。
優(yōu)選的,所述步驟S106具體包括以下子步驟:
步驟S1061,判斷待渲染繪制的三維模型是否存在顯示符號,如果存在,則直接轉(zhuǎn)入步驟S1062,否則,先依次執(zhí)行步驟S104和S105,獲得簡化后的三維模型,然后再轉(zhuǎn)入步驟S1062;
步驟S1062,判斷三維模型與視點(diǎn)的距離是否發(fā)生變化,如果是,則轉(zhuǎn)入步驟S1063,否則,轉(zhuǎn)入步驟S1067;
步驟S1063,計(jì)算待渲染的頂點(diǎn)個(gè)數(shù);
步驟S1064,根據(jù)步驟S1063的計(jì)算結(jié)果,對簡化后的三維模型進(jìn)行渲染繪制;
步驟S1065,將渲染繪制后的三維模型生成顯示符號并將生成的顯示符號放入顯示列表;
步驟S1066,對每個(gè)三維模型,根據(jù)三維模型與視點(diǎn)的距離,按照由近到遠(yuǎn)的順序依次從顯示列表中取出該三維模型的顯示符號并在屏幕上顯示;
步驟S1067,直接從顯示列表中取得該三維模型的顯示符號并在屏幕上顯示。
優(yōu)選的,所述步驟S101具體包括:將不同數(shù)據(jù)格式、不同來源的三維模型數(shù)據(jù)轉(zhuǎn)化為統(tǒng)一格式并進(jìn)行存儲。
優(yōu)選的,轉(zhuǎn)化為統(tǒng)一格式的三維模型由多個(gè)三角面組成,每個(gè)三角面包括三個(gè)頂點(diǎn),每個(gè)頂點(diǎn)均包含xyz空間坐標(biāo)。
優(yōu)選的,將轉(zhuǎn)化為統(tǒng)一格式的三維模型數(shù)據(jù)存儲到關(guān)系型數(shù)據(jù)庫(Oracle、MySql、Access)中,所述關(guān)系數(shù)據(jù)庫包括三維模型數(shù)據(jù)表,所述三維模型數(shù)據(jù)表包含空間索引字段
優(yōu)選的,空間索引字段采用四叉樹索引策略,為三維模型數(shù)據(jù)提供空間索引,以便能夠快速定位獲取數(shù)據(jù)。
本發(fā)明提供了三維模型快速繪制的方法,即在線程隊(duì)列中并行獲取三維模型數(shù)據(jù)并簡化三維模型,根據(jù)與視點(diǎn)距離關(guān)系,實(shí)時(shí)計(jì)算要渲染簡化后三維模型的頂點(diǎn)個(gè)數(shù)、渲染三維模型,把渲染結(jié)果生成顯示符號放入顯示列表管理,在下次繪制三維模型與視點(diǎn)距離不變時(shí),直接從顯示列表中取出上一次的渲染結(jié)果顯示到計(jì)算機(jī)屏幕。本發(fā)明能夠快速獲取三維模型數(shù)據(jù),加快三維模型渲染繪制時(shí)間,提高三維模型的顯示效率,提升用戶在三維場景中交互的體驗(yàn)感,充分發(fā)揮了計(jì)算機(jī)的高性能計(jì)算優(yōu)勢。該方法在地理信息系統(tǒng)及相關(guān)行業(yè)三維軟件中使用和推廣,將會產(chǎn)生良好的社會經(jīng)濟(jì)效益。
附圖說明
圖1是根據(jù)本發(fā)明實(shí)施例的、適用于三維場景中三維模型并行繪制方法的流程圖。
圖2是根據(jù)本發(fā)明實(shí)施例的三維模型數(shù)據(jù)結(jié)構(gòu)的示意圖。
圖3是根據(jù)本發(fā)明實(shí)施例的三維模型數(shù)據(jù)并行獲取、簡化、渲染的線程隊(duì)列模型。
圖4是根據(jù)本發(fā)明實(shí)施例的三維模型簡化算法示意圖。
圖5是根據(jù)本發(fā)明實(shí)施例的三維模型簡化流程圖。
圖6是根據(jù)本發(fā)明實(shí)施例的三維模型渲染流程圖。
具體實(shí)施方式
下面參照附圖對本發(fā)明進(jìn)行更全面的描述,其中說明本發(fā)明的示例性實(shí)施例。
如圖1所示,本發(fā)明實(shí)施例提出的適用于三維場景中三維模型并行繪制方法主要包括以下步驟:
步驟S101,對不同數(shù)據(jù)格式、不同來源的三維模型數(shù)據(jù)進(jìn)行預(yù)處理。
實(shí)現(xiàn)海量三維模型數(shù)據(jù)并行繪制方法,前期要大量的準(zhǔn)備工作,例如數(shù)據(jù)格式的統(tǒng)一、三維模型數(shù)據(jù)空間索引策略等,步驟S101主要對不同數(shù)據(jù)格式、不同來源的三維模型數(shù)據(jù)進(jìn)行預(yù)處理,其中,步驟S101具體包括將不同數(shù)據(jù)格式、不同來源的三維模型數(shù)據(jù)轉(zhuǎn)化為統(tǒng)一格式并進(jìn)行存儲。
圖2示出了根據(jù)本發(fā)明實(shí)施例的,轉(zhuǎn)化為統(tǒng)一格式的三維模型數(shù)據(jù)結(jié)構(gòu)的示意圖。如圖2所示,轉(zhuǎn)化為統(tǒng)一格式的三維模型由多個(gè)三角面(T1、T2、T3、…、Tn)組成,每個(gè)三角面T均包括三個(gè)頂點(diǎn)(V1、V2、V3),每個(gè)頂點(diǎn)V均包含xyz空間坐標(biāo)。
將圖2所示的轉(zhuǎn)化為統(tǒng)一格式的三維模型數(shù)據(jù)存儲到關(guān)系型數(shù)據(jù)庫(Oracle、MySql、Access)中,所述關(guān)系數(shù)據(jù)庫包括三維模型數(shù)據(jù)表,所述三維模型數(shù)據(jù)表包含ObjectId字段、三維模型數(shù)據(jù)流字段、空間索引字段以及輔助信息字段,其中,空間索引字段采用四叉樹索引策略,為三維模型數(shù)據(jù)提供空間索引,以便能夠快速定位獲取數(shù)據(jù)。
步驟S102,根據(jù)計(jì)算機(jī)終端的CPU的核數(shù)建立線程隊(duì)列模型,其中,所述線程模型隊(duì)列中包括多個(gè)線程模型,每個(gè)線程模型均包括IO線程和RC線程,線程模型隊(duì)列中所有的線程模型并行工作,每個(gè)線程模型輸出一個(gè)模型符號,每個(gè)模型符號對應(yīng)一個(gè)三維模型。
具體如圖3所示,其中,線程模型隊(duì)列中包括多個(gè)線程模型(如圖3所示的線程模型1、線程模型2、線程模型3),每個(gè)線程模型均包括IO(Input/Output)線程和RC(Renderer Context)線程,這兩個(gè)線程是對應(yīng)的互斥線程,其中,IO線程用于獲取三維模型數(shù)據(jù)并簡化三維模型,RC線程用于計(jì)算要繪制的頂點(diǎn)個(gè)數(shù),以及渲染繪制模型數(shù)據(jù)。IO線程和RC線程保持并行同步,如圖3所示,線程模型1、線程模型2、線程模型3分別輸出模型符號1、模型符號2、模型符號3,每個(gè)模型符號對應(yīng)一個(gè)三維模型,隨后進(jìn)行三維模型的串行顯示,從而實(shí)現(xiàn)了本發(fā)明所提出的三維模型數(shù)據(jù)的并行獲取、并行簡化和并行渲染繪制,加快了三維模型渲染繪制時(shí)間,提高了三維模型的顯示效率。
需要說明的是,雖然圖3示出了三個(gè)線程模型,但是本發(fā)明實(shí)施例中的線程模型的數(shù)量和CPU的核數(shù)相對應(yīng),即,并不僅限于三個(gè)線程模型。
步驟S103,根據(jù)三維模型的數(shù)量建立顯示列表模型,其中,一個(gè)三維模型對應(yīng)一個(gè)顯示符號,所有三維模型的顯示符號均由顯示列表模型管理。顯示符號由顯示列表模型管理,顯示列表相當(dāng)于一個(gè)容器數(shù)組,數(shù)組里面的每個(gè)元素存放與三維模型相關(guān)的顯示符號信息。
步驟S104,利用每個(gè)線程模型的IO線程并行獲取所述預(yù)處理后的三維模型數(shù)據(jù)。
根據(jù)本發(fā)明的實(shí)施例,在三維視場范圍內(nèi)獲取待渲染繪制的三維模型集合,具體的,通過每個(gè)線程模型的IO線程并行獲取三維模型數(shù)據(jù)。
步驟S105,利用每個(gè)線程模型的IO線程并行簡化通過步驟S104獲得的三維模型數(shù)據(jù)。
簡化模型總要刪除一些頂點(diǎn),哪些點(diǎn)被刪除總的有個(gè)條件,所以給每個(gè)頂點(diǎn)計(jì)算出一個(gè)刪除的條件值,也就是下文所說的剔除值,簡化模型的好處就是,如果一個(gè)非常精細(xì)的模型有100萬頂點(diǎn),組成的三角面可能是頂點(diǎn)數(shù)的2~3倍,要繪制出400~600萬的三角面是比較耗時(shí)的,如果不減化,在場景任意位置都需要繪制精細(xì)模型就比較耗時(shí)了,如果場景中有許多個(gè)這樣的模型,耗時(shí)那就可想而知了,為此,本發(fā)明利用每個(gè)線程模型的IO線程并行簡化三維模型數(shù)據(jù)。
如圖5所示,利用每個(gè)線程模型的IO線程并行簡化通過步驟S104獲得的三維模型數(shù)據(jù)具體包括以下子步驟:
步驟S1051,計(jì)算三維模型的所有頂點(diǎn)的剔除值。
假設(shè)一個(gè)三維模型由多個(gè)三角面組成,共有M個(gè)頂點(diǎn),則計(jì)算該三維模型的所有三角面的M個(gè)頂點(diǎn)的剔除值,如圖4所示,通過下述公式計(jì)算三維模型所有頂點(diǎn)的剔除值:
其中,表示頂點(diǎn)a的剔除值,頂點(diǎn)b是與頂點(diǎn)a相鄰的一個(gè)頂點(diǎn),表示包含頂點(diǎn)a的三角形的集合,表示同時(shí)包含頂點(diǎn)a和頂點(diǎn)b的三角形的集合,表示三角面n的法線向量值,m.normal表示三角面m的法線向量值。
依照上述公式依次計(jì)算三維模型的每個(gè)頂點(diǎn)的剔除值,從而得出了三維模型所有頂點(diǎn)的剔除值。
步驟S1052,選取最大剔除值,假設(shè)最大剔除值為cost(a,b)。
計(jì)算頂點(diǎn)a的剔除值時(shí),由上述步驟S1051的公式計(jì)算每一個(gè)與a相鄰頂點(diǎn)的cost值,并從其中選擇最大的一個(gè)cost值作為頂點(diǎn)a的剔除值,其它頂點(diǎn)的剔除值計(jì)算方法類似,該實(shí)施例假設(shè)與a相鄰的b點(diǎn)計(jì)算出的cost值,作為頂點(diǎn)a的剔除值。
步驟S1053,剔除所有包含以頂點(diǎn)a和頂點(diǎn)b組成的邊的三角面;
步驟S1054,重新計(jì)算與頂點(diǎn)a相鄰頂點(diǎn)的剔除值;
步驟S1055,將頂點(diǎn)a移動到頂點(diǎn)b,以頂點(diǎn)b替換頂點(diǎn)a;
重復(fù)上述步驟S1052-S1055,直到處理完三維模型的所有頂點(diǎn),并對三維模型M個(gè)頂點(diǎn)按照剔除值小到大的順序進(jìn)行排序。
圖5中,M是三維模型的頂點(diǎn)個(gè)數(shù),t是計(jì)數(shù)器,循環(huán)計(jì)算三維模型所有頂點(diǎn)的剔除值,t小于等于0,退出循環(huán)結(jié)束計(jì)算,并對三維模型的M個(gè)頂點(diǎn)按照剔除值小到大的順序進(jìn)行排序。渲染時(shí),要計(jì)算待渲染的三維模型頂點(diǎn)的個(gè)數(shù)(下文結(jié)合圖6作進(jìn)一步說明),然后根據(jù)計(jì)算結(jié)果從對三維模型排序后的頂點(diǎn)中取出相應(yīng)個(gè)數(shù)(即,計(jì)算出的要渲染的三維模型頂點(diǎn)的個(gè)數(shù))的頂點(diǎn)來進(jìn)行繪制,從而達(dá)到簡化模型的目的。
步驟S106,利用每個(gè)線程模型的RC線程對所述簡化后的多個(gè)三維模型進(jìn)行并行渲染繪制以得到與每個(gè)所述三維模型對應(yīng)的顯示符號,并終端屏幕上顯示所述顯示符號。
如圖6所示,步驟S106具體包括以下子步驟:
步驟S1061,判斷待渲染繪制的三維模型是否存在顯示符號,如果存在,則直接轉(zhuǎn)入步驟S1062,否則,先依次執(zhí)行步驟S104和S105,獲得簡化后的三維模型,然后再轉(zhuǎn)入步驟S1062;
步驟S1062,判斷三維模型與視點(diǎn)的距離是否發(fā)生變化,如果是,則轉(zhuǎn)入步驟S1063,否則,轉(zhuǎn)入步驟S1067;
步驟S1063,計(jì)算待渲染的頂點(diǎn)個(gè)數(shù);
例如:在視點(diǎn)50米范圍內(nèi)模型不簡化;50米~200米模型簡化,模型頂點(diǎn)數(shù)減少20%,渲染繪制時(shí)只繪制按照剔除值從小到大排序后前80%的頂點(diǎn)組成的三角面;200米~500米模型簡化,頂點(diǎn)數(shù)減少40%,渲染繪制時(shí)只繪制按照剔除值從小到大排序后前60%的頂點(diǎn)組成的三角面;500米~1000米模型簡化,頂點(diǎn)數(shù)減少60%,渲染繪制時(shí)只繪制按照剔除值從小到大排序后前40%的頂點(diǎn)組成的三角面,依次類推;大于1000米,模型不顯示。
在步驟S1063計(jì)算出待渲染的頂點(diǎn)個(gè)數(shù)之后,從在結(jié)合圖5描述的對三維模型排序后的頂點(diǎn)中取出相應(yīng)個(gè)數(shù)的頂點(diǎn)來進(jìn)行渲染繪制。
步驟S1064,根據(jù)步驟S1063的計(jì)算結(jié)果,對簡化后的三維模型進(jìn)行渲染繪制;即,從對三維模型排序后的頂點(diǎn)中取出步驟S1063計(jì)算的個(gè)數(shù)的頂點(diǎn)來進(jìn)行渲染繪制。
需要指出的是,步驟S1063的頂點(diǎn)減少意味組成三維模型的三角面減少,為提高三維模型的繪制速度,本發(fā)明先計(jì)算繪制的模型頂點(diǎn)個(gè)數(shù),然后渲染繪制。
步驟S1065,將渲染繪制后的三維模型生成顯示符號并將生成的顯示符號放入顯示列表模型;
步驟S1066,對每個(gè)三維模型,根據(jù)三維模型與視點(diǎn)的距離,按照由近到遠(yuǎn)的順序依次從所述顯示列表模型中取出該三維模型的顯示符號并在屏幕上顯示;
步驟S1067,直接從顯示列表模型中取得該三維模型的顯示符號并在屏幕上顯示;由于在三維模型與視點(diǎn)的距離不變時(shí),本發(fā)明直接從顯示列表中取得該三維模型的顯示符號并在屏幕上顯示,即,直接從顯示列表中取出上一次的渲染結(jié)果在屏幕上顯示,從而進(jìn)一步提高了了三維模型的顯示效率。
本發(fā)明能夠快速獲取三維模型數(shù)據(jù),加快三維模型渲染繪制時(shí)間,提高三維模型的顯示效率,提升用戶在三維場景中交互的體驗(yàn)感,充分發(fā)揮了計(jì)算機(jī)的高性能計(jì)算優(yōu)勢。該方法在地理信息系統(tǒng)及相關(guān)行業(yè)三維軟件中使用和推廣,將會產(chǎn)生良好的社會經(jīng)濟(jì)效益。
以上內(nèi)容僅為本發(fā)明的較佳實(shí)施例,對于本領(lǐng)域的普通技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實(shí)施方式及應(yīng)用范圍上均會有改變之處,本說明書內(nèi)容不應(yīng)理解為對本發(fā)明的限制。