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

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

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

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

定義三角形

OpenGL 允許我們使用三維坐標來定義物體。在繪制三角形前,我們需要定義它各個點的坐標。我們一般使用數(shù)組來存儲各個頂點的坐標。

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

繪制三角形

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

實驗步驟:

1. 添加新的類Triangle

代碼如下:

public class Triangle {
  public Triangle()
  {
     float triangleCoords[] = {
          // X, Y, Z 這是一個等邊三角形
          -0.5f, -0.25f, 0,
           0.5f, -0.25f, 0,
           0.0f, 0.559016994f, 0
        };
        // 初始化三角形的頂點緩存
        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)建一個浮點緩存
        triangleVB.put(triangleCoords); // 向浮點緩存中添加頂點坐標
        triangleVB.position(0); // 使緩存讀第一個坐標
  }
  public void draw(GL10 gl)
  {
    gl.glColor4f(0.63671875f, 0.76953125f, 0.22265625f, 0.0f); //設(shè)置當前顏色
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleVB);//設(shè)置頂點
    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()方法來啟用頂點數(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);
}

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

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

實驗步驟:

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

代碼如下:

@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è)置當前矩陣為投影矩陣
    gl.glLoadIdentity(); // 重置矩陣為初始值
    gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7); // 根據(jù)長寬比設(shè)置投影矩陣
}

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

代碼如下:

@Override
public void onDrawFrame(GL10 gl) {
  // TODO Auto-generated method stub
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    // 設(shè)置當前矩陣為模型視圖模式
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();  // reset the matrix to its default state
    // 設(shè)置視點
    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開發(fā)入門與進階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)

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

相關(guān)文章

  • Android APP檢測實體按鍵事件詳解

    Android APP檢測實體按鍵事件詳解

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

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

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

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

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

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

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

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

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

    Android仿google now效果的呼吸按鈕

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

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

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

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

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

    android之datepicker控件的用法

    下面小編就為大家?guī)硪黄猘ndroid之datepicker控件的用法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • Android實現(xiàn)靜默安裝的兩種方法

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

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

最新評論

淮安市| 安塞县| 米林县| 剑川县| 娄烦县| 福安市| 武穴市| 吴堡县| 天津市| 高阳县| 华宁县| 德保县| 湛江市| 正定县| 伊吾县| 广安市| 防城港市| 嘉义县| 水富县| 定安县| 阿坝| 灵山县| 扎鲁特旗| 红原县| 定陶县| 措美县| 临邑县| 开阳县| 沙雅县| 永济市| 鞍山市| 泰来县| 泗阳县| 张家港市| 大埔县| 华坪县| 石嘴山市| 唐海县| 彭水| 大同县| 彭山县|