第二课 你的第一个多边形:
添加一个三角形和一个四边形。也许你认为这很简单,但你已经迈出了一大步,要知道任何在OpenGL中绘制的模型都会被分解为这两种简单的图形。
其他类不变,只更改OpenGLRenderer类。
首先,我们画一个三角形
主要是在OnDrawFrame里面画,使用的函数是
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
或者
gl.glDrawElements(GL10.GL_TRIANGLES,3,GL10.GL_FLOAT, mIndexBuffer);
我们先使用drawArray,drawElement里面要多用一个indexBuffer。
第一步,定义个array
private float[] mTriangleArray = {
0f,1f,0f,
-1f,-1f,0f,
1f,-1f,0f
};
private float[] mTriangleArray = { 0f,1f,0f, -1f,-1f,0f, 1f,-1f,0f };
这里实际上是定义了三角形的三个顶点,三个数分别是x,y,z的坐标,和数学里直角坐标系相同
0f,1f,0f 是上顶点
-1f,-1f,0f 是左下顶点
1f,-1f,0f 是右下顶点
定义个FloatBuffer,这是android画三角形必须的结构
private FloatBuffer mTriangleBuffer;
来一个函数转换array到Buffer
我们直接上一个工具类
public class BufferUtil {
public static FloatBuffer mBuffer;
public static FloatBuffer floatToBuffer(float[] a){
//先初始化buffer,数组的长度*4,因为一个float占4个字节
ByteBuffer mbb = ByteBuffer.allocateDirect(a.length*4);
//数组排序用nativeOrder
mbb.order(ByteOrder.nativeOrder());
mBuffer = mbb.asFloatBuffer();
mBuffer.put(a);
mBuffer.position(0);
return mBuffer;
}
}
注意:这里有个排序的问题,是使用大端(BIG_ENDIAN)还是用小端(LITTLE_ENDIAN),
在android里面,opengl画图must use native order direct buffer,
否则报错为ERROR/AndroidRuntime(6897): java.lang.IllegalArgumentException: Must use a native order direct Buffer这个错误在android1.6以上会出现,在1.5上不会出现。
这里我们直接使用allocateDirect和nativeOrder,就能满足android的要求
第二步:
在SurfaceCreate里面构建这个Buffer
mTriangleBuffer = BufferUtil.floatToBuffer(mTriangleArray);
第三步:
在OndrawFrame里面画三角形
gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
//三角形的颜色为红色,透明度为不透明
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mTriangleBuffer);
//设置顶点,第一个参数是坐标的维数,这里是3维,第二个参数,表示buffer里面放的是float,第三个参数是0,是因为我们的坐标在数组中是紧凑的排列的,没有使用offset,最后的参数放的是存放顶点坐标的buffer
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
//画数组,第一个参数表示画三角形,第二个参数是first,第三个参数是count,表示在buffer里面的坐标的开始和个数
运行,会看到一个大三角形
下面,我们来变换坐标轴,画个小三角形,原理就是把坐标轴向远拉,意思就是让镜头向后拉,这样三角形就小了。
第一步:
在OnSurfaceChanged里面加入下面几行代码
float ratio = (float) width / height;
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
这几行为透视图设置屏幕。意味着越远的东西看起来越小。这么做创建了一个现实外观的场景。此处透视按照基于窗口宽度和高度的45度视角来计算。0.1f,100.0f是我们在场景中所能绘制深度的起点和终点。
gl.glMatrixMode(GL10.GL_PROJECTION);
指明接下来的两行代码将影响projection matrix(投影矩阵)。投影矩阵负责为我们的场景增加透视。 glLoadIdentity()近似于重置。它将所选的矩阵状态恢复成其原始状态。调用 glLoadIdentity()之后我们为场景设置透视图。
glMatrixMode(GL_MODELVIEW)指明任何新的变换将会影响 modelview matrix(模型观察矩阵)。模型观察矩阵中存放了我们的物体讯息。最后我们重置模型观察矩阵。如果您还不能理解这些术语的含义,请别着急。在以后的教程里,我会向大家解释。只要知道如果您想获得一个精彩的透视场景的话,必须这么做。
在OndrawFrame里面增加代码如下:
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glTranslatef(-1.5f, 0.0f, -6.0f);
当您调用glLoadIdentity()之后,您实际上将当前点移到了屏幕中心,X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。中心左面的坐标值是负值,右面是正值。移向屏幕顶端是正值,移向屏幕底端是负值。移入屏幕深处是负值,移出屏幕则是正值。
glTranslatef(x, y, z)沿着 X, Y 和 Z 轴移动。根据前面的次序,下面的代码沿着X轴左移1.5个单位,Y轴不动(0.0f),最后移入屏幕6.0f个单位。注意在glTranslatef(x, y, z)中当您移动的时候,您并不是相对屏幕中心移动,而是相对与当前所在的屏幕位置。
这时候就能画出个小三角形了。
下面,我们来画一个四边形
四边形的顶点数组为:
private float[] mQuadsArray = {
1f,1f,0f, //右上
-1f,1f,0f, //左上
-1f,-1f,0f, //左下
1f,-1f,0f //右下
};
//从这里可以看出,我们按照逆时针的方向画图
private FloatBuffer mQuadsBuffer;
private float[] mQuadsArray = {
1f,1f,0f, //右上
-1f,1f,0f, //左上
-1f,-1f,0f, //左下
1f,-1f,0f //右下 };
//从这里可以看出,我们按照逆时针的方向画图
private FloatBuffer mQuadsBuffer;
在OnDrawFrame里面添加代码
gl.glLoadIdentity();
//坐标向右移1.5个单位
gl.glTranslatef(1.5f, 0.0f, -6.0f);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mQuadsBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 4);
//画四边形
第一个参数是绘图模式,而且你现在看到两种可能的OpenGL绘图方式。 我想花时间来讨论现在不同的绘图模式。
它们是:
GL_POINTS
GL_LINES
GL_LINE_LOOP
GL_LINE_STRIP
GL_TRIANGLES
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN
我们还没有讨论点或线,所以我只介绍最后的三个 。在我开始之前,我要提醒你,顶点数组可能包含不止一个三角形,以便当您只看到一个物体顶点数组,你要知道,不仅限于这一点。
GL_TRIANGLES - 这个参数意味着OpenGL使用三个顶点来组成图形。所以,在开始的三个顶点,将用顶点1,顶点2,顶点3来组成一个三角形。完成后,在用下一组的三个顶点来组成三角形,直到数组结束。
GL_TRIANGLE_STRIP - OpenGL的使用将最开始的两个顶点出发,然后遍历每个顶点,这些顶点将使用前2个顶点一起组成一个三角形。所以第三个点与第一个,第二个生成一个三角形。第四个点将于第二个,第三个生成三角形。
也就是说,0,1,2这三个点组成一个三角形,1,2,3这三个点也组成一个三角形。
GL_TRIANGLE_FAN - 在跳过开始的2个顶点,然后遍历每个顶点,让OpenGL将这些顶点于它们前一个,以及数组的第一个顶点一起组成一个三角形。 第3个点将与 第二个点(前一个)和第一个点(第一个).生成一个三角形。
也就是说,同样是0,1,2,3这4个顶点。
在STRIP状态下是,0,1,2;1,2,3这2个三角形。
在FAN状态下是,0,1,2;0,2,3这2个三角形。
这次我们将使用 GL_TRIANGLE_FAN ,我们将在显示区域获得一个矩形。
分享到:
相关推荐
Android面试.exe lession1_view.exe lession2_布局.exe lession2_线性布局.exe lession2_雨滴.exe lession3_按钮.exe lession3_图片.exe lession3_图片2.exe ...... lession15_手机端离线聊天.exe lession15_手机端...
Lession2-week1.zip
小费计算器应用演示 这是小费计算器的第二个安卓应用程序。 花费时间:总共花费4小时 完成的用户故事: 用户显示指定输入金额的指定百分比的小费 用户输入交易总额 用户可以选择小费金额(即 10%、15%、20%) ...
Lession03.sql
union2 Casptain Cook lession5-6 .docx
react-native-android-lession > 老穆记录: react native andorid 关于iOS部分可以参考vczero的lession文章 > React-Native 是Android端实现实现动态部署的另一种思路,绕过dexLoad【一些现有的Android插件框架...
2. **Direct3D** - Direct3D是DirectX中的关键部分,用于处理3D图形渲染。它允许开发者创建复杂的几何形状,应用纹理,处理光照和阴影,以及执行高效的帧缓冲操作。 - Direct3D 8引入了顶点和像素着色器,提升了...
models-lession.zip是一个压缩包,解压后包括目录slim,用于重新训练模型
Lession3_4.java
"C++教学视频Lession1"旨在为初学者提供一个深入理解和掌握C++基础知识的平台。本教学视频系列从基础出发,通过直观且详细的讲解,帮助学习者构建扎实的C++编程基础。 在“Lession1”中,你将首先了解C++的历史背景...
2. **XML布局设计**:Android应用的用户界面主要是通过XML文件定义的。在这个项目中,我们重点关注`RelativeLayout`,这是一种相对布局,允许你根据各个组件之间的相对位置进行布局。`RelativeLayout`中的每个组件都...
标题 "lession1.zip" 提供的信息有限,但根据描述中的同样内容,我们可以推测这是一个教学材料或者编程课程的初级课件。这个压缩包包含了几个关键文件,这些文件名暗示了我们可能在处理一个关于C语言编程的基础教程...
【描述】"lession 2 of origin" 简明扼要地说明了这是一个Origin软件系列教程的第二个教学环节,通常在第一课中,可能会介绍软件的基础操作和概念,而在第二课中,用户将更深入地了解Origin的核心功能之一——窗口的...
2. **Bean容器(Bean Container)**:Spring容器负责创建、配置和管理Bean。理解Bean的生命周期和不同类型的容器(如ApplicationContext和BeanFactory)是学习Spring的基础。 3. **AOP(面向切面编程)**:Spring的...
【标题】"01.Origin概述_标清_LOT_origin_lession_" 涉及的知识点主要集中在"Origin"的概念上,这可能是指一个特定的IT产品或技术的起源、基础概念或者是某个学习课程的第一课。"LOT"可能是课程系列的缩写,暗示这是...
在`lession_2.view`中,可能包含了如何将自定义的水滴视图整合到Android布局中的示例。这可能涉及到`LinearLayout`、`RelativeLayout`、`ConstraintLayout`等布局管理器的使用,或者自定义的`ViewGroup`。 通过...
在Android开发中,单选框(Radio Button)是一种常见的用户界面元素,用于让用户在多个选项中选择一个。本文将深入探讨如何在...在lession_6的学习中,你可以深入实践这些知识,进一步提升对Android单选框的掌握。
在Android平台上,开发一款视频播放器是一项常见的任务,它涉及到多媒体处理、网络通信以及用户界面设计等多个技术领域。本资源提供了“Android视频播放器”的源码,对于想要深入理解Android视频播放器开发的开发者...
【标题】:“Lession1”通常意味着这是一系列教程或课程的第一部分,专注于某一特定主题。在这种情况下,由于没有提供具体细节,我们可以假设“Lession1”是关于TypeScript编程语言的基础教学。 【描述】:“自述...
2. 文件格式:不同的数据文件可能需要特定的格式,例如CSV用于表格数据,JSON或XML用于结构化数据,图像文件有JPEG、PNG等。理解这些格式的差异和适用场景非常重要。 3. 创建过程:课程可能涵盖如何在不同的操作...