歐陽會東,吳文江,胡 毅
(1.中國科學(xué)院大學(xué),北京 100049 ;2.中國科學(xué)院沈陽計算技術(shù)研究所,沈陽 110168 ;3.沈陽高精數(shù)控智能技術(shù)股份有限公司,沈陽 110168)
隨著“中國制造2025”和“工業(yè)4.0”在國內(nèi)的提出,工業(yè)生產(chǎn)的數(shù)字化建設(shè)也愈發(fā)重要。近年來,虛擬現(xiàn)實、數(shù)字孿生等技術(shù)的迅速發(fā)展也為數(shù)字化建設(shè)提供了強(qiáng)大的技術(shù)支持[1-3]。計算機(jī)硬件水平雖然在高速的發(fā)展,但是虛擬三維模型的渲染速度也在隨著用戶對模型精度的要求的提高越來越無法滿足需要。針對3D場景中模型的渲染,國內(nèi)外學(xué)者提出了很多不同的解決方法,如細(xì)節(jié)層次模型LOD(Level of Detail)技術(shù),基于GPU的渲染加速技術(shù)等[4-6]。上述方法雖然較大的提升了模型的渲染速度,但是上述方法都是對三維模型的整體進(jìn)行渲染。針對復(fù)雜度高,子結(jié)構(gòu)較多的三維模型,仍然存在渲染速度過慢,GPU和內(nèi)存占用率過高的問題。
本文通過研究三維模型的結(jié)構(gòu)特征,發(fā)現(xiàn)三維模型在不同的視點(diǎn)距離下,部分結(jié)構(gòu)的渲染對模型整體真實度的影響較小,這部分模型結(jié)構(gòu)對模型整體真實度的影響因子很低。根據(jù)模型子結(jié)構(gòu)相對于模型整體的體積比例不同,隨著視點(diǎn)與模型的距離變化,可以動態(tài)的計算各個子結(jié)構(gòu)的渲染度,通過與渲染閾值進(jìn)行比較,可以避免對影響因子較低的結(jié)構(gòu)進(jìn)行渲染。該方法可以較為明顯的減小三維模型的渲染壓力。能夠在不影響模型整體真實度的情況下,提高模型的渲染速度,降低GPU和內(nèi)存的占用率。
本文是根據(jù)三維模型與視點(diǎn)的距離,確定不同結(jié)構(gòu)的渲染程度。各個結(jié)構(gòu)的權(quán)重系數(shù)可以通過以下3步進(jìn)行確定:
(1)確定主要模型結(jié)構(gòu):主要模型結(jié)構(gòu)為三維模型的暴露在視點(diǎn)范圍內(nèi)的結(jié)構(gòu)。針對這部分結(jié)構(gòu),賦予較大的權(quán)重系數(shù),即使模型與視點(diǎn)的距離很大,也能保證視點(diǎn)范圍內(nèi)模型的整體真實度。
(2)確定次要模型結(jié)構(gòu):次要的模型結(jié)構(gòu)為不暴露在視點(diǎn)范圍內(nèi)的結(jié)構(gòu)。這部分結(jié)構(gòu)的渲染度會跟隨視點(diǎn)距離模型的遠(yuǎn)近不斷改變,從而動態(tài)的對模型結(jié)構(gòu)進(jìn)行約簡。
(3)針對每一個模型結(jié)構(gòu)相對于模型整體的的體積比,賦予模型結(jié)構(gòu)不同的權(quán)重系數(shù)。當(dāng)視點(diǎn)與模型的距離非常遠(yuǎn)的時候,細(xì)小的模型結(jié)構(gòu)的渲染對模型整體的影響將會變得很小,此時可以放棄這部分結(jié)構(gòu)的渲染,從而節(jié)省系統(tǒng)資源,提高渲染速度。
動態(tài)約簡的實現(xiàn)主要分為三個方面:首先計算模型結(jié)構(gòu)相對于整體的體積比,然后判斷模型結(jié)構(gòu)是否在視點(diǎn)范圍內(nèi),并計算視點(diǎn)與模型之間的距離,最后計算模型結(jié)構(gòu)的渲染度,通過渲染度與渲染閾值的比較,判斷當(dāng)前結(jié)構(gòu)是否需要進(jìn)行渲染,實現(xiàn)渲染過程中對模型結(jié)構(gòu)的動態(tài)約簡。
Unity3d引擎中,每一個模型都有MeshFilter組件,MeshFilter組件中又包含了Mesh屬性。Mesh屬性中記錄了vertices(頂點(diǎn)數(shù)據(jù)數(shù)組)、triangles(三角形頂點(diǎn)索引數(shù)組)、normals(法線向量數(shù)組)、uv(紋理坐標(biāo)數(shù)組)等信息。針對每一個模型都有MeshFilter(網(wǎng)格過濾器)屬性。
圖1 三維立方體模型圖
為了計算三維模型的體積,首先我們需要取得三維模型所有頂點(diǎn)及三角面片的數(shù)據(jù),Unity3d中提供了mesh.vertices以及mesh.triangle兩個屬性,分別為vector3型數(shù)組和int型數(shù)組。其中mesh.vertices存儲的就是平面的頂點(diǎn)信息,mesh.triangles存儲的是三角形的頂點(diǎn)繪制順序。然后將計算的代碼腳本掛載于需要計算體積的模型結(jié)構(gòu)上。以一個三維立方體為例,如圖1所示。
首先通過mesh.vertices獲取當(dāng)前模型的三角面片所有頂點(diǎn)順序,然后根據(jù)渲染順序計算每三個連續(xù)繪制頂點(diǎn)與中心坐標(biāo)點(diǎn)組合而成的三棱錐的體積。Unity3d引擎中,每個模型自身的中心坐標(biāo)點(diǎn)為(0,0,0),假設(shè)三棱錐的三個連續(xù)繪制頂點(diǎn)坐標(biāo)為分別為(x1,y1,z1),(x2,y2,z2),(x3,y3,z3)。根據(jù)坐標(biāo)向量即可通過行列式計算三棱錐的體積,即空間坐標(biāo)系中的三棱錐的體積計算公式如下所示:
(1)
最后統(tǒng)計所有三棱錐的體積之和,即可以得到當(dāng)前三維模型結(jié)構(gòu)的體積。
Unity3d引擎中,與視點(diǎn)范圍相關(guān)的坐標(biāo)系分別為視口坐標(biāo)系與世界坐標(biāo)系。視口坐標(biāo)系用于描述整個渲染畫面的坐標(biāo),左下角為(0,0),右上角為(1,1)。世界坐標(biāo)系為整個渲染場景的坐標(biāo)系,可以通過transform.position()函數(shù)獲取。為了判斷模型是否在視點(diǎn)范圍內(nèi),首先需要判斷當(dāng)前模型在視窗的坐標(biāo)是否在視口坐標(biāo)系的范圍類,然后通過點(diǎn)積運(yùn)算判斷模型是否在攝像機(jī)的前面,最后根據(jù)上述的計算結(jié)構(gòu)即可確定模型結(jié)構(gòu)是否在視點(diǎn)的范圍內(nèi),詳細(xì)的流程如圖2所示。
圖2 視點(diǎn)范圍判斷流程圖
本文主要通過Unity3d軟件進(jìn)行研究及實驗。距離的計算采用的是Unity3d軟件自帶的Vector3.Distance函數(shù),調(diào)用該函數(shù)可以計算出視點(diǎn)與模型之間的距離L(單位為m),函數(shù)偽代碼如下:
float L=Vector3.Distance(transform1.position, transform2.position)
本文算法在判斷三維模型的某個結(jié)構(gòu)是否渲染主要考慮兩個因素,一個是該結(jié)構(gòu)的體積Vi,另一個是視點(diǎn)與該模型之間的距離L,通過以上因素提出了渲染度以及渲染閾值的概念 。其中渲染度S定義公式為:
(2)
其中,當(dāng)前模型結(jié)構(gòu)在視點(diǎn)范圍內(nèi)時P的值為1,否則為0,σ為視點(diǎn)范圍內(nèi)模型結(jié)構(gòu)的權(quán)重系數(shù)。ρ為體積占比的權(quán)重系數(shù)。
針對每一個三維模型,設(shè)置一個渲染閾值M,并通過 Renderer.enabled 屬性控制其渲染。根據(jù)公式(1)計算該結(jié)構(gòu)的渲染度。當(dāng)結(jié)構(gòu)渲染度小于閾值的時候,該結(jié)構(gòu)在通過腳本控制取消渲染。只有結(jié)構(gòu)的渲染度大于或等于渲染閾值的時候,腳本才將其渲染出來。根據(jù)不同計算機(jī)的硬件條件,可以設(shè)置不同精度的σ和ρ,σ和ρ越大,渲染的模型精度越高,隨著距離的增大,渲染的模型結(jié)構(gòu)數(shù)量越多。也可以宏觀的調(diào)節(jié)渲染閾值M的值,對所有模型結(jié)構(gòu)的渲染進(jìn)行統(tǒng)一控制。
實驗主要工具為Unity3d軟件,硬件配置如表1所示。
表1 硬件配置表
為了驗證基于三維模型結(jié)構(gòu)權(quán)重的動態(tài)約簡方法,使用不同三角面片數(shù)量的模型進(jìn)行實驗,下圖為采用的實驗?zāi)P褪疽鈭D,其中圖3為實驗所用的模型結(jié)構(gòu)透視圖,圖4為模型實體圖。
圖3 模型結(jié)構(gòu)透視圖
圖4 模型實體圖
該模型總計有547個子結(jié)構(gòu),216 802個三角面片,通過多次實驗,不斷調(diào)整參數(shù)的數(shù)值,實驗最終設(shè)置視點(diǎn)范圍內(nèi)模型結(jié)構(gòu)的權(quán)重系數(shù)σ為100,體積的權(quán)重系數(shù)ρ為1,渲染閾值M為0.75, 然后對模型的結(jié)構(gòu)進(jìn)行體積計算并賦予相應(yīng)的權(quán)重。通過調(diào)整視點(diǎn)與模型的遠(yuǎn)近,記錄當(dāng)前場景中的三角面片數(shù)量,幀率以及此時視點(diǎn)與模型之間的距離。表2為記錄的主要實驗數(shù)據(jù)。
表2 面片數(shù)量變化表
為了驗證方法的通用性,同時對三個不同三角面片數(shù)量的三維模型進(jìn)行渲染,并繪制出三角面片數(shù)量根據(jù)距離的變化的折線圖,如圖5所示。其中縱軸為三角面片數(shù)量,橫軸為視點(diǎn)與模型之間的距離 。
圖5 三角面片數(shù)量變化折線圖
由折線圖可以觀察到,模型在視點(diǎn)與其距離逐漸增大的過程中,三角面片渲染的數(shù)量在逐步降低。并且隨著距離的進(jìn)一步增大,開始趨向于一個穩(wěn)定數(shù)值,這樣距離過大時也保證了模型在視點(diǎn)范圍內(nèi)不會消失。
在上述研究的基礎(chǔ)上,將該方法應(yīng)用到虛擬現(xiàn)實場景中。通過對比試驗論證該方法的實用性,并繪制距離與FPS(畫面每秒傳輸幀數(shù))的變化圖。其中實驗1為不使用三維模型動態(tài)約簡方法,實驗2使用了三維模型動態(tài)約簡方法。
圖6 實驗結(jié)果對比圖
實驗結(jié)果顯示,三維模型動態(tài)約簡方法的應(yīng)用,大幅度提升了虛擬現(xiàn)實場景渲染的流暢度,隨著視點(diǎn)與三維場景的距離的增加,系統(tǒng)整體的FPS不斷在上升并逐漸趨于穩(wěn)定。其中使用了三維模型動態(tài)約簡方法的實驗2的FPS隨著距離的增加一直高于未使用該方法的實驗1。
虛擬現(xiàn)實、數(shù)字孿生等技術(shù)一直是很多國內(nèi)外學(xué)者研究的重點(diǎn)。三維模型作為這些技術(shù)的基礎(chǔ),針對三維模型的簡化也有很多不同的方法。本文提出了基于模型結(jié)構(gòu)權(quán)重的三維模型動態(tài)約簡方法,該方法首先計算了模型結(jié)構(gòu)的體積,模型結(jié)構(gòu)與視點(diǎn)之間的距離,并判斷當(dāng)前模型結(jié)構(gòu)是否在視點(diǎn)范圍內(nèi),然后通過渲染度公式計算每個模型結(jié)構(gòu)渲染度,最后通過渲染度與渲染閾值的比較,通過腳本控制當(dāng)前模型結(jié)構(gòu)的渲染。 該方法針對復(fù)雜的三維模型以及大型三維場景的實時渲染,在保證模型真實性的前提下,大幅度減少了三角面片的渲染數(shù)量,提高了模型的渲染速度,保證了三維場景渲染的流暢度,通過對比實驗,在距離達(dá)到100 m以上時,三維場景的渲染幀率有了顯著提升。 同時本文所提出的渲染度公式中加入了人工調(diào)整的控制參數(shù),針對不同硬件配置的機(jī)器,調(diào)整不同的參數(shù)大小,保證了硬件配置較低的計算機(jī)同樣可以快速渲染模型及三維場景,賦予了該方法更多的靈活性與適用范圍。