Android OpenGL ES(十一)绘制一个20面体 .
前面介绍了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面体 .相关推荐
- Android OpenGL ES(十一):绘制一个20面体
前面介绍了OpenGL ES所有能够绘制的基本图形,点,线段和三角形.其它所有复杂的2D或3D图形都是由这些基本图形构成. 本例介绍如何使用三角形构造一个正20面体.一个正20面体,有12个顶点,20 ...
- android opengl把经纬度点用红色点显示在3d地球上,android OpenGL ES 地球仪绘制——球体绘制及纹理映射——源码...
[实例简介] 支持如下: (1)opengl es绘制三角形拼成球体 (2)图片作为纹理映射到整个球面上 (3)双点触控缩放球体 (4)拖动旋转球体 [实例截图] [核心代码] OpenGLESTut ...
- Android OpenGL ES 学习(十一) –渲染YUV视频以及视频抖音特效
OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...
- Android OpenGL ES 开发教程(20):颜色Color
OpenGL ES 支持的颜色格式为RGBA模式(红,绿,蓝,透明度).颜色的定义通常使用Hex格式0xFF00FF 或十进制格式(255,0,255), 在OpenGL 中却是使用0-1之间的浮点数 ...
- Android使用NDK OpenGL ES3.0绘制一个三角形
Android使用NDK OpenGL ES3.0绘制一个三角形 [尊重原创,转载请注明出处]https://blog.csdn.net/guyuealian/article/details/820 ...
- 使用Android OpenGL ES 2.0绘图之一:搭建一个OpenGL ES环境
传送门☞Android兵器谱☞转载请注明☞http://blog.csdn.net/leverage_1229 传送门☞系统架构设计☞转载请注明☞http://blog.csdn.net/levera ...
- OpenGl文章
Android OpenGL ES 简明开发教程
Android OpenGL ES 简明开发教程 分类:android学习笔记2011-12-14 15:04375人阅读评论(0)收藏举报 ApiDemos 的Graphics示例中含有OpenGL ...
- OpenGL ES之三——绘制纯色背景
概述 这是一个系列的Android平台下OpenGl ES介绍,从最基本的使用最终到VR图的展示的实现,属于基础篇.(后面针对VR视频会再有几篇文章,属于进阶篇) OpenGL ES之一--概念扫盲 ...
- Android OpenGL ES 从入门到精通系统性学习教程
1 为什么要写这个教程 目前这个 OpenGL ES 极简教程的更新暂时告一段落,在此之前,很荣幸获得了阮一峰老师的推荐. 因为在工作中频繁使用 OpenGL ES 做一些特效.滤镜之类的效果,加上平 ...
最新文章
- 【JavaScript框架封装】公共框架的封装
- Taro -- 微信小程序登录
- discuz(dz) SSO(单点,同歩,异步)登录 --转
- bat常用命令操作符列表
- VS2017断点调试
- Nexys4DDR+OV7670实现sobel算子边缘检测系统
- sqlserver操作geography方法
- Ubuntu被曝严重漏洞:切换系统语言+输入几行命令,就能获取root权限(仅支持ubuntu桌面版、提权)
- All Of ACM
- 2017.9.5 能量采集 思考记录
- 游戏开发--开源软件13--libgdx(Android)||Angle(android 2D...
- 手把手教你学DSP 28335学习笔记
- php 不恒等,php运算符==怎么使用以及与===恒等的区别是什么?
- 火狐浏览器怎么支持html5,支持HTML5/CSS技术火狐浏览器8
- 广州市车联网先导区建设总体技术规范
- 超全整理——相机标定知识汇总
- win7添加打印机提示没有权限访问网络资源 网络不可用
- 用photoshop做电影胶片效果
- 在日本转职需要到入管办理转职手续
- 2022年第一个技能:视频剪辑学习笔记
热门文章
- java 捕获异常并存入数据库_java异常处理,报异常的话怎么处理对象值,并持久化到数据库中...
- Python 中的魔术方法(双下划线开头和结尾的方法)
- 数据结构(01)— 算法复杂度概念及常见的复杂度计算
- 正则表达式中?=和?:和?!的理解
- LeetCode简单题之数组的度
- 特征提取,转换和选择
- 卷积神经网络(CNN,ConvNet)
- 色彩(颜色)空间原理(上)
- 目标识别的选择性搜索
- 2021年大数据Hadoop(二十九):​​​​​​​关于YARN常用参数设置