Android OpenGL教程 三 3D随便画画

画个三棱椎需要四个点,画四个面

    private float[] mTriangleArray={
            -1.0f,-1.0f,0.0f,
            1.0f,-1.0f,0.0f,
            0.0f,1.0f,0.0f,
            0.0f,0.0f,1.0f
    };

    // 定义三棱椎的4个顶点的颜色
    private float[] mColor={
            1.0f,0.0f,0.0f,0.0f,
            0.0f,1.0f,0.0f,0.0f,
            0.0f,0.0f,1.0f,0.0f,
            1.0f,1.0f,0.0f,0.0f,
    };
    private byte[] cubeFacets = new byte[]{
            0, 1, 2,
            0, 2, 3,
            2, 1, 3,
            0, 1, 3
    };

        gl.glDrawElements(GL10.GL_TRIANGLE_STRIP
                , cubeFacetsBuffer.remaining(),
                GL10.GL_UNSIGNED_BYTE, cubeFacetsBuffer);

如果我们要画个正方形就要八个点画六个面,其他代码不变
// 定义三棱椎的4个顶点的颜色
private float[] mColor={
1.0f,0.0f,0.0f,0.0f,
1.0f,0.0f,0.0f,0.0f,
1.0f,0.0f,0.0f,0.0f,
1.0f,0.0f,0.0f,0.0f,
1.0f,0.0f,0.0f,0.0f,
1.0f,0.0f,0.0f,0.0f,
1.0f,0.0f,0.0f,0.0f,
1.0f,0.0f,0.0f,0.0f
};

    // 定义立方体的8个顶点
    float[] cubeVertices = new float[] {
            // 上顶面正方形的四个顶点
            0.5f, 0.5f, 0.5f,
            0.5f, -0.5f, 0.5f,
            -0.5f, -0.5f, 0.5f,
            -0.5f, 0.5f, 0.5f,
            // 下底面正方形的四个顶点
            0.5f, 0.5f, -0.5f,
            0.5f, -0.5f, -0.5f,
            -0.5f, -0.5f, -0.5f,
            -0.5f, 0.5f, -0.5f
    };
    // 定义立方体所需要的6个面(一共是12个三角形所需的顶点)
    private byte[] cubeFacets = new byte[]{
            0, 2, 1,
            0, 2, 3,
            2, 7, 3,
            2, 7, 6,
            0, 7, 3,
            0, 7, 4,
            4, 6, 5,
            4, 6, 7,
            1, 4, 0,
            1, 4, 5,
            1, 6, 2,
            1, 6, 5

    };

然后加个旋转方便看清楚全貌
gl.glRotatef(rotate, 1f, 0f, 0f);
rotate++;

完整代码如下

public class MainActivity extends Activity {
private GLSurfaceView mGLView;

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    mGLView = new GLSurfaceView(this); //这里使用的是自定义的GLSurfaceView的子类
    mGLView.setRenderer(new GLRenderer());
    setContentView(mGLView);
}

public void onPause(){
    super.onPause();
    mGLView.onPause();
}

public void onResume(){
    super.onResume();
    mGLView.onResume();
}

public class GLRenderer implements GLSurfaceView.Renderer {

    // 定义三棱椎的4个顶点的颜色
    private float[] mColor={
            1.0f,0.0f,0.0f,0.0f,
            1.0f,0.0f,0.0f,0.0f,
            1.0f,0.0f,0.0f,0.0f,
            1.0f,0.0f,0.0f,0.0f,
            1.0f,0.0f,0.0f,0.0f,
            1.0f,0.0f,0.0f,0.0f,
            1.0f,0.0f,0.0f,0.0f,
            1.0f,0.0f,0.0f,0.0f
    };

    // 定义立方体的8个顶点
    float[] cubeVertices = new float[] {
            // 上顶面正方形的四个顶点
            0.5f, 0.5f, 0.5f,
            0.5f, -0.5f, 0.5f,
            -0.5f, -0.5f, 0.5f,
            -0.5f, 0.5f, 0.5f,
            // 下底面正方形的四个顶点
            0.5f, 0.5f, -0.5f,
            0.5f, -0.5f, -0.5f,
            -0.5f, -0.5f, -0.5f,
            -0.5f, 0.5f, -0.5f
    };
    // 定义立方体所需要的6个面(一共是12个三角形所需的顶点)
    private byte[] cubeFacets = new byte[]{
            0, 2, 1,
            0, 2, 3,
            2, 7, 3,
            2, 7, 6,
            0, 7, 3,
            0, 7, 4,
            4, 6, 5,
            4, 6, 7,
            1, 4, 0,
            1, 4, 5,
            1, 6, 2,
            1, 6, 5

    };
    private FloatBuffer mTriangleBuffer;
    ByteBuffer cubeFacetsBuffer;
    FloatBuffer taperColorsBuffer;

    public GLRenderer() {

        mTriangleBuffer = floatBufferUtil(cubeVertices);
        // 将三棱椎的四个定点的颜色数组包装成IntBuffer
        taperColorsBuffer = floatBufferUtil(mColor);
        cubeFacetsBuffer = ByteBuffer.wrap(cubeFacets);

    }

    @Override
    public void onDrawFrame(GL10 gl) {

        // 清除屏幕和深度缓存
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

        // 设置当前矩阵模式为模型视图。
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        // 允许设置顶点
        //GL10.GL_VERTEX_ARRAY顶点数组
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        // 允许设置颜色
        //GL10.GL_COLOR_ARRAY颜色数组
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

        // 重置当前的模型观察矩阵
        gl.glLoadIdentity();
        //将三角形在z轴上移动
        gl.glTranslatef(0f, 0.0f, -2.0f);
        // 沿着X轴旋转
        gl.glRotatef(rotate, 1f, 0f, 0f);
        // 设置三角形
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mTriangleBuffer);
        // 设置顶点的颜色数据
        gl.glColorPointer(4, GL10.GL_FIXED, 0, taperColorsBuffer);
        // 绘制三角形
        gl.glDrawElements(GL10.GL_TRIANGLE_STRIP
                , cubeFacetsBuffer.remaining(),
                GL10.GL_UNSIGNED_BYTE, cubeFacetsBuffer);

        // 取消颜色设置
        gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
        // 取消顶点设置
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

        //绘制结束
        gl.glFinish();
        rotate++;

    }
    int rotate = 0;

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        float ratio = (float) width / height;
        // 设置OpenGL场景的大小,(0,0)表示窗口内部视口的左下角,(w,h)指定了视口的大小
        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.glClearColor(1, 1, 1, 1);

    }
}
// 定义一个工具方法,将float[]数组转换为OpenGL ES所需的FloatBuffer
private FloatBuffer floatBufferUtil(float[] arr)
{
    FloatBuffer mBuffer;
    // 初始化ByteBuffer,长度为arr数组的长度*4,因为一个int占4个字节
    ByteBuffer qbb = ByteBuffer.allocateDirect(arr.length * 4);
    // 数组排列用nativeOrder
    qbb.order(ByteOrder.nativeOrder());
    mBuffer = qbb.asFloatBuffer();
    mBuffer.put(arr);
    mBuffer.position(0);
    return mBuffer;
}

// 定义一个工具方法,将int[]数组转换为OpenGL ES所需的IntBuffer
private IntBuffer intBufferUtil(int[] arr)
{
    IntBuffer mBuffer;
    // 初始化ByteBuffer,长度为arr数组的长度*4,因为一个int占4个字节
    ByteBuffer qbb = ByteBuffer.allocateDirect(arr.length * 4);
    // 数组排列用nativeOrder
    qbb.order(ByteOrder.nativeOrder());
    mBuffer = qbb.asIntBuffer();
    mBuffer.put(arr);
    mBuffer.position(0);
    return mBuffer;
}

}

原文地址:http://blog.51cto.com/13591594/2067005

时间: 2024-10-18 09:28:57

Android OpenGL教程 三 3D随便画画的相关文章

Android OpenGL教程 二 2D形状画画

首先画个三角形 private float[] mTriangleArray={ 0.0f,1.0f,0.0f, 1.0f,-1.0f,0.0f, -1.0f,-1.0f,0.0f }; gl.glDrawArrays(GL10.GL_TRIANGLES, 0, mTriangleArray.length/3); 然后画个两个三角形拼成一个正方形,把之前的坐标换一下就好了 private float[] mTriangleArray={ 1.0f,1.0f,0.0f, 1.0f,-1.0f,0.

Android OpenGL ES(三)----编程框架

首先当然是创建Android项目,你可以选择最新的Android Studio也可以选择eclipse都是一样的.我们重点讲解开发OpenGL ES的流程 1.定义顶点着色器和片段着色器 第一节我们讲解的已经很细致了,为了便于理解在这里在详细的说明一下.并且换一种方式定义着色器. 我们知道第一篇定义的顶点的坐标和颜色是分开的,这样可以但如果把它们放在一起会方便许多. 假设我们要绘制一个长方形和两条直线,二个定点,我们就需要这样来定义这个数组. float[] tableVerticesWithT

Android自定义控件系列三:如何画画

前面章节我们说了如何定义属性.如何定义宽高,这样之后组件的简单外形或轮廓就已经出来,或者说已经定义出了画布的大小,解下来就是如何在画布上挥毫泼墨了. 组件(除了容器组件)实际上都是靠画出来的,通过系统提供的画笔(Paint)以及基本图形(圆.矩形.直线等)就可以完整的勾画出一个组件.下面就详细介绍如何画以及一些技巧: 如何获取颜色 一般情况下,要实现啥样的组件,是由美工设计出效果图,或者是网上找的些图片样式,这样就需要将效果图上的颜色抠下来,否则,你想通过肉眼就能知道这个颜色的编码是啥,那只有悟

Android OpenGL ES 开发教程 从入门到精通

From:http://blog.csdn.net/mapdigit/article/details/7526556 Android OpenGL ES 简明开发教程 Android OpenGL ES 简明开发教程一:概述 Android OpenGL ES 简明开发教程二:构造OpenGL ES View Android OpenGL ES 简明开发教程三:3D绘图基本概念 Android OpenGL ES 简明开发教程四:3D 坐标变换 Android OpenGL ES 简明开发教程五

[转]Android OpenGL ES 开发教程 从入门到精通

本文转自:http://blog.csdn.net/mapdigit/article/details/7526556 Android OpenGL ES 简明开发教程 Android OpenGL ES 简明开发教程一:概述 Android OpenGL ES 简明开发教程二:构造OpenGL ES View Android OpenGL ES 简明开发教程三:3D绘图基本概念 Android OpenGL ES 简明开发教程四:3D 坐标变换 Android OpenGL ES 简明开发教程五

Android OpenGL ES零基础系列(三):OpenGL ES的渲染管道及VertexShader与FragmentShader

前言 在前2篇文章中,我们都说到着色器,且在第二篇中正式说到,这着色器只能用在OpenGL ES2.x等可编程管道里面,而在OpenGL ES1.x是不能用的.但我们一直没有说这是为什么,两者有什么区别.那这篇我们就一起来学习下OpenGL ES中的渲染管道. 正文 管道,英文名叫Pipeline,相信用过FaceBook图片加载库的同学对这个管道并不陌生,因为SimpleImageDrawee里面也是用的管道来对图片进行的一个处理.由于其底层也是C,因此我可以大胆的猜想,FaceBook图片加

NeHe OpenGL教程 第三十八课:资源文件

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十八课:资源文件 从资源文件中载入图像: 如何把图像数据保存到*.exe程序中,使用Windows的资源文件吧,它既简单又实用. 欢迎来到NeHe教程第38课.离上节课的写作已经有些时日了,加上写了一整天的code,也许笔头已经

NeHe OpenGL教程 第四十四课:3D光晕

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第四十四课:3D光晕 3D 光晕 当镜头对准太阳的时候就会出现这种效果,模拟它非常的简单,一点数学和纹理贴图就够了.好好看看吧. 大家好,欢迎来到新的一课,在这一课中我们将扩展glCamera类,来实现镜头光晕的效果.在日常生活中,

NeHe OpenGL教程 第三十六课:从渲染到纹理

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十六课:从渲染到纹理 放射模糊和渲染到纹理: 如何实现放射状的滤镜效果呢,看上去很难,其实很简单.把渲染得图像作为纹理提取出来,在利用OpenGL本身自带的纹理过滤,就能实现这种效果,不信,你试试. 嗨,我是Dario Corn