專利名稱:一種面向虛擬現(xiàn)實三維圖形引擎的三維場景組織方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種面向虛擬現(xiàn)實三維圖形引擎的新的場景組織方法,屬于計算機(jī)虛擬現(xiàn)實和計算機(jī)圖形學(xué)技術(shù)領(lǐng)域。
背景技術(shù):
虛擬現(xiàn)實作為一種高度逼真的模擬人在自然環(huán)境中視、聽、動等行為的人機(jī)交互技術(shù),要求計算機(jī)所創(chuàng)建的三維虛擬環(huán)境足夠真實可信,這無疑會牽涉到眾多領(lǐng)域的各種前沿技術(shù)。如果為每個虛擬現(xiàn)實應(yīng)用都去重新研究和實現(xiàn)這些技術(shù)細(xì)節(jié),無疑會浪費大量的時間、精力和資金。圖形引擎就是在實現(xiàn)部分底層技術(shù)的基礎(chǔ)上,對其進(jìn)行整理和封裝,形成一個開發(fā)框架,使得應(yīng)用開發(fā)人員不必再關(guān)心底層技術(shù)的實現(xiàn)細(xì)節(jié),從而大大減少開發(fā)人員的工作量和工作難度,縮短開發(fā)周期。由于圖形引擎是對特定應(yīng)用的一種抽象,在不同的領(lǐng)域中,圖形引擎需要解決的問題不一樣,故而其功能也不盡完全相同,在虛擬現(xiàn)實領(lǐng)域,圖形引擎?zhèn)戎赜诮换ズ屠L制的實時性。無論是交互還是繪制都涉及到場景中的實體,所以如何組織場景中的實體是三維圖形引擎中的核心問題,好的場景組織方式不僅有利于內(nèi)存的管理,而且能夠加速場景繪制,同時還方便實時交互的實現(xiàn)。特別是當(dāng)場景越來越復(fù)雜時,場景組織方式就愈發(fā)顯得重要。
隨著虛擬現(xiàn)實、仿真技術(shù)和三維游戲的發(fā)展,三維圖形引擎的發(fā)展非常迅速,涌現(xiàn)出了很多商業(yè)的和開源的圖形引擎,如OpenGVS、OGRE、OSG、OpenSG等,但是它們在場景組織方面各有優(yōu)缺點。OpenGVS是Quantum3D公司開發(fā)的一個面向仿真的商業(yè)軟件,場景組織是它的核心技術(shù)之一。OGRE是一個面向三維游戲的圖形引擎,它把系統(tǒng)分成了很多模塊,如資源管理、場景管理、渲染管理,這對系統(tǒng)的內(nèi)存管理來說非常方便,但是OGRE的場景組織方式不能方便地表現(xiàn)細(xì)節(jié)層次(Level of Detail,LOD)、開關(guān)(Switch)、自由度(Degree of Freedom,DOF)等特殊節(jié)點,因此在實時交互的實現(xiàn)上存在一定的困難。OSG、OpenSG是開源軟件,它們采用場景圖對場景進(jìn)行組織,這種場景圖能夠比較好的描述模型中各種類型的節(jié)點,但是它們采用有向非循環(huán)圖(Directed Acyclic Graph,DAG)的方式實現(xiàn)模型共享,對每個節(jié)點實行引用計數(shù),當(dāng)引用為零時便釋放內(nèi)存,這種內(nèi)存管理方法實現(xiàn)起來比較復(fù)雜,不如OGRE的簡單。
本
發(fā)明內(nèi)容
本發(fā)明的技術(shù)解決解決問題克服了現(xiàn)有技術(shù)中的不足,提供了一種面向虛擬現(xiàn)實三維圖形引擎的三維場景組織方法,采用這種場景組織方法不僅有利于內(nèi)存的管理,減少內(nèi)存開銷,而且能夠加速場景繪制,同時還方便實時交互的實現(xiàn)。
本發(fā)明的技術(shù)解決方案一種面向虛擬現(xiàn)實三維圖形引擎的三維場景組織方法,其特點在于包括下列主要步驟(1)加載模型文件,加載模型時在內(nèi)存中采用場景圖保存模型文件中的信息;(2)在場景中添加實體,每個實體對應(yīng)一個模型文件,在場景中添加實體,也就是實例化模型,在實例化的時候,僅僅引用共同的部分(幾何信息),而對不同的部分(非幾何信息)進(jìn)行復(fù)制,這樣既節(jié)約了內(nèi)存,又保證了實體間的獨立性,整個場景中只有一個場景根節(jié)點,每添加一個實體,相當(dāng)于在場景根節(jié)點上添加一棵子樹,所有的子樹和場景根節(jié)點構(gòu)成最終的場景圖。
由資源管理模塊負(fù)責(zé)加載場景中的各種資源,包括幾何模型、紋理圖片等,并且通過維護(hù)一個資源列表來管理這些資源。加載模型的步驟首先讀取資源文件的名稱,然后遍歷資源列表,根據(jù)資源文件的名稱查看該資源是否已經(jīng)加載,如果已經(jīng)加載,直接返回指向該資源文件的資源指針,否則,創(chuàng)建資源對象,接著根據(jù)資源類型調(diào)用不同的加載器進(jìn)行加載,如果加載失敗,直接返回空指針,否則資源加載器把資源文件中的數(shù)據(jù)讀取出來并保存到新建的資源對象中,并將指向該資源文件的資源指針添加到資源列表中,然后返回資源指針。程序結(jié)束的時候,資源管理模塊遍歷資源列表,逐個刪除資源對象,從而防止內(nèi)存泄漏。
由場景管理模塊通過維護(hù)一個實體列表和場景根結(jié)點來管理場景中的實體,共同構(gòu)成一個大的場景圖。在常用的模型文件中,如vrml、flt、3ds等,其內(nèi)部一般采用層次樹狀結(jié)構(gòu)進(jìn)行組織,這種層次樹狀結(jié)構(gòu)通常包含一個根節(jié)點、若干內(nèi)部節(jié)點和葉子節(jié)點。最頂層的節(jié)點是根節(jié)點,它沒有父節(jié)點;葉子節(jié)點保存著需要繪制的實際幾何體,它沒有任何子節(jié)點;內(nèi)部節(jié)點至少有一個子節(jié)點,這樣,如果根不是樹中唯一的節(jié)點的話,那么它也是一個內(nèi)部節(jié)點。一個單獨的模型本身就是一個場景圖,模型加載后產(chǎn)生的資源指針實際上指向的是該場景圖,而每一個實體都對應(yīng)一個唯一的名字和資源指針,將實體加入場景,實際上就是把對應(yīng)資源指針指向的場景圖做為場景根節(jié)點的子樹加入場景圖,從而與其它實體一起構(gòu)成一個更大的場景圖。具體的添加實體的流程圖如下首先獲取實體名稱和對應(yīng)的資源文件名稱,然后遍歷實體列表,根據(jù)實體名稱查看該實體是否已經(jīng)在場景中,如果同名實體存在,則直接返回空指針,否則,調(diào)用資源管理模塊,根據(jù)資源文件的名稱獲取對應(yīng)的資源指針。如果資源指針為空,直接返回空指針,否則,根據(jù)實體名稱和返回的資源指針創(chuàng)建實體。在創(chuàng)建實體的時候,僅僅復(fù)制資源指針?biāo)笀鼍皥D的內(nèi)部節(jié)點部分,組成一棵以實體名稱為根節(jié)點的子樹。然后把子樹做為場景根結(jié)點的子節(jié)點,從而將實體添加到場景中。除了添加實體外,還可以刪除和修改場景圖中的實體或者實體的子部件。在程序結(jié)束的時候,場景管理模塊遍歷實體列表,逐個刪除實體對象,從而防止內(nèi)存泄漏。
兩個模塊相互協(xié)作共同實現(xiàn)場景組織和資源共享。一個復(fù)雜的場景通常由多個實體組成,每個實體對應(yīng)一個模型,當(dāng)創(chuàng)建實體的時候,最直觀的辦法是先創(chuàng)建一個實體,加載對應(yīng)的模型文件,讀取并保存模型文件中的數(shù)據(jù)。雖然這種方法實現(xiàn)起來非常簡單,但是因為每創(chuàng)建一個實體都要讀取并保存模型文件中的數(shù)據(jù),所以非常耗內(nèi)存和時間,當(dāng)場景非常復(fù)雜的時候,這個問題就更加突出。逼真性和實時性是圖形學(xué)應(yīng)用的兩個相互制約的目標(biāo),相對而言,虛擬現(xiàn)實領(lǐng)域更側(cè)重于實時性。在對場景中的實體進(jìn)行建模的時候,為了降低建模難度和工作量,對相同或相近的實體通常采用相同的模型,即只建模一次,比如,為了繪制森林,雖然森林里存在很多棵樹,但是在建模的時候可能只對其中的一棵樹進(jìn)行建模,這樣就導(dǎo)致場景中存在大量實體對應(yīng)同一個模型。在這種情況下,可以通過加載一次模型,多次實例化來創(chuàng)建多個實體。這樣可以減少加載模型文件的次數(shù),從而減少內(nèi)存和時間開銷。為了方便內(nèi)存管理,將加載模型和創(chuàng)建實體分別放在資源管理模塊和場景管理模塊中實現(xiàn),即資源管理模塊在內(nèi)存中保存各種資源數(shù)據(jù),場景管理模塊通過指針來引用共享資源。這里的共享資源僅限于幾何信息,這是因為,在模型文件的場景圖中,葉子結(jié)點用來保存各種幾何信息,也就是用于繪制的大量數(shù)據(jù),如三維模型的點、線、面的信息,這部分?jǐn)?shù)據(jù)在整個運(yùn)行過程中是不變的。內(nèi)部節(jié)點用來表示幾何信息之外的其它信息,包括紋理、變換、細(xì)節(jié)層次、繪制狀態(tài)、光源以及其它要素。這些信息很多是可以通過用戶交互來改變的,例如,可以將光源放置在一個內(nèi)部節(jié)點上,這個節(jié)點影響其子樹的內(nèi)容,用戶可以通過操縱該內(nèi)部節(jié)點,來打開、修改和關(guān)閉光源;另外一個示例是變換,在一個內(nèi)部節(jié)點內(nèi)保存變換信息,用戶通過改變這些信息,從而實現(xiàn)對其子樹的旋轉(zhuǎn)、平移等操作。所以當(dāng)創(chuàng)建一個實體的時候,必須復(fù)制它所引用的模型的場景圖中的內(nèi)部節(jié)點,而僅僅共享其葉子節(jié)點,即幾何信息。這樣可以保證引用同一模型的不同實體之間的交互獨立性,也就是說,對其中的一個實體進(jìn)行操縱,不會影響到引用同一個模型的其它實體。
資源管理模塊和場景管理模塊在程序初始化階段運(yùn)行,運(yùn)行的結(jié)果就是把整個場景組織成一個以場景根節(jié)點為根節(jié)點的場景圖。使用場景圖的方式組織場景,很容易實現(xiàn)對LOD、Switch、DOF等特殊節(jié)點的支持,這樣,不僅使場景易于組織和擴(kuò)展,而且還方便實時交互和繪制的實現(xiàn)。如果對場景圖中的每個節(jié)點計算它的包圍體,還可以方便實現(xiàn)碰撞檢測和視錐裁減。
本發(fā)明與現(xiàn)有技術(shù)相比的有益效果是場景組織由資源管理模塊和場景管理模塊協(xié)作完成,這樣不僅方便內(nèi)存管理,而且當(dāng)場景中存在大量重復(fù)出現(xiàn)的復(fù)雜實體時,采用這種方法可以很容易實現(xiàn)一次加載模型,多次實例化,從而大大減少內(nèi)存和時間開銷;使用場景圖的方式組織場景,提供對LOD、Switch、DOF等特殊節(jié)點的支持,不僅使場景易于組織和擴(kuò)展,而且方便實時交互和繪制的實現(xiàn)。如果對場景圖中的每個節(jié)點計算它的包圍體,還可以很方便實現(xiàn)碰撞檢測和視錐裁減。
圖1是立方體模型(cube.flt)的層次結(jié)構(gòu)圖;圖2是立方體模型(cube.flt)加載后在內(nèi)存中的層次結(jié)構(gòu)圖;圖3為本發(fā)明實施例坦克模型(t72.flt)加載后在內(nèi)存中的層次結(jié)構(gòu)圖;圖4為本發(fā)明中的資源管理模塊中加載模型的流程圖;圖5為本發(fā)明的場景管理模塊中添加實體的流程圖;圖6為本發(fā)明資源管理和場景管理之間的關(guān)系圖;圖7本發(fā)明實施例加入第一輛坦克(tank 000)后的場景圖。
具體實施例方式
實施例虛擬戰(zhàn)場。戰(zhàn)場中存在大量的重復(fù)的實體,比如樹木、坦克、士兵等。為了描述簡單,同時還能說明問題,假定戰(zhàn)場由1000輛坦克組成,并且這些坦克均來自同一個坦克模型(t72.flt)。
圖1是一個簡單模型——立方體模型(cube.flt)的層次結(jié)構(gòu)圖,它包含3個內(nèi)部節(jié)點和6個葉子節(jié)點。其中,3個內(nèi)部節(jié)點分別是一個根節(jié)點、一個Group節(jié)點、一個Object節(jié)點;6個葉子節(jié)點分別保存組成立方體的6個面的幾何信息,比如說,一個面由四個頂點組成,一個頂點的信息包括頂點的顏色、位置、法向量和紋理坐標(biāo)。
加載模型的時候,把用于繪制的幾何信息統(tǒng)一放在一個節(jié)點(GeometrySet)內(nèi)保存,圖2和圖3分別是立方體模型(cube.flt)和坦克模型(t72.flt)加載后在內(nèi)存中的層次結(jié)構(gòu)圖。
如圖4所示為資源管理模塊中加載模型的流程圖,開始,讀取資源文件的名稱,然后遍歷資源列表,根據(jù)資源文件的名稱查看該資源是否已經(jīng)加載,如果已經(jīng)加載,直接返回指向該資源文件的資源指針,如果沒有加載,根據(jù)資源類型(目前可以處理的資源文件有兩種3ds和flt)調(diào)用不同的加載器進(jìn)行加載;如果加載失敗,直接返回空指針,否則將指向該資源文件的資源指針添加到資源列表并返回。結(jié)束加載模型。
如圖5所示為場景管理模塊中添加實體的流程圖,開始,獲取實體名稱和對應(yīng)的資源文件名稱,然后遍歷實體列表,根據(jù)實體名稱查看該實體是否已經(jīng)在場景中,如果同名實體存在,則直接返回空指針,否則,調(diào)用資源管理模塊,獲取資源文件對應(yīng)的資源指針;如果資源指針為空,直接返回空指針,否則,根據(jù)實體名稱和資源指針創(chuàng)建實體。在創(chuàng)建實體的時候,復(fù)制資源的內(nèi)部節(jié)點部分,組成一棵以實體名稱為根節(jié)點的子樹。然后把子樹做為場景根結(jié)點的子節(jié)點,從而將實體添加到場景中。
如圖6所示為資源管理和場景管理之間的關(guān)系圖,其中虛線上方是場景管理模塊,場景中有唯一的根結(jié)點,圓代表內(nèi)部節(jié)點,內(nèi)部節(jié)點包括Group、LOD、Switch等,它們共同構(gòu)成樹狀結(jié)構(gòu);正方形代表葉子節(jié)點,它們包含指向資源管理模塊中的各種幾何信息的指針,虛線下方是資源管理模塊,三角形代表存放在內(nèi)存中的各種幾何信息,場景管理模塊通過葉子節(jié)點中保存的幾何信息的指針來訪問資源管理模塊中的幾何信息。
圖7是加入第一輛坦克(tank 000)后的場景圖。整個場景圖有一個唯一的場景根結(jié)點(Scene Root),場景中每加入一個實體,相當(dāng)于將以該實體名字命名的根結(jié)點的子樹做為場景根結(jié)點(Scene Root)的子節(jié)點,從而構(gòu)成更大的場景圖。
這種場景組織方式可以方便用戶操縱實體和實體子部件,這是通過改變場景圖中內(nèi)部節(jié)點的屬性信息來實現(xiàn)的。比如,可以通過改變Group節(jié)點(tank 000)的平移和旋轉(zhuǎn)屬性來控制坦克(tank 000)的位置和朝向;還可以通過改DOF節(jié)點(barrel)的屬性控制炮管繞著炮塔旋轉(zhuǎn)。
場景圖中的節(jié)點通常有一個包圍體,可以利用包圍體來做碰撞檢測和視錐裁減;場景圖還支持LOD、Switch等特殊節(jié)點,這些都可以加速場景繪制。
權(quán)利要求
1.一種面向虛擬現(xiàn)實三維圖形引擎的三維場景組織方法,其特征在于包括下列主要步驟(1)加載模型文件,加載模型時,在內(nèi)存中采用場景圖保存模型文件中的信息;(2)在場景中添加實體,每個實體對應(yīng)一個模型文件,在場景中添加實體,也就是實例化模型,在實例化的時候,僅僅引用共同的部分,即幾何信息,而對不同的部分,即非幾何信息進(jìn)行復(fù)制,整個場景中只有一個場景根節(jié)點,每添加一個實體,相當(dāng)于在場景根節(jié)點上添加一棵子樹,所有的子樹和場景根節(jié)點構(gòu)成最終的場景圖。
2.根據(jù)權(quán)利要求1所述的面向虛擬現(xiàn)實三維圖形引擎的三維場景組織方法,其特征在于所述的加載模型文件由資源管理模塊負(fù)責(zé),其加載的步驟為開始,讀取資源文件的名稱,然后遍歷資源列表,根據(jù)資源文件的名稱查看該資源是否已經(jīng)加載,如果已經(jīng)加載,直接返回指向該資源文件的資源指針,如果沒有加載,根據(jù)資源類型調(diào)用不同的加載器進(jìn)行加載;如果加載失敗,直接返回空指針,否則將指向該資源文件的資源指針添加到資源列表并返回,結(jié)束加載模型。
3.根據(jù)權(quán)利要求1所述的面向虛擬現(xiàn)實三維圖形引擎的三維場景組織方法,其特征在于所述的在場景中添加實體由場景場景管理模塊負(fù)責(zé),其中添加實體的步驟為開始,獲取實體名稱和對應(yīng)的資源文件名稱,然后遍歷實體列表,根據(jù)實體名稱查看該實體是否已經(jīng)在場景中,如果同名實體存在,則直接返回空指針,否則,調(diào)用資源管理模塊,獲取資源文件對應(yīng)的資源指針;如果資源指針為空,直接返回空指針,否則,根據(jù)實體名稱和資源指針創(chuàng)建實體。在創(chuàng)建實體的時候,復(fù)制資源的內(nèi)部節(jié)點部分,組成一棵以實體名稱為根節(jié)點的子樹。然后把子樹做為場景根結(jié)點的子節(jié)點,從而將實體添加到場景中。
全文摘要
一種面向虛擬現(xiàn)實三維圖形引擎的三維場景組織方法,屬于計算機(jī)虛擬現(xiàn)實和計算機(jī)圖形學(xué)技術(shù)領(lǐng)域,其特征在于(1)加載模型文件,加載模型時,在內(nèi)存中采用場景圖保存模型文件中的信息;(2)在場景中添加實體,每個實體對應(yīng)一個模型文件,在場景中添加實體,也就是實例化模型,在實例化的時候,僅僅引用共同的部分,即幾何信息,而對不同的部分,即非幾何信息進(jìn)行復(fù)制,整個場景中只有一個場景根節(jié)點,每添加一個實體,相當(dāng)于在場景根節(jié)點上添加一棵子樹,所有的子樹和場景根節(jié)點構(gòu)成最終的場景圖。本發(fā)明不僅方便內(nèi)存管理,而且當(dāng)場景中存在大量重復(fù)出現(xiàn)的復(fù)雜實體時,可以很容易實現(xiàn)一次加載模型,多次實例化,從而大大減少內(nèi)存和時間開銷。
文檔編號G06T1/00GK1710607SQ20051001213
公開日2005年12月21日 申請日期2005年7月8日 優(yōu)先權(quán)日2005年7月8日
發(fā)明者梁曉輝, 趙沁平, 余江英, 車英慧 申請人:北京航空航天大學(xué)