2.新手上路,画一个三角形

案例下载 提取码: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)来描述一个物体

首先我们先声明两个类MeshGeometry

    //网格
    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()来设置颜色,并且调用GeometrysetShader()方法来设置着色器

        //初始化着色器
        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就会发现视图上下颠倒

运行项目看看效果?

运行效果

三角形终于显示出来了。
我们还可以调用Geometryrotate方法绕某一轴旋转,现在我们让三角形一直自转,声明一个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)
    {
        
    }
    
}

你可能感兴趣的:(2.新手上路,画一个三角形)