最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android基于OpenGL在GLSurfaceView上繪制三角形及使用投影和相機(jī)視圖方法示例

 更新時(shí)間:2016年10月31日 09:27:37   作者:pku_android  
這篇文章主要介紹了Android基于OpenGL在GLSurfaceView上繪制三角形及使用投影和相機(jī)視圖方法,結(jié)合實(shí)例形式分析了Android基于OpenGL的圖形繪制技巧,需要的朋友可以參考下

本文實(shí)例講述了Android基于OpenGL在GLSurfaceView上繪制三角形及使用投影和相機(jī)視圖方法。分享給大家供大家參考,具體如下:

定義三角形

OpenGL 允許我們使用三維坐標(biāo)來(lái)定義物體。在繪制三角形前,我們需要定義它各個(gè)點(diǎn)的坐標(biāo)。我們一般使用數(shù)組來(lái)存儲(chǔ)各個(gè)頂點(diǎn)的坐標(biāo)。

OpenGL ES 默認(rèn) [0,0,0] (X,Y,Z) 在GLSurfaceView的中心,[1,1,0]在右上角,[-1,-1,0]在左下角。

繪制三角形

在繪制三角形之前,我們必須告訴OpenGL我們正在使用頂點(diǎn)數(shù)組。然后我們才使用繪制函數(shù)畫出三角形。

實(shí)驗(yàn)步驟:

1. 添加新的類Triangle

代碼如下:

public class Triangle {
  public Triangle()
  {
     float triangleCoords[] = {
          // X, Y, Z 這是一個(gè)等邊三角形
          -0.5f, -0.25f, 0,
           0.5f, -0.25f, 0,
           0.0f, 0.559016994f, 0
        };
        // 初始化三角形的頂點(diǎn)緩存
        ByteBuffer vbb = ByteBuffer.allocateDirect(
            // (# of coordinate values * 4 bytes per float)
            triangleCoords.length * 4);
        vbb.order(ByteOrder.nativeOrder());// 使用設(shè)備硬件本身的字節(jié)序
        triangleVB = vbb.asFloatBuffer(); // 從ByteBuffer中創(chuàng)建一個(gè)浮點(diǎn)緩存
        triangleVB.put(triangleCoords); // 向浮點(diǎn)緩存中添加頂點(diǎn)坐標(biāo)
        triangleVB.position(0); // 使緩存讀第一個(gè)坐標(biāo)
  }
  public void draw(GL10 gl)
  {
    gl.glColor4f(0.63671875f, 0.76953125f, 0.22265625f, 0.0f); //設(shè)置當(dāng)前顏色
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleVB);//設(shè)置頂點(diǎn)
    gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);//繪制三角形
  }
  private FloatBuffer triangleVB;
}

2. 在myGLRenderer類中添加成員privateTriangle mTriangle并在構(gòu)造函數(shù)中初始化。

代碼如下:

public myGLRenderer()
{
    mTriangle = new Triangle();
}

3. 在myGLRenderer類的onSurfaceCreated()函數(shù)最后添加glEnableClientState()方法來(lái)啟用頂點(diǎn)數(shù)組。

代碼如下:

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    // TODO Auto-generated method stub
    gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
}

4. 在myGLRenderer類的onDrawFrame()函數(shù)最后添加三角形繪制方法。

代碼如下:

@Override
public void onDrawFrame(GL10 gl) {
    // TODO Auto-generated method stub
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    mTriangle.draw(gl);
}

這樣,我們便完成了一個(gè)平面三角形的繪制。但我們發(fā)現(xiàn)這個(gè)三角形并不像我們定義的那樣是一個(gè)等邊三角形,這是由于OpenGL總假設(shè)我們的屏幕是一個(gè)正方形,這樣在繪制的時(shí)候最終圖形會(huì)隨著屏幕長(zhǎng)寬比例的不同而被拉伸。為了得到正確的顯示,我們需要將圖形投影到正確的位置。這一功能我們?cè)谙乱还?jié)進(jìn)行實(shí)現(xiàn)。

Android設(shè)備屏幕通常不是正方形的,而OpenGL總是默認(rèn)地將正方形坐標(biāo)系投影到這一設(shè)備上,這就導(dǎo)致圖形無(wú)法按真實(shí)比例顯示。要解決這一問(wèn)題,我們可以使用OpenGL 的投影模式和相機(jī)視圖將圖形的坐標(biāo)進(jìn)行轉(zhuǎn)換以適應(yīng)不同的設(shè)備顯示。

實(shí)驗(yàn)步驟:

1. 修改myGLRenderer類的onSurfaceCreated()函數(shù)來(lái)啟用GL10.GL_PROJECTION模式,計(jì)算屏幕的長(zhǎng)寬比并使用這一比例來(lái)轉(zhuǎn)換物體的坐標(biāo)。

代碼如下:

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
    // TODO Auto-generated method stub
    gl.glViewport(0, 0, width, height);
    float ratio = (float) width / height;
    gl.glMatrixMode(GL10.GL_PROJECTION); // 設(shè)置當(dāng)前矩陣為投影矩陣
    gl.glLoadIdentity(); // 重置矩陣為初始值
    gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7); // 根據(jù)長(zhǎng)寬比設(shè)置投影矩陣
}

2. 修改myGLRenderer的onDrawFrame()方法,啟用MODELVIEW模式,并使用GLU.gluLookAt()來(lái)設(shè)置視點(diǎn)。

代碼如下:

@Override
public void onDrawFrame(GL10 gl) {
  // TODO Auto-generated method stub
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    // 設(shè)置當(dāng)前矩陣為模型視圖模式
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();  // reset the matrix to its default state
    // 設(shè)置視點(diǎn)
    GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
    mTriangle.draw(gl);
}

這樣,我們繪制的圖形比例就總是正確的,不再受設(shè)備的影響而被拉伸變形了。

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android圖形與圖像處理技巧總結(jié)》、《Android開(kāi)發(fā)入門與進(jìn)階教程》、《Android調(diào)試技巧與常見(jiàn)問(wèn)題解決方法匯總》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)

希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Android APP檢測(cè)實(shí)體按鍵事件詳解

    Android APP檢測(cè)實(shí)體按鍵事件詳解

    這篇文章主要為大家詳細(xì)介紹了Android APP檢測(cè)實(shí)體按鍵事件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Android實(shí)現(xiàn)pdf在線預(yù)覽或本地預(yù)覽的方法

    Android實(shí)現(xiàn)pdf在線預(yù)覽或本地預(yù)覽的方法

    下面小編就為大家分享一篇Android實(shí)現(xiàn)pdf在線預(yù)覽或本地預(yù)覽的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Android客戶端與服務(wù)端交互

    Android客戶端與服務(wù)端交互

    這篇文章主要為大家詳細(xì)介紹了Android客戶端與服務(wù)端交互之登陸示例,感興趣的小伙伴們可以參考一下
    2016-02-02
  • Android json數(shù)據(jù)解析詳解及實(shí)例代碼

    Android json數(shù)據(jù)解析詳解及實(shí)例代碼

    這篇文章主要介紹了 Android json數(shù)據(jù)解析詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Android應(yīng)用中繪制圓形頭像的方法解析

    Android應(yīng)用中繪制圓形頭像的方法解析

    這篇文章主要介紹了Android應(yīng)用中繪制圓形頭像的方法解析,文后還順帶介紹了Android App常用圖標(biāo)尺寸規(guī)范,需要的朋友可以參考下
    2016-02-02
  • Android仿google now效果的呼吸按鈕

    Android仿google now效果的呼吸按鈕

    這篇文章主要為大家詳細(xì)介紹了Android仿google now效果的呼吸按鈕簡(jiǎn)單實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Android彈出窗口實(shí)現(xiàn)方法

    Android彈出窗口實(shí)現(xiàn)方法

    這篇文章主要介紹了Android彈出窗口實(shí)現(xiàn)方法,涉及Android TextView及鼠標(biāo)事件的響應(yīng)相關(guān)技巧,需要的朋友可以參考下
    2016-01-01
  • Android適配器(Adapter)的概念與自定義

    Android適配器(Adapter)的概念與自定義

    這篇文章主要給大家介紹了關(guān)于Android適配器(Adapter)的相關(guān)資料,適配器是一個(gè)非常重要的知識(shí)點(diǎn),Adapter是用來(lái)幫助填出數(shù)據(jù)的中間橋梁,本文介紹的非常詳細(xì),需要的朋友可以參考下
    2021-07-07
  • android之datepicker控件的用法

    android之datepicker控件的用法

    下面小編就為大家?guī)?lái)一篇android之datepicker控件的用法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • Android實(shí)現(xiàn)靜默安裝的兩種方法

    Android實(shí)現(xiàn)靜默安裝的兩種方法

    這篇文章主要介紹了Android實(shí)現(xiàn)靜默安裝的兩種方法,一種是利用root權(quán)限靜默安裝實(shí)現(xiàn),另一種是非root權(quán)限提示用戶安裝,兩種方法分別給出了示例代碼,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-02-02

最新評(píng)論

宜丰县| 丰原市| 当涂县| 黄陵县| 和林格尔县| 容城县| 永昌县| 娱乐| 封开县| 全州县| 玉林市| 上虞市| 秦安县| 湘阴县| 米林县| 宁津县| 丰都县| 桓仁| 宜都市| 西乡县| 阳泉市| 巴彦县| 昌图县| 伊金霍洛旗| 桂平市| 兴仁县| 蓝山县| 德昌县| 衡南县| 安达市| 饶河县| 肇源县| 恭城| 东乡| 出国| 城口县| 遂昌县| 博客| 华阴市| 萝北县| 万宁市|