專利名稱::一種基于八叉樹的大規模復雜三維場景處理方法
技術領域:
:本發明涉及計算機圖形學和虛擬現實技術,主要是一種基于八叉樹的大規模復雜三維場景處理方法。技術背景大規模場景的實時渲染在虛擬現實、地理信息系統、飛行模擬、城市規劃和三維游戲等領域中具有非常廣泛的應用,一直是人們的研究熱點。盡管圖形處理器的性能相比過去有了飛速的發展,但還是不能滿足大規模復雜場景實時渲染的需求。因此,必須設計出高效算法來進一步提高復雜場景的渲染速度。與真實感渲染不同,在不影響視覺效果的前提下,虛擬現實中的圖形技術可以適當損失圖形的渲染質量以提高渲染的速度。目前用來加速大規模復雜場景渲染速度,提高計算機實時渲染能力的主要技術有場景的組織與優化、渲染狀態優化、層次細節技術(LOD)、基于圖像的繪制以及可見性剔除等等。其中場景的組織與優化和可見性剔除具有至關重要的作用。場景的組織與優化是大規模場景渲染中非常重要的部分。場景如何組織,對諸如碰撞檢測、可見性剔除和實時陰影等的計算具有巨大的影響。大規模場景中存在大量的物體,不能簡單的對這些物體進行記錄,而必須要采用結構化的場景管理器對這些物體進行組織管理。一般情況下將場景中的物體分為靜態物體和動態物體。對動態物體來說,一般采用簡單的列表方式進行管理。而對于靜態物體,由于它們的空間狀態是不變的,因此可以用層次化的技術來加以組織,并將其存儲為文件進行保存,以方便下一次的讀取。可見性剔除也是大規模場景渲染中非常重要的部分。它包括三部分視域剔除、遮擋剔除和背面剔除。其中視域剔除非常關鍵,可以剔除視野外的大量物體,極大地減少送入圖形渲染通道的圖元,從而較大地提高渲染速度。本發明針對當前圖形渲染引擎存在的問題,提出了一種高效的渲染算法。該方法主要通過對整個虛擬場景的場景圖進行樹狀組織和優化管理,然后利用三維場景的包圍盒和場景剖分技術完成快速的視域剔除,從而達到優化管理整個復雜場景的目的,大大提高了實時渲染的速率。
發明內容本發明的目的在于克服現有圖形渲染引擎實時渲染大規模復雜三維場景存在的不足,提供一種基于八叉樹的大規模復雜三維場景處理方法,用八叉樹對場景進行樹狀組織和優化管理,在此基礎上利用三維場景的包圍盒完成快速的視域剔除,從而達到優化管理整個復雜場景的目的,大大提高了渲染的速率,并達到了實時性要求。本發明的技術解決方案基于八叉樹的大規模復雜三維場景處理方法,主要采用八叉樹結構來組織場景,利用其空間信息和樹形組織結構,批量的削減視錐體外的幾何節點,快速計算出需要渲染的節點序列,減少送入渲染通道的三角面數量,從而有效地提高了渲染速度。本方法步驟如下(1)載入大規模三維場景,用場景圖來組織場景中的所有元素;(2)建立并生成該場景的八叉樹結構,記錄相關的信息;(3)利用八叉樹結構,通過視錐體與包圍盒的相交檢測算法進行快速的視域剔除;(4)對于處于視錐體內的物體進行渲染。上述的步驟(2)建立并生成場景的八叉樹結構的具體步驟是A)設置八叉樹參數,如樹的層次數限制,每個葉子空間能包含的最大節點數等;B)遍歷所有幾何節點,計算根節點的包圍盒大小;C)遞歸劃分包圍盒,記錄所有子節點和葉子節點,生成場景的八叉樹結構;首先將根節點的AABB盒均勻的劃分成八個部分;然后根據相交檢測算法,將父節點下的所有幾何節點分別歸類至這八個空間中;最后進行遞歸調用,對所有子節點進行劃分。上述的步驟(3)利用八叉樹結構,通過視錐體與包圍盒的相交檢測算法進行快速的視域剔除的步驟是A)由根節點開始向下尋找包含整個視錐體的最小八叉樹節點,找到后在mPreviousStartNode變量中記錄該節點,若沒找到則記錄根節點,則該節點將作為下一次判斷時的起始節點;B)然后遍歷該節點下的所有葉子節點,若完全處于視錐體內則標記顯示所有幾何節點,若葉子節點僅與視錐體相交則進行OBB相交檢測,判斷是否顯示相關幾何節點,以后的判斷就從記錄的節點開始,向下尋找新的起始節點,如果由于移動原因導致該節點已不能包含整個視錐體時,則向上查詢最小的一個包含視錐體的節點作為新的起始節點。本發明與現有技術相比,具有如下顯而易見的突出實質性特點和顯著優點(1)用場景圖組織場景,使場景易于組織和擴展,提高場景的渲染速度;(2)用八叉樹結構對場景進行空間劃分,然后利用八叉樹進行快速的視域剔除,大量減少送入圖形渲染通道的圖元,較大地提高渲染速度;(3)利用八叉樹結構可以較大地提高碰撞檢測的速度。(4)可以將八叉樹與遮擋剔除和光線跟蹤等技術結合起來,提高算法的效率。(5)該方法不僅適用于大規模室內場景,也適用于大規模室外場景。圖1是AABB包圍盒模型示意圖。圖2是將場景進行空間劃分,用八叉樹來組織場景的流程圖。圖3是0BB包圍盒模型結構圖。圖4是利用八叉樹進行快速視域剔除的流程圖。圖5是基于八叉樹的大規模復雜三維場景處理算法的框圖。具體實施方式本發明的一個優選實施例結合如下本基于八叉樹的大規模復雜三維場景處理方法共分四步第一步載入大規模三維場景,用場景圖來組織場景中的所有元素。對于圖形渲染引擎,如何組織場景中的元素是至關重要的問題。好的場景組織方式不僅利于內存的管理,而且能夠加速場景的渲染。本發明采用場景圖來組織場景,這種場景組織方式不僅有利于內存的管理,減少內存開銷,而且能夠加速場景渲染,同時還利于實時交互的實現。第二步建立并生成該場景的八叉樹結構,記錄相關的信息。1、建立基本的數據結構A)AABB包圍盒的實現AABB結構是平行于坐標軸的包圍物體的最小長方體,如圖1所示。與其他包圍體相比,AABB結構比較簡單,內存消耗少,更新快,相互之間的求交也快捷。我們用AABB包圍盒來描述八叉樹的空間節點。AABB包圍盒的數據結構如下所示AABBTVector3max;TVector3min;max代表了最大值點,包圍盒前右上頂點的世界坐標,min代表了最小值點,包圍盒后左下頂點的世界坐標。通過這兩個坐標能夠計算出所有需要的數學參數。所有面的參數PlaneABCD(法向量(0,-l,0);點(A.x贅A,y,A.z))PlaneFBCG(法向量(0,0,1);點(G.x賃G.y,G.z))PlaneGCDH(法向量(1,0,0);點(G.X,G.y,G.z))PlaneEADH(法向量(0,0,-1);點(A.A.y,A.z))PlaneEABF(法向量(-1,0,0);點(A.x賃A.y,A.z))PlaneEFGH(法向量(0,1,0);點(G.X,G.y,G.z))B)定義八叉樹結構八叉樹結構主要記錄的是整個樹結構的信息,比如樹的層次深度,節點數目等,通過這些信息我們可以唯一確定一個樹結構,主要數據結構如下所示ClassTOctreePaxtitionNodestd::wstringmOctreeFilename;unsignedintmNumObjectsPerCell;unsignedintmNumLevels;unsignedintmNumOctreeNodes;unsignedintmNumOctreeLeafs;TVector3mLookDirection;structTOctreeNodeD印th;T0ctreeNode氺mRootNode;T0ctreeNode氺mPreviousStartNode;boolmDisabled;TNodeListmSceneNodeList:std::list〈TOctreeNodeD印th〉mOctreeNodeDepthList;〃成員函數mOctreeFilename是一個字符數組,記錄的是整個八叉樹節點的名字,用于程序運行時的識別和區分。mNumObjectsPerCell記錄每個八叉樹葉子節點中最多能容納的幾何節點的數量,這個參數可以在八叉樹構建后由用戶進行設置。mNumLevels記錄八叉樹能夠劃分的最深層次,當八叉樹進行遞歸劃分時,遞歸次數等于該數時遞歸運算將不再繼續運行。mNumOctreeNodes記錄劃分后整個八叉樹中所有子節點的數量,但不包括葉子節點的數量。mNumOctreeLeafs記錄整個八叉樹中所有葉子節點的數量。mLookDirection記錄了視錐體的可視方向,該向量被用于計算節點深度信息等{曰息。TOctreeNodeD印th為記錄節點深度構建的結構體,這里的深度指的是幾何節點到視點的遠近距離,而不是子節點在樹結構上的層次深度。niRootNode是一個八叉樹指針,記錄整個八叉樹的根節點指針。mPreviousStartNode同樣是一個八叉樹的指針,記錄的是其中一個子節點,該子節點是下次視域剔除時的起始節點。mDisabled是一個布爾值變量,它相當于一個開關,控制是否進行八叉樹模式的視域剔除,可以由用戶設置。mSceneNodeList是一個臨時列表,用于存放需要顯示的所有幾何節點的指針,然后將由一個函數將其作為返回值返回給顯示主程序。mOctreeNodeDepthList是一個由深度結構體組成的列表,主要記錄每個八叉樹節點的深度信息。2、建立場景的八叉樹結構。八叉樹數據結構的建立,主要工作是把場景圖結構按空間位置信息劃分成八叉樹結構,并計算好所有八叉樹空間節點的包圍盒信息。如圖2所示。A)設置八叉樹參數,比如樹的層次數限制,每個葉子空間能包含的最大節點數等B)遍歷所有幾何節點,計算根節點的包圍盒大小。C)遞歸劃分包圍盒,記錄所有子節點和葉子節點,生成場景的八叉樹結構。首先將根節點的AABB盒均勻的劃分成八個部分;然后根據相交檢測算法,將父節點下的所有幾何節點分別歸類至這八個空間中;最后進行遞歸調用,對所有子節點進行劃分。第三步利用八叉樹結構,通過視錐體與包圍盒的相交檢測算法進行快速的視域剔除。視域剔除的主要工作是通過已經存在的八叉樹結構計算出位于視錐體之內的所有幾何節點,僅將這部分節點送入渲染管道執行最后的渲染流程,以此來提高整個引擎的渲染速度。1、OBB包圍盒的實現OBB是一個最貼近物體的長方體,只不過該長方體可以根據物體的一階矩任意旋轉。OBB比傳統的包圍球和AABB更加逼近物體,能顯著減少包圍體的個數。同時,OBB包圍盒測試所得的結果更精確,最終要渲染的物體會更少。因此,我們用OBB包圍盒來表示幾何節點。一個給定對象的OBB被定義為包含該對象且相對于坐標軸方向任意的最小的正六面體。計算OBB的關鍵是尋找最佳方向,并確定在該方向上包圍盒的最小尺寸。在文中OBB包圍盒的數據結構如下OBBTVector3mCenter;TVector3mAxes[3];intmExtent[3];OBB包圍盒的空間結構如圖3所示mCenter代表OBB的中心坐標,mAxes代表三個向量,mExtent代表了三個向量上的長度(正負方向都有)。根據數據結構中的這些數值可以計算出OBB幾何結構中的所有數學參數。所有頂點坐標可以通過如下運算獲得<formula>formulaseeoriginaldocumentpage9</formula>所有面的參數如下:PlaneABCD(法向量一"1;點A)PlaneFBCG(法向量巧o;點G)PlaneGCDH(法向量點G)PlaneEADH(法向量點A)PlaneEABF(法向量H2;點A)PlaneEFGH(法向量點G)其中,Pc代表中心點坐標,巧分別代表三個方向向量,k代表向量長度。2、利用八叉樹結構,實現快速的視域剔除。本發明利用八叉樹來進行視域剔除,極大地減少視錐體和OBB包圍盒的相交檢測,從而加速了視域剔除的速度,提高了算法的性能。其流程如圖4所示。具體步驟為A)由根節點開始向下尋找包含整個視錐體的最小八叉樹節點,找到后在mPreviousStartNode變量中記錄該節點,如沒找到則記錄根節點,該節點將作為下一次判斷時的起始節點。B)然后遍歷該節點下的所有葉子節點,如完全處于視錐體內則標記顯示所有幾何節點,如葉子節點僅與視錐體相交則進行OBB相交檢測,判斷是否顯示相關幾何節點,以后的判斷就從記錄的節點開始,向下尋找新的起始節點,如果由于移動等原因導致該節點已不能包含整個視錐體時,則向上査詢最小的一個包含視錐體的節點作為新的起始節點。第四步對于處于視錐體內的物體進行渲染。在經過視域剔除之后,就可以將處于視錐體里的物體送入圖形處理器的渲染通道進行渲染。實驗結果我們在WindowsXPSP2系統下,對本發明的算法進行了測試。測試平臺的配置如表l。表1測試平臺<table>tableseeoriginaldocumentpage10</column></row><table>我們分別對不同渲染場景(幾何節點數量不同)下的畫面幀數進行測試,評估渲染效率的改良情況,測試結果如表2所示。表2不同情況下渲染速度的比較<table>tableseeoriginaldocumentpage10</column></row><table>從表2中可以看出,隨著場景中節點數量的增加,幀數提高的效率就越為明顯,這是因為,八叉樹的生成算法會使原有的節點數量增加(增加了空間節點的數量),所以對于節點數量較少的場景來說,線性檢測和八叉樹檢測的差別并不明顯,而場景中節點一旦增加,如第三行所示場景中節點數增加到1000個以上后,幀數有50%以上的提高。這就說明,本文提出的這個場景管理算法對于大規模復雜場景有非常好的優化效果,能夠大大提高原有的渲染幀數,從而達到實時渲染的目的。權利要求1.一種基于八叉樹的大規模復雜三維場景管理方法,其特征在于其步驟如下a.載入大規模三維場景,用場景圖來組織場景中的所有元素;b.建立并生成該場景的八叉樹結構,記錄相關的信息;c.利用八叉樹結構,通過視錐體與包圍盒的相交檢測算法進行快速的視域剔除;d.對于處于視錐體內的物體進行渲染。2.根據權利要求1所述的基于八叉樹的大規模復雜三維場景處理方法,其特征在于所述的步驟(2)建立并生成場景的八叉樹結構的具體步驟是A)設置八叉樹參數,如樹的層次數限制,每個葉子空間能包含的最大節點數等;B)遍歷所有幾何節點,計算根節點的包圍盒大小;C)遞歸劃分包圍盒,記錄所有子節點和葉子節點,生成場景的八叉樹結構;首先將根節點的AABB盒均勻的劃分成八個部分;然后根據相交檢測算法,將父節點下的所有幾何節點分別歸類至這八個空間中;最后進行遞歸調用,對所有子節點進行劃分。3.根據權利要求1所述的基于八叉樹的大規模復雜三維場景管理方法,其特征在于所述的步驟(3)利用八叉樹結構,通過視錐體與包圍盒的相交檢測算法進行快速的視域剔除的步驟是A)由根節點開始向下尋找包含整個視錐體的最小八叉樹節點,找到后在mPreviousStartNode變量中記錄該節點,若沒找到則記錄根節點,則該節點將作為下一次判斷時的起始節點;B)然后遍歷該節點下的所有葉子節點,若完全處于視錐體內則標記顯示所有幾何節點,若葉子節點僅與視錐體相交則進行OBB相交檢測,判斷是否顯示相關幾何節點,以后的判斷就從記錄的節點開始,向下尋找新的起始節點,如果由于移動原因導致該節點已不能包含整個視錐體時,則向上查詢最小的一個包含視錐體的節點作為新的起始節點。全文摘要本發明涉及一種基于八叉樹的大規模復雜三維場景處理方法,屬于計算機圖形學和虛擬現實領域,其步驟為(1)載入大規模三維場景,用場景圖來組織場景中的所有元素;(2)建立并生成該場景的八叉樹結構,記錄相關的信息;(3)利用八叉樹結構,通過視錐體與包圍盒的相交檢測算法進行快速的視域剔除;(4)對于處于視錐體內的物體進行渲染。本發明考慮了當前圖形渲染引擎實時渲染大規模復雜三維場景存在的不足,用八叉樹結構來組織場景,利用其空間信息和樹形結構,批量的削減視錐體外的幾何節點,快速計算出需要渲染的節點序列,減少送入渲染通道的三角面數量,從而有效地提高渲染速度,達到實時性的要求。文檔編號G06T9/40GK101281654SQ200810037739公開日2008年10月8日申請日期2008年5月20日優先權日2008年5月20日發明者萬旺根,余小清,周俊瑋,林繼承申請人:上海大學