亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        智能手機(jī)利用OpenGLES實(shí)現(xiàn)室內(nèi)3D全景瀏覽的研究和實(shí)現(xiàn)

        2014-04-29 00:00:00王溢達(dá)楊昱昺
        科技創(chuàng)新與應(yīng)用 2014年17期

        摘 要:Android智能手機(jī)是目前應(yīng)用最廣泛的智能手機(jī)平臺(tái)。目前,在Android的平臺(tái)上能將一個(gè)景點(diǎn)制作成360度全景觀賞的APP還很少見,但此類APP可以幫助人們更好了解景區(qū)情況。因此此類APP有一定研究價(jià)值和實(shí)現(xiàn)必要。本文詳細(xì)介紹了如何利用Android中自帶的OpenGLES庫來實(shí)現(xiàn)360度全景觀賞的功能。為廣大Android智能手機(jī)愛好者提供寶貴的參考價(jià)值。

        關(guān)鍵詞:Android;OpenGLES;360度3D全景;景點(diǎn)觀賞

        引言

        OpenGLES是(OpenGL for Embedded Systems) 是OpenGL三維圖形API的子集,針對(duì)手機(jī)、PDA和游戲主機(jī)等嵌入式設(shè)備而設(shè)計(jì)。因此OpenGLES是OpenGL的裁剪版,OpenGL(Open Graphics Library)是個(gè)定義了一個(gè)跨編程語言、跨平臺(tái)的應(yīng)用程序接口(API)的規(guī)范,它用于生成二維、三維圖像。這個(gè)接口由近三百五十個(gè)不同的函數(shù)調(diào)用組成,用來從簡單的圖形比特繪制復(fù)雜的三維景象。

        利用OpenGLES來構(gòu)建3D的模型,有利于對(duì)系統(tǒng)GPU的運(yùn)用,可以提高運(yùn)算效率,可以提升生成的三維景象的質(zhì)量。Android中OpenGLES的計(jì)算都基于三角形,多么復(fù)雜的形狀都源于三角形的組合。

        由于三角形只需要提供三個(gè)坐標(biāo)(按一定順序)則可以創(chuàng)造一個(gè)唯一的三角形和他的紋理坐標(biāo)。之后我們利用三角形組成多邊形。在OpenGLES的紋理映射的規(guī)則中,根據(jù)提供的按順序的三點(diǎn)坐標(biāo),可容易對(duì)齊紋理的位置和形狀,這是三角形的優(yōu)勢。

        1 具體原理

        1.1 由三角形組成球

        之前提過OpenGLES中最小的圖形是三角形,全部的圖形由三角形的組成而成,因此構(gòu)建曲面物體最重要的就是找到將曲面恰當(dāng)拆分成三角形的策略。最基本的策略是首先按照一定的規(guī)則將物體按行和列兩個(gè)方向進(jìn)行拆分,這時(shí)就可以得到很多的小四邊形。然后再將每個(gè)小四邊形拆分成兩個(gè)三角形即可,對(duì)曲面物體進(jìn)行拆分時(shí),拆分得越細(xì),最終的繪制結(jié)果就越接近想要結(jié)果,如圖1所示。

        圖1 三角形組成球原理圖

        從圖1可看出,分的越細(xì),效果越接近球。但不是越細(xì)越好,分的過多,將導(dǎo)致頂點(diǎn)數(shù)量過多,渲染速度大大降低。我們這里將球看作20面體來細(xì)分。

        1.2 從紋理角度解釋球

        由于球是由三角形的組合構(gòu)成的20面體,為了將原來準(zhǔn)備好的紋理貼圖,按紋理規(guī)則貼圖到20面體上,OpenGL紋理映射的大致步驟是:(1)創(chuàng)建紋理對(duì)象,并為他指定一個(gè)紋理。(2)確定紋理如何應(yīng)用到每個(gè)像素上。(3)啟用紋理貼圖。(4)繪制場景,提供紋理和幾何坐標(biāo)。由于球是由很多三角形組成,因此紋理指定是也是三角形指定。球形的指定方法如圖2:

        圖2 球體頂點(diǎn)紋理坐標(biāo)生成

        從圖2中可以看出,根據(jù)右圖中每個(gè)頂點(diǎn)對(duì)應(yīng)的S軸,T軸的位置可以非常方便地計(jì)算出每個(gè)頂點(diǎn)的紋理坐標(biāo)。而矩形里面的頂點(diǎn)都是通過拓補(bǔ)變換來自于球面上的頂點(diǎn),與球面上的頂點(diǎn)一一對(duì)應(yīng),因此球面上每個(gè)頂點(diǎn)的紋理坐標(biāo)就可以很方便的計(jì)算出來。其中,拓補(bǔ)變換是拓補(bǔ)幾何中的一種變換,拓補(bǔ)變換前后的兩個(gè)圖形是拓補(bǔ)全等。簡單來說拓補(bǔ)變換就是不產(chǎn)生新頂點(diǎn)以及不改變頂點(diǎn)與頂點(diǎn)之間邊連接情況的前提下,任意的將頂點(diǎn)移動(dòng),這時(shí)連接這些頂點(diǎn)的邊也可能被相應(yīng)的拉伸、縮短和旋轉(zhuǎn)。舉例:圖2中的紋理貼圖(0,1),(0.25,1),(0.5,1),(0.75,1),(1,1)這5個(gè)點(diǎn),被拓補(bǔ)之后位移成一個(gè)點(diǎn),他們之間的邊也縮短為0,實(shí)際他們都是南極點(diǎn)。這樣的變換是合理的,因?yàn)榻酉聛頃?huì)提到360度全景拍攝的要點(diǎn)“取材”,是使用了魚眼鏡頭。具體代碼實(shí)現(xiàn):

        GLES20.glUseProgram(mProgram);

        //將最終變換矩陣傳入著色器程序

        GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, 1, MatrixState.getFinalMatrix(), 0);

        //將位置、旋轉(zhuǎn)變換矩陣傳入著色器程序

        GLES20.glUniformMatrix4fv(muMMatrixHandle, 1, 1, MatrixState.getMMatrix(), 0);

        //將攝像機(jī)位置傳入著色器程序

        GLES20.glUniform3fv(maCameraHandle, 1, MatrixState.cameraFB); //將光源位置傳入著色器程序

        GLES20.glUniform3fv(maSunLightLocationHandle, 1, MatrixState.lightPositionFBSun);

        GLES20.glVertexAttribPointer(//為畫筆指定頂點(diǎn)位置數(shù)據(jù)

        maPositionHandle,3,GLES20.GL_FLOAT,1,3*4,

        mVertexBuffer);

        GLES20.glVertexAttribPointer( //為畫筆指定頂點(diǎn)紋理數(shù)據(jù)

        maTexCoorHandle,2,GLES20.GL_FLOAT,1,2*4,

        mTexCoorBuffe);

        GLES20.glVertexAttribPointer //為畫筆指定頂點(diǎn)法向量數(shù)據(jù)

        (maNormalHandle, 4, GLES20.GL_FLOAT, 1,3*4,

        mVertexBuffer); //允許頂點(diǎn)位置數(shù)據(jù)數(shù)組

        GLES20.glEnableVertexAttribArray(maPositionHandle);

        GLES20.glEnableVertexAttribArray(maTexCoorHandle);

        GLES20.glEnableVertexAttribArray(maNormalHandle); //綁定紋理

        GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texId);

        GLES20.glActiveTexture(GLES20.GL_TEXTURE1);

        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texIdNight);

        GLES20.glUniform1i(uDayTexHandle, 0);

        GLES20.glUniform1i(uNightTexHandle, 1);

        //繪制三角形

        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vCount);

        ……

        1.3 360度全景的關(guān)鍵-魚眼鏡頭拍攝

        由上文,我們知道紋理左邊再處理時(shí)進(jìn)行了拓補(bǔ)變換,因此我們?nèi)粲闷胀ǖ溺R頭拍攝將會(huì)有一定的變形,雖然圖片的中心“赤道”部分的拓補(bǔ)變換較小,而且我們觀看的大部分內(nèi)容皆在“赤道部分”,但考慮到若想模擬人“抬頭”和“低頭”這2個(gè)動(dòng)作的時(shí)候出現(xiàn)的扭曲,仍應(yīng)采取魚眼鏡頭拍攝更佳。

        魚眼鏡頭是一種焦距為16mm或更短的并且視角接近或等于180度。這種攝像鏡頭的前鏡直徑很短且呈拋物狀向鏡頭前部突出。為了達(dá)到180度的超大視角,魚眼鏡頭拍攝得出的照片出了畫面中心的景物不變,其他都發(fā)生了改變,之后我們配合iPhone中的全景拍攝功能,會(huì)發(fā)現(xiàn)出了中心的景物改變不大之外,上下邊緣的景物被拉伸過,經(jīng)過拓補(bǔ)變化則正好還原成正常圖片。如圖3。

        圖3 魚眼鏡頭拍攝結(jié)果

        從圖3可看出上下是有進(jìn)行過一定的變換,若經(jīng)過拓補(bǔ)變換反而會(huì)使之正?;?。

        2 測試結(jié)果

        (1)選擇想要看的地方;(2)點(diǎn)擊全景觀賞;(3)可以看到360度的展示。

        具體結(jié)果如圖4:

        3 結(jié)束語

        智能手機(jī)通過OpenGLES將景點(diǎn)360度全方位展示給用戶,主要是利用了曲面體的拆分和紋理的拓補(bǔ),將紋理圖片貼到球的內(nèi)部。通過這樣的處理,最后我們將攝像機(jī)(Camera)放置在圓心,并設(shè)置觸屏動(dòng)作,以達(dá)到虛擬現(xiàn)實(shí)的效果。

        參考文獻(xiàn)

        [1]吳亞峰.Android3D游戲開發(fā)技術(shù)寶典-OpenGL ES2.0[J].科學(xué)技術(shù)與工程,2012.

        [2]李印思.基于OpenGL的三維交互建模技術(shù)及其應(yīng)用[J].機(jī)械設(shè)計(jì)及理論,2012.

        [3]張祖勛,蘇國中,鄭順義,等.OpenGL成像機(jī)理及其與攝影測量方位元素的相關(guān)分析[J].科學(xué)技術(shù)與工程,2012.

        [4]李保杰,于法展,李戰(zhàn)成,等.基于OpenGL虛擬校園漫游系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].科學(xué)技術(shù)與工程,2006.

        [5]馬杰,王晶,黃秋萍.OpenGL ES在Android平臺(tái)上3D繪圖的兩種方式分析與實(shí)現(xiàn)[J].科學(xué)技術(shù)與工程,2013,12.

        作者簡介:

        楊昱 (1969-),男,副教授,研究方向:軟件開發(fā),文本檢索。

        成人特黄a级毛片免费视频| 韩国美女主播国产三级| 一区二区三区国产天堂| 亚洲av天堂在线视频| 亚洲欧美aⅴ在线资源| 亚洲另类欧美综合久久图片区| 精品国产97av一区二区三区| 亚洲日本国产精品久久| 少妇仑乱a毛片| 国产精品一区高清在线观看| 日本中文字幕一区二区在线观看 | 又爽又黄又无遮挡网站动态图| 亚洲a∨天堂男人无码| 精品亚洲视频免费观看网站| 综合色免费在线精品视频| 开心五月激情综合婷婷色| 九九精品无码专区免费| 国产日韩欧美视频成人| 日本办公室三级在线观看| 成人免费看aa片| av人摸人人人澡人人超碰小说| 亚洲欧洲日产国码无码av野外| 国产国语按摩对白av在线观看| 亚洲av永久无码精品网址| 国产精品毛片无遮挡高清| 在线视频日韩精品三区| 亚洲一区毛片在线观看| 国产av无码专区亚洲awww| 欧美在线成人午夜网站| 久久精品国产白丝爆白浆| 97se色综合一区二区二区| 精品国产乱码久久久软件下载| 狠狠色欧美亚洲综合色黑a| 蜜桃免费一区二区三区| 一本久道综合在线无码人妻| 国产成人拍精品免费视频| 国产一区二区三区再现| 久久理论片午夜琪琪电影网| 特级毛片a级毛片在线播放www| 久久迷青品着产亚洲av网站| 午夜视频国产在线观看|