技術(shù)領(lǐng)域
本發(fā)明可用于三維模型可視化,尤其是大規(guī)模場景、模型數(shù)量較多的情況。尤其涉及一種動態(tài)細節(jié)層次模型實現(xiàn)的方法。
背景技術(shù):
在三維空間地理信息可視化系統(tǒng)中,大規(guī)模三維模型的可視化作為其重要的組成部分,廣泛應(yīng)用在數(shù)字城市、數(shù)字交通、數(shù)字海洋等領(lǐng)域中。三維模型具有靈活度高、展示性好等優(yōu)點,能夠極大的增加可視化的真實感和沉浸感。但是,一方面,三維模型的真實性往往取決于模型網(wǎng)格的精細程度和紋理的分辨率,一個精細的模型往往擁有百萬級別的三角面片和數(shù)百兆大小的紋理貼圖。另一方面,三維空間地理信息可視化系統(tǒng)往往具有場景范圍大、模型數(shù)量多等特點,一個數(shù)字城市可能需要展示十萬級數(shù)量的樓宇,一個數(shù)字交通應(yīng)用有可能需要展示百萬級數(shù)目的車輛。
在大規(guī)模場景下,顯示海量的精細三維空間模型對系統(tǒng)的渲染能力、存儲能力、網(wǎng)絡(luò)傳輸能力等都帶來了極大的挑戰(zhàn),甚至會由于內(nèi)存、I/O、計算等方面的限制導(dǎo)致系統(tǒng)的卡頓和崩潰。
細節(jié)層次模型,也稱LOD模型,是一種實時的三維計算機圖形技術(shù)。細節(jié)層次模型能夠做到當用戶視點離物體較近時,能觀察到模型的細節(jié),當用戶視點逐漸遠離模型時,觀察到的細節(jié)逐漸模糊。細節(jié)層次模型可以避免因繪制意義相對不大的細節(jié)而造成的時間浪費,提高復(fù)雜場景的生成和顯示速度。細節(jié)層次模型在交互式可視化、虛擬現(xiàn)實等領(lǐng)域得到了廣泛的應(yīng)用,細節(jié)層次模型有靜態(tài)和動態(tài)之分。
靜態(tài)細節(jié)層次模型是一種較簡單的細節(jié)層次模型。它通過模型網(wǎng)格簡化算法預(yù)先生成一個或一組獨立的、有不同精細度的簡化模型。這些簡化模型一般按照由精細到粗糙的順序排列,互相之間沒有外在的聯(lián)系。系統(tǒng)根據(jù)不同場合的需要,從這組靜態(tài)模型中選用一個最合適的模型供繪制使用。
靜態(tài)細節(jié)層次模型可以減少可視化時CPU的計算壓力,使用方便,繪制快捷。但是靜態(tài)細節(jié)層次模型不能得到任意分辨率的模型,靜態(tài)細節(jié)層次模型的層數(shù)越多,存儲壓力也越大。而且,由于不同精細度的逼近模型中三角形數(shù)目往往相差很大,因此在層次之間切換就會產(chǎn)生“跳躍”的視覺效果,影響用戶體驗。
動態(tài)細節(jié)層次模型則需要事先創(chuàng)建適當?shù)臄?shù)據(jù)結(jié)構(gòu),在實際應(yīng)用的時候,按用戶的需求從該數(shù)據(jù)結(jié)構(gòu)中提取相應(yīng)的層次細節(jié),并生成適合當前需要的簡化模型。動態(tài)次節(jié)層次模型中每個模型的簡化程度不是預(yù)處理的時候固定的,而是由模型之外的因素決定,例如用戶的視點距離。
由于動態(tài)細節(jié)層次模型可以實時地得到任意分辨率的近似模型,所以動態(tài)細節(jié)層次模型不需要保存多個副本,可以大大減輕存儲壓力,并且在用戶瀏覽時做到層次平滑切換,增強用戶體驗。但是動態(tài)層次模型對模型實時生成的速度卻有著較高的要求。
技術(shù)實現(xiàn)要素:
為了克服背景技術(shù)中存在的缺陷,本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案是:一種動態(tài)細節(jié)層次模型實現(xiàn)的方法,其特征在于包括對模型的預(yù)處理和對自定義文件解析兩部分:
1. 對模型的預(yù)處理:
1.1.找出最小度量誤差的頂點序列;
1.2.保存被刪除點舊id和新id的對應(yīng)permutation[vertex[i]->id]= vertex.num-1;
1.3.保存替代頂點的舊id到map[vertex.num-1];
1.4.對折疊代價或度量誤差最小的頂點序列進行半邊折疊,并更新被刪除點的鄰居點的度量誤差;
1.5.步驟1.1到步驟1.4循環(huán)vertex.num次;
1.6.利用permutation數(shù)組將map中的替代頂點的舊id替換為新id,map[i] = permutation[map[i]];
1.7.利用permutation數(shù)組對頂點按重要度進行排序,將三角形三元組的舊id替換為新id;
2.解析自定義文件
2.1. 用原模型頂點數(shù)vert.num乘以精簡度percent得到新模型的頂點數(shù)vert.num * percent,取出前vert.num * percent個頂點;
2.2. 對三角形序列的三個頂點序號tri.at(i).t[0],tri.at(i).t[1],tri.at(i).t[2],分別根據(jù)map折疊數(shù)組快速找到替代頂點序號;
2.3. 如果三角形序列的三個頂點序號tri.at(i).t[0],tri.at(i).tri[1],tri.at(i).tri[2]有相同的,則表示這個三角形無效;
2.4. 根據(jù)前vert.num * percent個頂點和有效三角形得到任意比例的模型,最終實現(xiàn)動態(tài)細節(jié)層次模型。。
本發(fā)明通過預(yù)處理對頂點按重要程度排序并保存折疊序列,能快速生成任意比例的模型,符合實現(xiàn)動態(tài)細節(jié)層次模型的要求。
具體實施方式
一種動態(tài)細節(jié)層次模型實現(xiàn)的方法,其特征在于包括對模型的預(yù)處理和對自定義文件解析兩部分:
1. 對模型的預(yù)處理:
1.1.找出最小度量誤差的頂點序列;例如u->v,稱u為被刪除頂點,v為代替頂點;
度量誤差可以使用二次誤差來進行度量。假設(shè)頂點u折疊到頂點v,則基于二次誤差的半邊折疊的度量誤差為u到所有包含頂點v的三角平面的距離之和。一個三維空間中的三角平面可以用方程ax + by + zc + d = 0(其中a2 + b2 + c2 = 1)來表示,令p = [a b c d]T代表包含頂點v的一個平面,點u的坐標為[x y z 1]T,則點u到三角平面p距離的平方為:
其中:
令
為點v的二次誤差測度矩陣,其中為所有包含頂點v的三角面的集合。
度量誤差為:
1.2.保存被刪除點舊id和新id的對應(yīng)permutation[vertex[i]->id]= vertex.num-1;
1.3.保存替代頂點的舊id到map[vertex.num-1];
1.4.對折疊代價或度量誤差最小的頂點序列進行半邊折疊,并更新被刪除點的鄰居點的度量誤差;
對頂點對uv進行半邊折疊,去除既包含頂點u又包含頂點v的三角形或以uv為邊的三角形。然后,更新所有剩下的三角形,把所有用到頂點u的地方都用頂點v代替,移除頂點u。更新頂點u鄰居點的度量誤差。
1.5.步驟1到步驟4循環(huán)vertex.num次;
1.6.利用permutation數(shù)組將map中的替代頂點的舊id替換為新id,map[i] = permutation[map[i]];
1.7.利用permutation數(shù)組對頂點按重要度進行排序,將三角形三元組的舊id替換為新id;
1.8.預(yù)處理后,頂點id和重要度是一致的,也就是是說頂點是有序的。越重要的頂點,頂點編號越小;越不重要的頂點,頂點編號越大。而map中則記錄著折疊序列。對頂點數(shù)組按id寫入自定義文件,并將三角形三元組和map數(shù)組寫入自定義文件。
2.解析自定義文件:
2.1.用原模型頂點數(shù)vert.num乘以精簡度percent得到新模型的頂點數(shù)vert.num * percent,取出前vert.num * percent個頂點;
2.2.對三角形序列的三個頂點序號tri.at(i).t[0],tri.at(i).t[1],tri.at(i).t[2],分別根據(jù)map折疊數(shù)組快速找到替代頂點序號;
2.3.如果三角形序列的三個頂點序號tri.at(i).t[0],tri.at(i).tri[1],tri.at(i).tri[2]有相同的,則表示這個三角形無效。
2.4.根據(jù)前vert.num * percent個頂點和有效三角形得到任意比例的模型。
本發(fā)明通過預(yù)處理對頂點按重要程度排序并保存折疊序列,能快速生成任意比例的模型,符合實現(xiàn)動態(tài)細節(jié)層次模型的要求。
顯然,上述實施例僅僅是為清楚地說明所作的舉例,而并非對實施方式的限定。對于所屬領(lǐng)域的普通技術(shù)人員來說,在上述說明的基礎(chǔ)上還可以做出其它不同形式的變化或變動。這里無需也無法對所有的實施方式予以窮舉。而由此所引伸出的顯而易見的變化或變動仍處于本發(fā)明創(chuàng)造的保護范圍之中。