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