案例下载 提取码:t11g
大家学编程语言的时候,第一个程序大部分都是输出一条"Hello World!"
这个库的开始不是输出一条语句,而是比这个更有趣的三角形
三角形在纸上画很简单,但是在手机屏幕里面如何画出来呢?接下来就一步步带你画三角形
开发环境配置
编程语言:Java
运行平台:Android
OpenGL ES版本:3.0
so
库以及jar
库如何导入
我在这里就不说了,自行百度
这是一个基础模板,GameView是渲染控件
,所有画出来的内容都由GameView
显示
public class MainActivity extends Activity implements DrawRenderer
{
//渲染控件类
private GameView gameview;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
gameview=new GameView(this);
//设置渲染器
gameview.setDrawRenderer(this);
setContentView(gameview);
}
//初始化
@Override
public void SurfaceCreated(Rendering rendering)
{
}
//绘画
@Override
public void draw(Rendering rendering)
{
}
//改变宽高的时候调用
@Override
public void SurfaceChanged(Rendering rendering, int width, int heigth)
{
}
}
编译项目看看什么效果
运行效果漆黑一片,现在我们给背景设置一个颜色,利用Rendering
类中的setColor()
方法给背景设置一个颜色.在初始化方法SurfaceCreated
加入一句rendering.setColor(new ColorRGBA(1,1,1,1));
设置背景颜色为白色
在OpenGL中颜色值和Android设置不一样 OpenGL颜色值为
你想设置的值/255.
项目运行效果跟我们想的一样,背景颜色变成白色了
步入正题
如何画一个三角形
根据这一章我们知道,画一个三角形得需要一个网格(Mesh)
和一个几何体(Geometry)
以及着色器(Shader)
来描述一个物体
首先我们先声明两个类Mesh
和Geometry
//网格
private Mesh mesh;
//几何体
private Geometry geometry;
我们现在来画一个三角形,首先我们知道一个三角形有三个顶点
,现在我们定义三个顶点的三维坐标
A点
:(-0.5,0,0)
B点
:(0.5,0,0)
C点
:(0,0.5,0)
把三个顶点坐标分别写入到数组里面,这个数组称为顶点数组
//顶点数组
float vertex[]={
//第一个顶点位置
-0.5f,0,0,
//第二个顶点位置
0.5f,0,0,
//第三个顶点位置
0,0.5f,0
};
有了顶点数组现在我们用Mesh类
中的setVertex
方法来设置顶点数组
mesh=new Mesh();
//设置网格的顶点数组数据
mesh.setVertex(vertex);
有了网格数据现在我们可以来初始化几何体(Geometry)
geometry=new Geometry(mesh);
把Mesh数据作为构建参数传给Geometry
让它知道自己的形状
一切设置完毕之后在draw
方法中加入
//重制几何体位置矩阵
geometry.genMatrix();
//设置几何体位置
geometry.translate(0,0,0);
//把几何体加入到渲染列表
rendering.addGeometry(geometry);
运行一下项目看看效果
运行之后抛出了一个空指针异常
根据Logcat错误信息显示,我们并没有给Geometry
设置一个着色器(Shader)
几何体不知道怎么画所以抛出异常
声明一个库自带的颜色着色器
//带颜色的着色器
private ColorShader shader;
可以自行自定义着色器,后面教程会讲到
自定义着色器
实现一些炫酷特效
初始化着色器,并且调用着色器
中实现的方法setColor()
来设置颜色,并且调用Geometry
的setShader()
方法来设置着色器
//初始化着色器
shader=new ColorShader();
//设置颜色
shader.setColor(new ColorRGBA(1,0,0,1));
//初始化几何体
geometry=new Geometry(mesh);
//给几何体设置一个着色器
geometry.setShader(shader);
再运行项目试试看?
为什么还是一片空白?
其实物体已经加入进去并且渲染了,只是摄像机
的位置和三角形
的位置重叠
,所以导致看不见三角形,现在我们来设置一下摄像机
的位置
使用Rendering
类中的getViewPort()
方法返回一个视图类(ViewPort)
,调用ViewPort
类中的setCamera
方法来设置摄像头的信息
//获取视图类
ViewPort viewport=rendering.getViewport();
//设置摄像机参数
viewport.setCameraPosition(0,0,-5);
viewport.setCameraLook(0,0,0);
viewport.setCameraUp(0,1,0);
因为三角形的坐标
为x:0 y:0 z:0
所以我们只需要把摄像头
的z
轴设置为-5
使他们不重叠,并且把观测点
设置为三角形的坐标
就可以了,UP
参数默认设置为x0 y1 z0
就可以了,如果设置为x0 y-1 z0
就会发现视图上下颠倒
。
运行项目看看效果?
三角形终于显示出来了。
我们还可以调用Geometry
的rotate
方法绕某一轴旋转,现在我们让三角形一直自转,声明一个float类型的全局变量angle
,在draw
方法中加入
//绕Y轴旋转angle度
angle+=0.5f;
geometry.rotate(angle,0,1,0);
设置几何体位置信息前,记得使用
geometry.genMatrix();
重制矩阵
现在运行项目看看,你会得到一个不断在自转的三角形
全部代码
public class MainActivity extends Activity implements DrawRenderer
{
//渲染控件类
private GameView gameview;
//网格
private Mesh mesh;
//几何体
private Geometry geometry;
//带颜色的着色器
private ColorShader shader;
//旋转角度
private float angle;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
gameview=new GameView(this);
gameview.setDrawRenderer(this);
setContentView(gameview);
}
//初始化
@Override
public void SurfaceCreated(Rendering rendering)
{
//设置背景颜色为白色
rendering.setColor(new ColorRGBA(1,1,1,1));
//顶点数组
float vertex[]={
//第一个顶点位置
-0.5f,0,0,
//第二个顶点位置
0.5f,0,0,
//第三个顶点位置
0,0.5f,0
};
mesh=new Mesh();
//设置网格的顶点数组数据
mesh.setVertex(vertex);
//初始化着色器
shader=new ColorShader();
//设置颜色
shader.setColor(new ColorRGBA(1,0,0,1));
//初始化几何体
geometry=new Geometry(mesh);
//给几何体设置一个着色器
geometry.setShader(shader);
//获取视图类
ViewPort viewport=rendering.getViewport();
//设置摄像机参数
viewport.setCameraPosition(0,0,-5);
viewport.setCameraLook(0,0,0);
viewport.setCameraUp(0,1,0);
}
//绘画函数
@Override
public void draw(Rendering rendering)
{
//重制几何体位置矩阵
geometry.genMatrix();
//设置几何体位置
geometry.translate(0,0,0);
//绕Y轴旋转angle度
angle+=0.5f;
geometry.rotate(angle,0,1,0);
//把几何体加入到渲染列表
rendering.addGeometry(geometry);
}
//改变宽高调用
@Override
public void SurfaceChanged(Rendering rendering, int width, int heigth)
{
}
}