Android 3D 旋轉的三角形(一)

來源:互聯網
上載者:User

package com.sunny;

import android.app.Activity;
import android.os.Bundle;

public class mainActivity extends Activity {
    private static final String LOG_TAG=mainActivity.class.getSimpleName();
    private VortexView _vortexView;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        _vortexView=new VortexView(this);
        setContentView(_vortexView);
    }
}

VortexView

package com.sunny;

import android.content.Context;
import android.opengl.GLSurfaceView;
import android.view.MotionEvent;

public class VortexView extends GLSurfaceView {//繼承了GLSurfaceView是因為它會協助我們畫3D映像
    private static final String LOG_TAG=VortexView.class.getSimpleName();
    private VortexRenderer _renderer;//一個Renderer包含畫一幀所必需的所有東西
    public VortexView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        _renderer=new VortexRenderer();
        setRenderer(_renderer);
    }
    @Override
    public boolean onTouchEvent(final MotionEvent event) {
        // TODO Auto-generated method stub
        queueEvent(new Runnable(){

            @Override
            public void run() {//調用renderer中的setColor方法
                // TODO Auto-generated method stub
                _renderer.setColor(event.getX()/getWidth(), event.getY()/getHeight(), 1.0f);
                _renderer.setAngle(event.getX()/10);
            }
           
        });
        return true;
    }
   

}

VortexRenderer

package com.sunny;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.ShortBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView;
public class VortexRenderer implements GLSurfaceView.Renderer{
    private static final String LOG_TAG=VortexRenderer.class.getSimpleName();
    private float _red=0.9f;//用浮點數來定義RGB顏色系統中的每一個顏色
    private float _green=0.2f;
    private float _blue=0.2f;
   
    private ShortBuffer _indexBuffer;//儲存索引
    private FloatBuffer _vertexBuffer;//為三角形儲存座標
    private short[] _indicesArray={0,1,2};
    private int _nrOfVertices=3;//定義需要多少個頂點.對於一個三角形來說,一共需要三個頂點
   
    private float _angle;
    public void setAngle(float angle){
        _angle=angle;
    }
    public void setColor(float r, float g, float b) {
        _red = r;
        _green = g;
        _blue = b;
    }
    private void initTriangle(){
        //為這裡兩個buffer分配必須的記憶體
        // float has 4 bytes
        ByteBuffer vbb=ByteBuffer.allocateDirect(_nrOfVertices*3*4);
        vbb.order(ByteOrder.nativeOrder());
        _vertexBuffer=vbb.asFloatBuffer();
        // short has 2 bytes
        ByteBuffer ibb=ByteBuffer.allocateDirect(_nrOfVertices*2);
        ibb.order(ByteOrder.nativeOrder());
        _indexBuffer=ibb.asShortBuffer();
       
        float[] coords={
                -0.5f,-0.5f,0f, // (x1, y1, z1)
                0.5f,-0.5f,0f,// (x2, y2, z2)
                0f,0.5f,0f// (x3, y3, z3)
        };
        _vertexBuffer.put(coords);
        _indexBuffer.put(_indicesArray);
       
        _vertexBuffer.position(0);
        _indexBuffer.position(0);
    }
   
   
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {//surface建立以後調用
        // TODO Auto-generated method stub
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);//設定OpenGL使用vertex數組來畫
        initTriangle();
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int w, int h) {//surface發生改變以後調用,例如從豎屏切換到橫屏的時候
        // TODO Auto-generated method stub
        gl.glViewport(0,0,w,h);
    }

    @Override
    public void onDrawFrame(GL10 gl) {//當任何時候調用一個畫圖方法的時候
        // TODO Auto-generated method stub
        // set rotation
        gl.glRotatef(_angle, 0f, 1f, 0f);//繞y軸旋,參數中的值表示一個向量,標誌三角形繞著旋轉的座標軸
       
        // define the color we want to be displayed as the "clipping wall"
        gl.glClearColor(_red, _green, _blue, 1.0f);
        // clear the color buffer to show the ClearColor we called above...
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
        // set the color of our element 設定三角形為暗紅色
        gl.glColor4f(0.5f, 0f, 0f, 0.5f);
        // define the vertices we want to draw
        /*使用glVertexPointer()初始化Vertex Pointer.
         *  第一個參數是大小,也是頂點的維數。我們使用的是x,y,z三維座標。
         *  第二個參數,GL_FLOAT定義buffer中使用的資料類型。
         *  第三個變數是0,是因為我們的座標是在數組中緊湊的排列的,沒有使用offset。
         *  最後第四個參數頂點緩衝。
         */
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _vertexBuffer);
        // finally draw the vertices
        /*glDrawElements()將所有這些元素畫出來。
         * 第一個參數定義了什麼樣的圖元將被畫出來。
         * 第二個參數定義有多少個元素,
         * 第三個是indices使用的資料類型。
         * 最後一個是繪製頂點使用的索引緩衝。
         */
        gl.glDrawElements(GL10.GL_TRIANGLES, _nrOfVertices, GL10.GL_UNSIGNED_SHORT, _indexBuffer);
       
    }

}

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.