android opengl es 三角體,正方體自動旋轉

實現三角體,正方體的3d效果及自動旋轉思路如下:


其實要實現三角體,正方體自動旋轉效果,只需繪出立方體的三角形與四邊形。在加上gl.glRotatef(angle,x , y, z);就行了。

 

 

具體實現如下:

 

 

Renderer類代碼

 

package sim.feel;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.IntBuffer;

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

import android.opengl.GLSurfaceView.Renderer;

public class MyRender implements Renderer {
    //google畫圖單位
    private int one = 0x10000;

    //三角體旋轉角度

    private float triangleAngle = 0.5f;

    //正方體旋轉角度
    private float quaterAngle = 0.5f;

    //三角體、正方體及其顏色緩衝
    private IntBuffer triangleBuffer;
    private IntBuffer quaterBuffer;
    private IntBuffer triangleColorBuffer;
    private IntBuffer quaterColorBuffer;
    // 三角體四個面的頂點
    private int[] triangle = {

0, one, 0,

-one, -one, one,

one, -one, one,

 

0, one, 0,

one, -one, one,

one, -one, -one,

 

0, one, 0,

one, -one,-one,

-one, -one, one,

 

0, one, 0,

-one, -one, -one,

-one, -one, one

    };
    // 正方體8個面得頂點
    private int[] quater = new int[] {

one, one, -one,

-one, one, -one,

one,one, one,

 

-one, one, one,

one, -one, one,

-one, -one, one,

 

one,-one, -one,

-one, -one, -one,

one, one, one,

 

-one, one, one,

one, -one, one,

-one, -one, one,

 

one, -one, -one,

-one, -one, -one,

one,one, -one,

 

-one, one, -one,

-one, one, one,

-one, one, -one,

 

-one, -one, one,

-one, -one, -one,

one, one, -one,

 

one, one, one,

one, -one, -one,

one, -one, one,

     };
    // 三角體各頂點的顏色(r,g,b,a)
    private int[] triangleColor = new int[] {
            // tri 4 face
        one, 0, 0, one,

0, one, 0, one,

0, 0, one, one,

 

one, 0, 0, one,

0, one, 0, one,

0, 0, one, one,

 

one, 0, 0, one,

0, one, 0, one,

0, 0,one, one,

 

one, 0, 0, one,

0, one, 0, one,

0, 0, one, one,

 

  };
    // 正方形各頂點顏色
    private int[] quaterColor = new int[] {

0, one, 0, one,

0, one, 0, one,

0,one, 0, one,

0, one, 0, one,

 

one, one / 2, 0, one,

one, one / 2, 0,one,

one, one / 2, 0, one,

one, one / 2, 0, one,

 

one, 0, 0, one,

        one, 0, 0, one,

one, 0, 0, one,

one, 0, 0, one,

 

one, one, 0, one,
        one, one, 0, one,

one, one, 0, one,

one, one, 0, one,

 

0, 0, one,one,

0, 0, one, one,

0,0, one, one,

0,0, one, one,

 

one,0, one, one,

one,0, one, one,

one,0, one, one,

one,0, one, one

    };
    //初始化Buffer
    public void init() {
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(triangle.length * 4);
        ByteBuffer byteColorBuffer = ByteBuffer
                .allocateDirect(triangleColor.length * 4);
        ByteBuffer byteQuaterBuffer = ByteBuffer
                .allocateDirect(quater.length * 4);
        ByteBuffer byteQuterColorBuffer = ByteBuffer
                .allocateDirect(quaterColor.length * 4);

        byteBuffer.order(ByteOrder.nativeOrder());
        byteColorBuffer.order(ByteOrder.nativeOrder());
        byteQuaterBuffer.order(ByteOrder.nativeOrder());
        byteQuterColorBuffer.order(ByteOrder.nativeOrder());

        triangleBuffer = byteBuffer.asIntBuffer();
        triangleColorBuffer = byteColorBuffer.asIntBuffer();
        quaterBuffer = byteQuaterBuffer.asIntBuffer();
        quaterColorBuffer = byteQuterColorBuffer.asIntBuffer();

        triangleBuffer.put(triangle);
        triangleColorBuffer.put(triangleColor);
        quaterBuffer.put(quater);
        quaterColorBuffer.put(quaterColor);

        triangleBuffer.position(0);
        triangleColorBuffer.position(0);
        quaterBuffer.position(0);
        quaterColorBuffer.position(0);
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        // 清除屏幕和深度緩存
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        // 重置
        gl.glLoadIdentity();

        // 初始化triangleBuffer與triangleColorBuffer
        init();
        // 左移1.5f並向裏移6.0f
        gl.glTranslatef(-1.5f, 0.0f, -6.0f);
        // 旋轉
        gl.glRotatef(triangleAngle, 0.0f, 1.0f, 0.0f);

        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

        // 設置頂點及顏色
        gl.glVertexPointer(3, GL10.GL_FIXED, 0, triangleBuffer);
        gl.glColorPointer(4, GL10.GL_FIXED, 0, triangleColorBuffer);
        // 繪製
        for (int i = 0; i < 4; i++) {
            gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, i * 3, 3);
        }

        gl.glFinish();
        // 重置觀察模型
        gl.glLoadIdentity();
        gl.glTranslatef(1.5f, 0.0f, -6.0f);

        gl.glRotatef(quaterAngle, 1.0f, 0.0f, 0.0f);

        gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer);
        gl.glColorPointer(4, GL10.GL_FIXED, 0, quaterColorBuffer);

        // 繪製
        for (int i = 0; i < 6; i++) {
            gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, i * 4, 4);
        }

        gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
        // 旋轉角度+0.5f
        triangleAngle += 0.5f;
        quaterAngle += 0.5f;
    }


    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        float ratio = (float) width / height;
        gl.glViewport(0, 0, width, height);
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig arg1) {
        // 告訴系統對透視進行修正
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
        // 黑色背景
        gl.glClearColor(0, 0, 0, 0);
        // 啓用陰影平滑
        gl.glShadeModel(GL10.GL_SMOOTH);

        // 清除深度緩存
        gl.glClearDepthf(1.0f);
        // 啓用深度測試
        gl.glEnable(GL10.GL_DEPTH_TEST);
        // 所做深度測試的類型
        gl.glDepthFunc(GL10.GL_LEQUAL);
    }
}

 

效果圖:

 

 

 

發佈了30 篇原創文章 · 獲贊 19 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章