前面介绍了OpenGL ES所有能够绘制的基本图形,点,线段和三角形。其它所有复杂的2D或3D图形都是由这些基本图形构成。

本例介绍如何使用三角形构造一个正20面体。一个正20面体,有12个顶点,20个面,30条边构成:

创建一个DrawIcosahedron Activity, 定义20面体的12个顶点,和20个面如下:

static final float X=.525731112119133606f;
static final float Z=.850650808352039932f;static float vertices[] = new float[]{-X, 0.0f, Z, X, 0.0f, Z, -X, 0.0f, -Z, X, 0.0f, -Z,0.0f, Z, X, 0.0f, Z, -X, 0.0f, -Z, X, 0.0f, -Z, -X,Z, X, 0.0f, -Z, X, 0.0f, Z, -X, 0.0f, -Z, -X, 0.0f};static short indices[] = new short[]{0,4,1, 0,9,4, 9,5,4, 4,5,8, 4,8,1,8,10,1, 8,3,10, 5,3,8, 5,2,3, 2,7,3,7,10,3, 7,6,10, 7,11,6, 11,0,6, 0,1,6,6,1,10, 9,0,11, 9,11,2, 9,2,5, 7,2,11 };

OpenGL ES缺省使用同一种颜色来绘制图形,为了能够更好的显示3D效果,我们为每个顶点随机定义一些颜色如下:

float[] colors = {0f, 0f, 0f, 1f,0f, 0f, 1f, 1f,0f, 1f, 0f, 1f,0f, 1f, 1f, 1f,1f, 0f, 0f, 1f,1f, 0f, 1f, 1f,1f, 1f, 0f, 1f,1f, 1f, 1f, 1f,1f, 0f, 0f, 1f,0f, 1f, 0f, 1f,0f, 0f, 1f, 1f,1f, 0f, 1f, 1f};

将顶点,面,颜色存放到Buffer中以提高性能:

private FloatBuffer vertexBuffer;private FloatBuffer colorBuffer;private ShortBuffer indexBuffer;ByteBuffer vbb
= ByteBuffer.allocateDirect(vertices.length * 4);
vbb.order(ByteOrder.nativeOrder());
vertexBuffer = vbb.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position(0);ByteBuffer cbb
= ByteBuffer.allocateDirect(colors.length * 4);
cbb.order(ByteOrder.nativeOrder());
colorBuffer = cbb.asFloatBuffer();
colorBuffer.put(colors);
colorBuffer.position(0);ByteBuffer ibb
= ByteBuffer.allocateDirect(indices.length * 2);
ibb.order(ByteOrder.nativeOrder());
indexBuffer = ibb.asShortBuffer();
indexBuffer.put(indices);
indexBuffer.position(0);

看一看DrawScene代码:

public void DrawScene(GL10 gl) {super.DrawScene(gl);gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);gl.glLoadIdentity();gl.glTranslatef(0, 0, -4);gl.glRotatef(angle, 0, 1, 0);gl.glFrontFace(GL10.GL_CCW);gl.glEnable(GL10.GL_CULL_FACE);gl.glCullFace(GL10.GL_BACK);gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);gl.glEnableClientState(GL10.GL_COLOR_ARRAY);gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer);gl.glDrawElements(GL10.GL_TRIANGLES, indices.length,GL10.GL_UNSIGNED_SHORT, indexBuffer);gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);gl.glDisable(GL10.GL_CULL_FACE);angle++;}

用来绘制20面体使用了gl.glDrawElements:

public abstract void glDrawElements(int mode, int count, int type, Buffer indices) ,可以重新定义顶点的顺序,顶点的顺序由indices Buffer 指定。

本例会显示一个绕Y轴不断旋转的20面体,如何旋转模型将在后面的坐标系统和坐标变换中介绍.

完整代码:

MainActiviy.java

package com.example.gltest;import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.ShortBuffer;import javax.microedition.khronos.opengles.GL10;import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.Window;
import android.view.WindowManager;public class MainActivity extends Activityimplements IOpenGLDemo{private FloatBuffer vertexBuffer;private FloatBuffer colorBuffer;private ShortBuffer indexBuffer;private GLSurfaceView mGLSurfaceView;static final float X=.525731112119133606f;static final float Z=.850650808352039932f;static float vertices[] = new float[]{-X, 0.0f, Z, X, 0.0f, Z, -X, 0.0f, -Z, X, 0.0f, -Z,0.0f, Z, X, 0.0f, Z, -X, 0.0f, -Z, X, 0.0f, -Z, -X,Z, X, 0.0f, -Z, X, 0.0f, Z, -X, 0.0f, -Z, -X, 0.0f};static short indices[] = new short[]{0,4,1, 0,9,4, 9,5,4, 4,5,8, 4,8,1,8,10,1, 8,3,10, 5,3,8, 5,2,3, 2,7,3,7,10,3, 7,6,10, 7,11,6, 11,0,6, 0,1,6,6,1,10, 9,0,11, 9,11,2, 9,2,5, 7,2,11 };float[] colors = {0f, 0f, 0f, 1f,0f, 0f, 1f, 1f,0f, 1f, 0f, 1f,0f, 1f, 1f, 1f,1f, 0f, 0f, 1f,1f, 0f, 1f, 1f,1f, 1f, 0f, 1f,1f, 1f, 1f, 1f,1f, 0f, 0f, 1f,0f, 1f, 0f, 1f,0f, 0f, 1f, 1f,1f, 0f, 1f, 1f};/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);vbb.order(ByteOrder.nativeOrder());vertexBuffer = vbb.asFloatBuffer();vertexBuffer.put(vertices);vertexBuffer.position(0);ByteBuffer cbb= ByteBuffer.allocateDirect(colors.length * 4);cbb.order(ByteOrder.nativeOrder());colorBuffer = cbb.asFloatBuffer();colorBuffer.put(colors);colorBuffer.position(0);ByteBuffer ibb= ByteBuffer.allocateDirect(indices.length * 2);ibb.order(ByteOrder.nativeOrder());indexBuffer = ibb.asShortBuffer();indexBuffer.put(indices);indexBuffer.position(0);this.requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);mGLSurfaceView = new GLSurfaceView(this);mGLSurfaceView.setRenderer(new OpenGLRenderer(this));setContentView(mGLSurfaceView);}//        public void DrawScene(GL10 gl) {
//            gl.glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
//            // Clears the screen and depth buffer.
//            gl.glClear(GL10.GL_COLOR_BUFFER_BIT
//              | GL10.GL_DEPTH_BUFFER_BIT);
//
//        }public void DrawScene(GL10 gl) {// super.DrawScene(gl);
             gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);gl.glLoadIdentity();gl.glTranslatef(0, 0, -4);float angle=0;gl.glRotatef(angle, 0, 1, 0);gl.glFrontFace(GL10.GL_CCW);gl.glEnable(GL10.GL_CULL_FACE);gl.glCullFace(GL10.GL_BACK);gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);gl.glEnableClientState(GL10.GL_COLOR_ARRAY);gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer);gl.glDrawElements(GL10.GL_TRIANGLES, indices.length,GL10.GL_UNSIGNED_SHORT, indexBuffer);gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);gl.glDisable(GL10.GL_CULL_FACE);angle++;}@Overrideprotected void onResume() {// Ideally a game should implement// onResume() and onPause()// to take appropriate action when the//activity looses focus
            super.onResume();mGLSurfaceView.onResume();}@Overrideprotected void onPause() {// Ideally a game should implement onResume()//and onPause()// to take appropriate action when the//activity looses focus
            super.onPause();mGLSurfaceView.onPause();}}

其他类似。

转载于:https://www.cnblogs.com/Anita9002/p/4452612.html

Android OpenGL ES(十一)绘制一个20面体 .相关推荐

  1. Android OpenGL ES(十一):绘制一个20面体

    前面介绍了OpenGL ES所有能够绘制的基本图形,点,线段和三角形.其它所有复杂的2D或3D图形都是由这些基本图形构成. 本例介绍如何使用三角形构造一个正20面体.一个正20面体,有12个顶点,20 ...

  2. android opengl把经纬度点用红色点显示在3d地球上,android OpenGL ES 地球仪绘制——球体绘制及纹理映射——源码...

    [实例简介] 支持如下: (1)opengl es绘制三角形拼成球体 (2)图片作为纹理映射到整个球面上 (3)双点触控缩放球体 (4)拖动旋转球体 [实例截图] [核心代码] OpenGLESTut ...

  3. Android OpenGL ES 学习(十一) –渲染YUV视频以及视频抖音特效

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  4. Android OpenGL ES 开发教程(20):颜色Color

    OpenGL ES 支持的颜色格式为RGBA模式(红,绿,蓝,透明度).颜色的定义通常使用Hex格式0xFF00FF 或十进制格式(255,0,255), 在OpenGL 中却是使用0-1之间的浮点数 ...

  5. Android使用NDK OpenGL ES3.0绘制一个三角形

    Android使用NDK  OpenGL ES3.0绘制一个三角形 [尊重原创,转载请注明出处]https://blog.csdn.net/guyuealian/article/details/820 ...

  6. 使用Android OpenGL ES 2.0绘图之一:搭建一个OpenGL ES环境

    传送门☞Android兵器谱☞转载请注明☞http://blog.csdn.net/leverage_1229 传送门☞系统架构设计☞转载请注明☞http://blog.csdn.net/levera ...

  7. OpenGl文章 Android OpenGL ES 简明开发教程

    Android OpenGL ES 简明开发教程 分类:android学习笔记2011-12-14 15:04375人阅读评论(0)收藏举报 ApiDemos 的Graphics示例中含有OpenGL ...

  8. OpenGL ES之三——绘制纯色背景

    概述 这是一个系列的Android平台下OpenGl ES介绍,从最基本的使用最终到VR图的展示的实现,属于基础篇.(后面针对VR视频会再有几篇文章,属于进阶篇) OpenGL ES之一--概念扫盲 ...

  9. Android OpenGL ES 从入门到精通系统性学习教程

    1 为什么要写这个教程 目前这个 OpenGL ES 极简教程的更新暂时告一段落,在此之前,很荣幸获得了阮一峰老师的推荐. 因为在工作中频繁使用 OpenGL ES 做一些特效.滤镜之类的效果,加上平 ...

最新文章

  1. 【JavaScript框架封装】公共框架的封装
  2. Taro -- 微信小程序登录
  3. discuz(dz) SSO(单点,同歩,异步)登录 --转
  4. bat常用命令操作符列表
  5. VS2017断点调试
  6. Nexys4DDR+OV7670实现sobel算子边缘检测系统
  7. sqlserver操作geography方法
  8. Ubuntu被曝严重漏洞:切换系统语言+输入几行命令,就能获取root权限(仅支持ubuntu桌面版、提权)
  9. All Of ACM
  10. 2017.9.5 能量采集 思考记录
  11. 游戏开发--开源软件13--libgdx(Android)||Angle(android 2D...
  12. 手把手教你学DSP 28335学习笔记
  13. php 不恒等,php运算符==怎么使用以及与===恒等的区别是什么?
  14. 火狐浏览器怎么支持html5,支持HTML5/CSS技术火狐浏览器8
  15. 广州市车联网先导区建设总体技术规范
  16. 超全整理——相机标定知识汇总
  17. win7添加打印机提示没有权限访问网络资源 网络不可用
  18. 用photoshop做电影胶片效果
  19. 在日本转职需要到入管办理转职手续
  20. 2022年第一个技能:视频剪辑学习笔记

热门文章

  1. java 捕获异常并存入数据库_java异常处理,报异常的话怎么处理对象值,并持久化到数据库中...
  2. Python 中的魔术方法(双下划线开头和结尾的方法)
  3. 数据结构(01)— 算法复杂度概念及常见的复杂度计算
  4. 正则表达式中?=和?:和?!的理解
  5. LeetCode简单题之数组的度
  6. 特征提取,转换和选择
  7. 卷积神经网络(CNN,ConvNet)
  8. 色彩(颜色)空间原理(上)
  9. 目标识别的选择性搜索
  10. 2021年大数据Hadoop(二十九):​​​​​​​关于YARN常用参数设置