android opengl es 三角形、正方形自动旋转

时间:2022-03-02 08:41:36

关于三角形、正方形自动旋转,具体的实现思路也很简单(当然前提是了解基本三角形、正方形的绘制),步骤如下:

(1)建立三角形、正方形顶点数组:

三角形,以三角形中心为坐标原点:

 private int[] tri = new int[] {

0, one,0,//上

 -one, -one, 0,//左

one, -one, 0//右

    };

正方形,以正方形中心为坐标原点:

private int[] qua = new int[] {

one, one, 0, //右上

-one, one, 0, //左上

one, -one, 0, //右下
        -one, -one, 0 //左下

     };

(2)进行必要的初始化,比如直接的缓冲等。

(3)在onDrawFrame中进行绘制,比起静止的三角形、正方形的绘制,多了gl.glRotatef(rot, x, y, z); 其中rot为角度,x,y,z分别代表x,y,z坐标轴的旋转变量(0~1,例如,当y=1时按y坐标轴旋转rot角度)。

 

 

下面是Renderer类的具体实现代码。


public class MyRenderer implements Renderer {

   //Google画图单位
    static int one = 0x10000;

   //定义三角形与正方形的缓冲
    private IntBuffer triagleBuffer;
    private IntBuffer quaBuffer;

   //三角形,正方形的顶点
    private int[] tri = new int[] {

0, one,0,

-one, -one, 0,

one, -one, 0

    };

    private int[] qua = new int[] {

one, one, 0,

-one, one, 0,

one, -one, 0,
        -one, -one, 0

     };

    // 三角形和正方形旋转的角度
    private float rotateTri;
    private float rotateQuad;

    @Override
    public void onDrawFrame(GL10 gl) {

        // 清除颜色和深度缓存
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        // 重置当前的模型观察矩阵
        gl.glLoadIdentity();

        //一句设置颜色
        gl.glColor4f(0.5f, 0.5f, 1.0f, 1.0f);

//定义三角形,正方形的directBuffer(直接缓冲)
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(tri.length * 4);
        byteBuffer.order(ByteOrder.nativeOrder());
        triagleBuffer = byteBuffer.asIntBuffer();
        triagleBuffer.put(tri);
        triagleBuffer.position(0);

        ByteBuffer byteBuffer2 = ByteBuffer.allocateDirect(qua.length * 4);
        byteBuffer2.order(ByteOrder.nativeOrder());
        quaBuffer = byteBuffer2.asIntBuffer();
        quaBuffer.put(qua);
        quaBuffer.position(0);

        // 清除颜色和深度缓存
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        // 重置当前的模型观察矩阵
        gl.glLoadIdentity();

        // 允许设置顶点
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        // 左移1.5并移入屏幕6.0
        gl.glTranslatef(-1.5f, 0.0f, -6.0f);
        // 旋转三角形
        gl.glRotatef(rotateTri, 0.0f, 1.0f, 0.0f);


        // 设置三角形
        gl.glVertexPointer(3, GL10.GL_FIXED, 0, triagleBuffer);
        // 绘制三角形
        gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);

        // 绘制三角形完成
        gl.glFinish();

        // 重置当前的模型观察矩阵
        gl.glLoadIdentity();

        // 右移1.5并移入屏幕6.0
        gl.glTranslatef(1.5f, 0.0f, -6.0f);
        // 旋转正方形
        gl.glRotatef(rotateQuad, 1.0f, 0.0f, 0.0f);

        // 设置正方形
        gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaBuffer);
        // 绘制正方形
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
        // 取消顶点设置
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

 

//每绘制一次,角度改变

        rotateQuad += 0.5f;
        rotateTri += 0.5f;

    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        float ratio = (float) width / height;
        // 设置OpenGL场景的大小
        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 config) {
        // 告诉系统对透视进行修正
        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);
    }
}

 

效果如下:

android opengl es  三角形、正方形自动旋转