关于几何图形的描述:
文章的代码是程序在程序的代码中找的到。
3D模型由一些更小的元素(点,线,面, 多边形)组成。
(1)顶点(Vertex)
在android中,我们需要定义一个浮点型的数组来保存顶点位置,并且这个浮点型数组转换位数组(这样可以提高性能)。
//四边形的顶点坐标,这四个顶点按照 0,1,2,3的次序来排列,次序为了画图用,在第三部分讲解画几何图形的时候,会用到这个次序
private float vertices[] = {
-1.0f, 1.0f, 0.0f, // 0, Top Left
-1.0f, -1.0f, 0.0f, // 1, Bottom Left
1.0f, -1.0f, 0.0f, // 2, Bottom Right
1.0f, 1.0f, 0.0f, // 3, Top Right
}
//将顶点浮点型数组转换为位数组
private FloatBuffer vertexBuffer;
ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4);
byteBuf.order(ByteOrder.nativeOrder());
vertexBuffer = byteBuf.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position(0);
/* Opengl ES 有一些提供渲染的功能,这些功能大部分情况下,不能使用,如果你想使用,
* 你必须记得打开这些函数功能,你也可能需要告诉这些功能需要和什么对象配合使用。
* 下面的两行代码的意思是,在渲染过程中,能写或者使用顶点数组,并且指明这些顶点数组的位置。
*/
//指明这些顶点数组的位置
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
//能写和使用顶点数组
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
(2)面(Face)
Face是一个三角形,也就是三个点和三个边围起来的面积。
设置Face的旋转方向是很重要的,因为选择不同的旋转方向意味这选择那一面为前面,那一面为后面。为什么这是重要的那?因为在一个由完全不透明的表面组成的场景中,多边形的后面部分是绝不可能看到的,有时候为了提升性能,需要只描绘正面,而后面的图形就省略部描绘,可以通过为函数 glEnable(GL_CULL_FACE) 和 glDisable(GL_CULL_FACE)来决定是否省略描绘后面部分的图形。可以通过函数glFrontFace来改变方向从而决定多边形的那一面为正面。
glFrontFace: 常量参数GL_CCW表示逆时针,GL_CW表示顺时针。默认情况下,逆时针的多边形坐标顺序是多边形是正面。例如对于三角形:
vertices[] ={
0, 1, 0,
-1, -1, 0,
1, -1, 0
}
如果添加glEnable(GL_CULL_FACE)功能,逆时针可以正常显示图形,顺时针无法显示图形。
glCullFace:函数决定绘制多边形的背面还是正面。
(3)多变形(Polygon)
在前面已经介绍了四边行的四个顶点,次序也在数组vertices中排列好了,即第一个顶点的序号为0({-1.0f, 1.0f, 0.0f}),第二个顶点序号为1({-1.0f, -1.0f, 0.0f})等。
现在说如何画这个四边型,前面已经设定Face的旋转为逆时针,数组vertices组成的是一个四边型,四边型由两个Face(也就是三角形)组成,按照逆时针画两个三角形,即组成一个四边行,第一个三角形的顶点顺序为 0、1、2,即vertices中的前三个顶点组成的三角形, 0、2、3 三个顶点按照逆时针的顺序组成第二个三角形。这个过程组成了一个顺序数组如下:
private short[] indices = { 0, 1, 2, 0, 2, 3 };
为了提高性能,将数组转换为位数组,代码如下:
// short is 2 bytes, therefore we multiply the number if vertices with 2.
ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2);
ibb.order(ByteOrder.nativeOrder());
ShortBuffer indexBuffer = bb.asShortBuffer();
indexBuffer.put(indices);
indexBuffer.position(0);
(4)渲染(Render)
函数glDrawArrays和glDrawElements用来将上面的设置画在屏幕上。这两个函数的有一个相同的参数mode,接受GL_POINTS、GL_LINE_STRIP、GL_LINE_LOOP、GL_LINES、GL_TRIANGLES等常量。下面简单介绍一个常量的意思,
GL_POINTS:表示只画顶点;
GL_LINE_STRIP:从第一个顶点画到最后一个点;
GL_LINE_LOOP:和GL_LINE_STRIP相似,只是最后一点和第一个点链接,形成一个环路;
GL_LINES:每两个点画一条直线;
GL_TRIANGLES: 没三个点为一组画成一个个的三角形;
GL_TRIANGLE_STRIP:按一定的顺序画一系列三角形如按照顶点v0, v1, v2, 然后 v2, v1, v3 (注意顺序), 最后 v2, v3, v4 ,确定这些三角形能正确的形成一个多边形;
GL_TRIANGLE_FAN: 相似GL_TRIANGLE_STRIP,但是顺序是v0, v1, v2, 然后 v0, v2, v3, 最后 v0, v3, v4, 注意和GL_TRIANGLE_STRIP顺序区别;
public abstract void glDrawArrays(int mode, int first, int count):按照前面verticesBuffer数组的顶点来画图形。
public abstract void glDrawElements(int mode, int count, int type, Buffer indices):需要知道顶点的顺序,才能画图行。在第三部分关于多边形的内容中,指定了顶点的顺序。type类型的含义是指明indices数组的类型,比如GL10.GL_UNSIGNED_SHORT,表示indices是short类型的数组。
参考的网站:
http://insanitydesign.com/wp/projects/nehe-android-ports/
分享到:
相关推荐
在本篇“Android OpenGL 学习笔记(一)”中,我们将探讨如何在Android平台上使用OpenGL ES进行图形渲染。OpenGL ES是OpenGL的一个轻量级版本,专为嵌入式系统设计,包括移动设备如智能手机和平板电脑。这篇笔记将...
package ljh.opengl;是对OpenglES的一些封装。 package ljh.game;是对一些游戏常用的代码的封装 都没写完! 最近改学IOS了 看看什么时候能补充完。
这本书籍“Android 3D游戏开发技术宝典 OpenGL ES2.0学习”深入浅出地介绍了如何利用OpenGL ES 2.0在Android上构建高性能、视觉震撼的游戏和应用程序。 首先,OpenGL ES 2.0相比其前代1.0,引入了重要的变化,最...
### Android开发学习笔记知识点梳理 #### 一、Android概述与架构 - **定义与发布**:Android是由Google在2007年11月5日宣布的基于Linux平台的开源手机操作系统。它不仅用于智能手机,还广泛应用于平板电脑、可穿戴...
本篇学习笔记主要涵盖了ArcGIS for Android的基础配置和核心组件MapVie的使用。 首先,配置ArcGIS for Android项目需要在`Project`级别的`build.gradle`文件中添加Esri的仓库,确保能获取到所需的库。接着,在`...
Android OpenGL ES学习笔记之绘制一个立方体-附件资源
【Android学习笔记】 Android是一种基于Linux内核的开源操作系统,主要应用于移动设备,如智能手机和平板电脑。这个“很好的android学习笔记”包含了作者在学习Android开发过程中积累的宝贵经验,旨在帮助初学者或...
根据提供的文件内容,这是一份详细的Android学习笔记,涵盖了从基础入门到高级特性的各个知识点。以下是从这些内容中提取的知识点: 1. Android入门基础: - 建立第一个App:介绍如何创建Android项目和执行程序。 ...
### Android学习笔记(入门必看) #### 一、Android简介 **Android** 是一个开源的操作系统,主要用于智能手机和平板电脑等移动设备。它由Google公司维护,并基于Linux内核进行开发。Android平台不仅包括操作系统...
这篇学习笔记将深入探讨这两个概念及其在实际应用中的使用。 首先,Canvas可以理解为画布,它是Android系统提供的用于在屏幕上绘制图形的对象。在Android中,我们可以通过Canvas来绘制各种形状,如线条、矩形、圆、...
在Android系统相关学习笔记中,我们可以深入探讨这个广泛而复杂的移动操作系统的核心概念和技术。Android以其开源性和灵活性,吸引了大量的开发者和爱好者。以下是一些关键的知识点: 1. **Android架构**:Android...