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