本發(fā)明涉及3d顯示技術(shù),具體涉及一種將基于opengl的3d模型轉(zhuǎn)化為立體雙視點(diǎn)視圖的轉(zhuǎn)換方法,具體的是一種3d模型轉(zhuǎn)立體雙視點(diǎn)視圖的方法。
背景技術(shù):
人類生活在一個(gè)立體的世界,利用立體視覺來(lái)感知世界,隨著計(jì)算機(jī)技術(shù)的飛速發(fā)展,計(jì)算機(jī)描述現(xiàn)實(shí)世界的方式越來(lái)越豐富:從聲音到圖像再到視頻,計(jì)算機(jī)所能表示的世界越來(lái)越復(fù)雜。目前大多數(shù)的顯示設(shè)備依舊之能夠進(jìn)行2d顯示,忽略了深度信息,在數(shù)字化,現(xiàn)代化的時(shí)代,2d顯示已經(jīng)不能夠滿足人類的需求,于是3d模型作為一種新的媒體形式進(jìn)入了人們的生活、學(xué)習(xí)和工作中,并且很快被普通大眾所接受。它在影視娛樂,建筑,機(jī)械制造,醫(yī)療,軍事,電子商務(wù),虛擬現(xiàn)實(shí),考古等很多方面都得到了越來(lái)越廣泛的應(yīng)用。
在當(dāng)前的計(jì)算機(jī)顯示領(lǐng)域,立體顯示已經(jīng)成為了未來(lái)的發(fā)展方向。在市場(chǎng)上,目前有許多硬件選項(xiàng),使我們能夠獲得立體3d可視化信息。而3d顯示技術(shù)是整個(gè)3d流程中最復(fù)雜的一步,由于播放的平臺(tái)都是平面顯示設(shè)備,且左右眼素材要在同一個(gè)顯示設(shè)備上出現(xiàn),這就涉及到如何將左右眼素材進(jìn)行分離,并分別準(zhǔn)確的送到觀眾的左右眼中。一旦左右眼素材的分離出現(xiàn)問題,3d效果就不會(huì)出現(xiàn),而觀眾也將看到混亂、有重影的畫面內(nèi)容。我們采用匯聚雙目投影觀測(cè)模型,將3d模型按照此觀測(cè)模型映射到屏幕上。這種模型更符合人眼的觀測(cè)習(xí)慣,使人看到的更加真實(shí)、自然。
人眼能獲得立體視覺的根本原因是存在視差,利用人的雙眼在同一時(shí)間分別看到不同的圖像形成視差,從而獲得立體視覺的特點(diǎn)。
技術(shù)實(shí)現(xiàn)要素:
三維立體顯示技術(shù)是虛擬現(xiàn)實(shí)的關(guān)鍵技術(shù),也是虛擬現(xiàn)實(shí)系統(tǒng)必不可少的基本條件,而深度感的正確形成又是立體顯示技術(shù)的關(guān)鍵,深度感的正確形成通過(guò)雙目視差圖來(lái)實(shí)現(xiàn)的。如今市場(chǎng)上的立體顯示器的3d立體感效果,就是由雙視點(diǎn)視圖直接決定的,視差圖包含了場(chǎng)景的距離信息。故本發(fā)明從立體視覺原理出發(fā),重點(diǎn)研究如何利用opengl從計(jì)算機(jī)虛擬的3d模型中提取出多視點(diǎn)圖像,從而進(jìn)行轉(zhuǎn)化成立體雙視點(diǎn)視覺差圖,進(jìn)而解決3d顯示問題。
本發(fā)明的3d模型轉(zhuǎn)雙視點(diǎn)視圖包括3d模型讀取和轉(zhuǎn)雙視點(diǎn)視差圖;其中3d模型讀取包括讀取頂點(diǎn)信息和繪制頂點(diǎn);轉(zhuǎn)雙視點(diǎn)視差圖包括單目轉(zhuǎn)化和繪制雙視點(diǎn)視圖。
本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案包括如下步驟:
步驟1:選定匯聚式觀測(cè)模型;
觀測(cè)模型主要有匯聚式觀測(cè)模型和平行式觀測(cè)模型。本發(fā)明選定匯聚式觀測(cè)模型,且其中top,bottom,left,right分別為左右眼共用的棱錐臺(tái)前剪裁面的上下左右邊到中心的距離,near為前剪裁面到視點(diǎn)的距離,far為后剪裁面到視點(diǎn)的距離。
步驟2:輸入?yún)?shù),并計(jì)算匯聚式觀測(cè)模型的錐體位移:
雙眼距離iod,人眼觀測(cè)圖像上下兩邊的視野夾角fov,人眼到前剪切面的垂直距離d(eye-nearz),人眼到屏幕的垂直距離d(eye-screen),人眼到后剪切面的垂直距離d(eye-farz),圖像長(zhǎng)寬比ratio。
根據(jù)相似三角形計(jì)算該匯聚式觀測(cè)模型的錐體位移
frustumshift=(iod/2)*d(eye-nearz)/d(eye-screen)⑴
步驟3:計(jì)算左右眼錐臺(tái)參數(shù)
左眼錐臺(tái)參數(shù):
top=tan(fov/2)*d(eye-nearz)⑵
leftleft_eye=-ratio*top-frumstumshift⑶
rightleft_eye=ratio*top-frumstumshift⑷
bottom=-top⑸
右眼錐臺(tái)參數(shù):
top=tan(fov/2)*d(eye-nearz)⑹
rightright_eye=ratio*top+frumstumshift⑺
leftright_eye=-ratio*top+frumstumshift⑻
bottom=-top⑼
其中,fov表示人眼觀測(cè)圖像上下兩邊的視野夾角,ratio為圖像長(zhǎng)寬比;
top和bottom分別為左右眼共用的棱錐臺(tái)前剪裁面的上下邊界到中心的距離;
leftleft_eye和leftright_eye分別為左右眼的棱錐臺(tái)前剪裁面的左邊界到中心的距離;
rightleft_eye和rightright_eye分別為左右眼的棱錐臺(tái)前剪裁面的右邊界到中心的距離;
步驟4:得到左右眼的投影矩陣和視圖矩陣。
左眼投影矩陣mlproj
mlproj=frustum(leftleft_eye,rightleft_eye,bottom,top,d(eye-nearz),d(eye-farz))⑽
右眼投影矩陣mrproj
mrproj=frustum(leftright_eye,rightright_eye,bottom,top,d(eye-nearz),d(eye-farz))⑾
左眼視圖矩陣
mlview=glm::lookat(leftcameraposition,cameratarget,upvector)⑿
右眼視圖矩陣
mrview=glm::lookat(rightcameraposition,cameratarget,upvector)⒀
leftcameraposition表示實(shí)際坐標(biāo)系中的左相機(jī)位置,rightcameraposition表示實(shí)際坐標(biāo)系中的右相機(jī)的位置,cameratarget表示實(shí)際坐標(biāo)系中的目標(biāo)位置,upvector代表取z坐標(biāo)為正方向。
步驟5:將左右眼的投影矩陣、視圖矩陣和模型矩陣分別相乘得到兩個(gè)4*4矩陣mvp,并將矩陣mvp傳入著色器
mvp=projection*view*model⒁
projection是投影矩陣,view是視圖矩陣,model是模型矩陣。
因?yàn)樽笥已鄣玫降耐队熬仃嚭鸵晥D矩陣都不相同,所以三個(gè)矩陣相乘得到的mvp矩陣也是不同的。因此,本發(fā)明會(huì)分別將左眼的mvp和右眼的mvp傳入著色器,即根據(jù)左眼的投影矩陣、視圖矩陣以及模型矩陣得到左眼mvp,并將左眼mvp傳入著色器,根據(jù)右眼的投影矩陣、視圖矩陣以及模型矩陣得到右眼mvp,并將右眼mvp傳入著色器。
步驟6:加載3d模型文件,并將頂點(diǎn)信息保存在數(shù)組中
用遞歸算法加載3d模型文件,并將讀取出的頂點(diǎn)信息以數(shù)組的形式保存。當(dāng)3d模型的所有頂點(diǎn)加載完成后,將保存了頂點(diǎn)信息的數(shù)組傳入著色器中。
步驟7:將頂點(diǎn)坐標(biāo)分別左乘左右眼的mvp矩陣,從而得到新的頂點(diǎn)坐標(biāo);
設(shè)原頂點(diǎn)坐標(biāo)p1=(x1,y1,z1,w),變換后頂點(diǎn)坐標(biāo)為p2=(x2,y2,z2,w)。
則
p2=mvp*p1⒂
步驟8:當(dāng)3d模型的每個(gè)頂點(diǎn)都轉(zhuǎn)化之后,即可得到新的觀測(cè)圖像,即為左右眼圖像。將得到的左右眼圖像分別映射在屏幕的左右半邊,將它們拼接在一塊就得到了雙視點(diǎn)視圖。
與現(xiàn)有技術(shù)相比,本發(fā)明的積極效果為:
本發(fā)明不同于通過(guò)雙目攝像頭采集信息的方法,而是通過(guò)讀取3d模型文件來(lái)建立雙視點(diǎn)視圖,可被應(yīng)用于虛擬場(chǎng)景的雙視點(diǎn)視圖生成。
本發(fā)明相比于傳統(tǒng)方法適用性強(qiáng),將所轉(zhuǎn)化得到的雙視點(diǎn)視圖傳入裸眼3d屏幕即可實(shí)現(xiàn)裸眼3d效果,將雙視點(diǎn)視圖傳入vr設(shè)備即可實(shí)現(xiàn)vr效果。
本發(fā)明采用匯聚式投影模型,符合人眼的視覺習(xí)慣,滿足雙眼輻輳的仿真,實(shí)現(xiàn)的效果更逼真。同時(shí),影響視覺體驗(yàn)的雙眼距離iod以及人眼到屏幕的距離d(eye-screen)都是輸入?yún)?shù)。這使得調(diào)節(jié)最終效果變得更加科學(xué)、方便。
附圖說(shuō)明
圖1是匯聚式投影示意圖;
圖2是匯聚式投影棱錐臺(tái)示意圖;
圖3是轉(zhuǎn)化算法流程圖。
具體實(shí)施方式
下面結(jié)合具體實(shí)施方式對(duì)本發(fā)明進(jìn)行詳細(xì)的說(shuō)明。
如圖1-3所示,一種3d模型轉(zhuǎn)立體雙視點(diǎn)視圖的方法,具體包括如下步驟:
步驟1:選定匯聚式觀測(cè)模型
觀測(cè)模型主要有匯聚式觀測(cè)模型和平行式觀測(cè)模型。本發(fā)明選定匯聚式觀測(cè)模型。
附圖1為匯聚式投影示意圖、附圖2為匯聚式投影的棱錐臺(tái)。其中top,bottom,left,right分別為左右眼共用的棱錐臺(tái)前剪裁面的上下左右邊到中心的距離,near為前剪裁面到視點(diǎn)的距離,far為后剪裁面到視點(diǎn)的距離。
步驟2:根據(jù)相似三角形計(jì)算匯聚式觀測(cè)模型的錐體位移:
frustumshift=(iod/2)*d(eye-nearz)/d(eye-screen)⑴
式中,iod為雙眼距離,d(eye-nearz)表示人眼到前剪切面的垂直距離,d(eye-screen)表示人眼到屏幕的垂直距離,d(eye-farz)表示人眼到后剪切面的垂直距離。取iod=7,d(eye-nearz)=1,d(eye-screen)=5,d(eye-farz)=100,則可計(jì)算得到frumstumshift=0.7。
步驟3:根據(jù)幾何學(xué)知識(shí)計(jì)算左右眼錐臺(tái)參數(shù)
左眼:
top=tan(fov/2)*d(eye-nearz)⑵
leftleft_eye=-ratio*top-frumstumshift⑶
rightleft_eye=ratio*top-frumstumshift⑷
bottom=-top⑸
右眼:
top=tan(fov/2)*d(eye-nearz)⑹
rightright_eye=ratio*top+frumstumshift⑺
leftright_eye=-ratio*top+frumstumshift⑻
bottom=-top⑼
其中,fov表示人眼觀測(cè)圖像上下兩邊的視野夾角,ratio為圖像長(zhǎng)寬比;
top和bottom分別為左右眼共用的棱錐臺(tái)前剪裁面的上下邊界到中心的距離;
leftleft_eye和leftright_eye分別為左右眼的棱錐臺(tái)前剪裁面的左邊界到中心的距離;
rightleft_eye和rightright_eye分別為左右眼的棱錐臺(tái)前剪裁面的右邊界到中心的距離;
取fov=120°,ratio=1080/960,則計(jì)算可得
左眼:
右眼:
步驟4:根據(jù)下列兩個(gè)矩陣得到左右眼的投影矩陣和視圖矩陣,具體如下:
fnear,ffar代表d(eye-nearz),d(eye-farz),t、b代表top、bottomrl,rr,ll,lr分別代表rightleft_eye,rightright_eye,leftleft_eye,leftright_eye,從而得出左眼投影矩陣mlproj:
mlproj=frustum(leftleft_eye,rightleft_eye,bottom,top,d(eye-nearz),d(eye-farz))⑽
右眼投影矩陣mrproj:
mrproj=frustum(leftright_eye,rightright_eye,bottom,top,d(eye-nearz),d(eye-farz))⑾
左眼視圖矩陣mlview:
mlview=glm::lookat(leftcameraposition,cameratarget,upvector)⑿
右眼視圖矩陣mrview:
mrview=glm::lookat(rightcameraposition,cameratarget,upvector)⒀
leftcameraposition表示實(shí)際坐標(biāo)系中的左相機(jī)位置,rightcameraposition表示實(shí)際坐標(biāo)系中的右相機(jī)的位置,cameratarget表示實(shí)際坐標(biāo)系中的目標(biāo)位置,upvector代表取z坐標(biāo)為正方向。
步驟5:將左右眼的投影矩陣、視圖矩陣和模型矩陣分別相乘得到兩個(gè)4*4矩陣mvp,并將矩陣mvp傳入著色器
mvp=projection*view*model⒁
projection是投影矩陣,view是視圖矩陣,model是模型矩陣。
因?yàn)樽笥已鄣玫降耐队熬仃嚭鸵晥D矩陣都不相同,所以三個(gè)矩陣相乘得到的mvp矩陣也是不同的。因此,本發(fā)明會(huì)分別將左眼的mvp和右眼的mvp傳入著色器,即根據(jù)左眼的投影矩陣、視圖矩陣以及模型矩陣得到左眼mvp,并將左眼mvp傳入著色器,根據(jù)右眼的投影矩陣、視圖矩陣以及模型矩陣得到右眼mvp,并將右眼mvp傳入著色器。模型矩陣能夠使3d模型的位置在世界坐標(biāo)系中發(fā)生變化,例如模型的旋轉(zhuǎn)或者平移。因?yàn)楸景l(fā)明可以不做任何的旋轉(zhuǎn)平移,所以本發(fā)明的模型矩陣取4*4的單位矩陣,即默認(rèn)3d模型加載在世界坐標(biāo)系的原點(diǎn)處。
步驟6:加載3d模型文件,并將頂點(diǎn)信息保存在數(shù)組中
用遞歸算法加載3d模型文件,并將讀取出的頂點(diǎn)信息以數(shù)組的形式保存。當(dāng)3d模型的所有頂點(diǎn)加載完成后,將保存了頂點(diǎn)信息的數(shù)組傳入著色器中。
步驟7:將頂點(diǎn)坐標(biāo)分別左乘左右眼的mvp矩陣,從而得到新的頂點(diǎn)坐標(biāo);
設(shè)原頂點(diǎn)坐標(biāo)p1=(x1,y1,z1,w),變換后頂點(diǎn)坐標(biāo)為p2=(x2,y2,z2,w)。
則
p2=mvp*p1⒂
步驟8:當(dāng)3d模型的每個(gè)頂點(diǎn)都轉(zhuǎn)化之后,即可得到新的觀測(cè)圖像,即為左右眼圖像。將得到的左右眼圖像分別映射在屏幕的左右半邊,將它們拼接在一塊就得到了雙視點(diǎn)視圖。
本發(fā)明將得到的mvp矩陣傳入著色器處理,大大加快了程序運(yùn)行速度,這將提高程序的實(shí)時(shí)性和快速性。觀測(cè)效果易調(diào)節(jié),可以根據(jù)外部設(shè)備的不同選擇最適合的觀測(cè)參數(shù)。