GL10提供了glRotatef(float  angle , float  x ,  float  y , float  z)方法,该方法用于控制旋转,该方法种angle控制旋转角度;而x、y、z参数则共同决定了旋转轴的方向。

本质上,glRotatef(float  angle , float  x ,  float  y , float  z)方法的作用与glTranslatef(float  x , float  y  ,float  z)方法相似,只是glTranslatef(float  x , float  y  ,float  z)方法控制图形中心移动;而glRotatef(float  angle , float  x ,  float  y , float  z)方法控制图形沿着指定旋转轴转动指定角度。

因此只要在调用glTranslatef()方法控制图形移动之后,再调用glRotate()控制图形旋转即可,如果希望看到指定图形不断旋转,只要在onDrawFrame(GL10  gl)方法中不断增加旋转角度即可。

下面是该程序所用的Renderer实现类。

import java.nio.FloatBuffer;
import java.nio.IntBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView.Renderer;

public class MyRenderer2 implements Renderer{
  float[] triangleData = new float[]{
    0.1f,0.6f,0.0f,//上顶点
    -0.3f,0.0f,0.0f,//左顶点
    0.3f,0.1f,0.0f//右顶点
  };
  int[] triangleColor = new int[]{
    65535,0,0,0,//上顶点红色
    0,65535,0,0,//左顶点绿色
    0,0,65535,0//右顶点蓝色
  };
  float[] rectData = new float[]{
    0.4f,0.4f,0.0f,//右上顶点
    0.4f,-0.4f,0.0f,//右下顶点
    -0.4f,0.4f,0.0f,//左上顶点
    -0.4f,-0.4f,0.0f//左下顶点
  };
  int[] rectColor = new int[]{
    0,65535,0,0,//右上顶点绿色
    0,0,65535,0,//右下顶点蓝色
    65535,0,0,0,//左上顶点红色
    65535,65535,0,0//左下顶点黄色
  };
  //依然是正方形的四个顶点,只是顺序交换了一下
  float[] rectData2 = new float[]{
    -0.4f,0.4f,0.0f,//左上顶点
    0.4f,0.4f,0.0f,//右上顶点
    0.4f,-0.4f,0.0f,//右下顶点
    -0.4f,-0.4f,0.0f//左下顶点
  };
  float[] pentacle = new float[]{
    0.4f,0.4f,0.0f,
    -0.2f,0.3f,0.0f,
    0.5f,0.0f,0f,
    -0.4f,0.0f,0f,
    -0.1f,-0.3f,0f
  };

  FloatBuffer triangleDataBuffer;
  IntBuffer triangleColorBuffer;
  FloatBuffer rectDataBuffer;
  IntBuffer rectColorBuffer;
  FloatBuffer rectDataBuffer2;
  FloatBuffer pentacleBuffer;
  //控制旋转的角度
  private float rotate;
  public MyRenderer2(){
    //将顶点位置数据数组包装成FloatBuffer
    triangleDataBuffer = FloatBuffer.wrap(triangleData);
    rectDataBuffer = FloatBuffer.wrap(rectData);
    rectDataBuffer2 = FloatBuffer.wrap(rectData2);
    pentacleBuffer = FloatBuffer.wrap(pentacle);
    //将顶点颜色数据数组包装成IntBuffer
    triangleColorBuffer = IntBuffer.wrap(triangleColor);
    rectColorBuffer = IntBuffer.wrap(rectColor);
  }

  @Override
  public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    // 关闭抗抖动
    gl.glDisable(GL10.GL_DITHER);
    //设置系统对透视进行修正
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
    gl.glClearColor(0, 0, 0, 0);
    //设置阴影平滑模式
    gl.glShadeModel(GL10.GL_SMOOTH);
    //启用深度测试
    gl.glEnable(GL10.GL_DEPTH_TEST);
    //设置深度测试的类型
    gl.glDepthFunc(GL10.GL_LEQUAL);
  }

  @Override
  public void onSurfaceChanged(GL10 gl, int width, int height) {
    // 设置3D视窗的大小及位置
    gl.glViewport(0, 0, width, height);
    //将当前矩阵模式设为投影矩阵
    gl.glMatrixMode(GL10.GL_PROJECTION);
    //初始化单位矩阵
    gl.glLoadIdentity();
    //计算透视视窗的宽度、高度比
    float ratio = (float)width / height;
    //调用此方法设置透视视窗的空间大小
    gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
  }

  //绘制图形的方法
  @Override
  public void onDrawFrame(GL10 gl) {
    // 清除屏幕缓存和深度缓存
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
    //启用顶点坐标数据
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    //启用顶点颜色数据
    gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
    //设置当前矩阵堆栈为模型堆栈
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    //----------绘制第一个图形----------
    //重置当前的模型视图矩阵
    gl.glLoadIdentity();
    gl.glTranslatef(-0.32f, 0.35f, -1f);
    //设置顶点的位置数据
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, triangleDataBuffer);
    //设置顶点的颜色数据
    gl.glColorPointer(4, GL10.GL_FIXED, 0, triangleColorBuffer);
    //根据顶点数据绘制平面图形
    gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
    //----------绘制第二个图形----------
    //重置当前的模型视图矩阵
    gl.glLoadIdentity();
    gl.glTranslatef(0.6f, 0.8f, -1.5f);
    gl.glRotatef(rotate, 0f, 0f, 0.1f);
    //设置顶点的位置数据
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, rectDataBuffer);
    //设置顶点的颜色数据
    gl.glColorPointer(4, GL10.GL_FIXED, 0, rectColorBuffer);
    //根据顶点数据绘制平面图形
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
    //----------绘制第三个图形---------
    //重置当前的模型视图矩阵
    gl.glLoadIdentity();
    gl.glTranslatef(-0.4f, -0.5f, -1.5f);
    gl.glRotatef(rotate, 0f, 0.2f, 0f);
    //设置顶点的位置数据(依然使用之前的顶点颜色)
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, rectDataBuffer2);
    //根据顶点数据绘制平面图形
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
    //----------绘制第四个图形----------
    //重置当前的模型视图矩阵
    gl.glLoadIdentity();
    gl.glTranslatef(0.4f, -0.5f, -1.5f);
    //设置使用纯色填充
    gl.glColor4f(1.0f, 0.2f, 0.2f, 0.0f);
    gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
    //设置顶点的位置数据
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, pentacleBuffer);
    //设置顶点数据绘制平面图形
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 5);
    //绘制结束
    gl.glFinish();
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    //旋转角度增加1
    rotate += 1;
  }

}

GL10控制图形旋转的更多相关文章

  1. 关于MFC与OpenGL结合绘图区域用鼠标来控制图形的移动的坑

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11773171.html 之前开发的导入多个模型,旋转,分别移动什么什么的,都是在纯OpenGL ...

  2. matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色

    一起来学matlab-matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 < ...

  3. 在DirectX9中使用DXUT定制按钮来控制模型旋转的问题

    使用DXUT中的按钮控件类实现 控制模型旋转的过程如下: 1.创建一个CDXUTDialog对话框,并绑定至CDXUTDialogResourceManager对话框资源管理器. 2.绑定回调函数GU ...

  4. 【转载】ArcBall二维控制三维旋转

    原文:http://oviliazhang.diandian.com/post/2012-05-19/40027878859 由于目前大多的显示器是二维的,要控制三维物体的旋转就显得不那么直接了.Ar ...

  5. threejs 鼠标移动控制模型旋转

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  6. OpenGl 导入读取多个3D模型 并且添加鼠标控制移动旋转

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11627508.html 前言: 因为接下来的项目需求是要读取多个3D模型,并且移动拼接,那么我 ...

  7. UI设计篇·入门篇·绘制简单自定义矩形图/设置按钮按下弹起颜色变化/设置图形旋转

    Android的基本控件和图形有限,难以满足所有的实际需要和设计需求,好在Android给出了相对完善的图形绘制和自定义控件的API,利用这些API,可以基本满足设计的需求. 自定义图像和控件的方法: ...

  8. 实现硬件PWM控制电机旋转和通过编码器计算所转圈数的简单例程

    该例程所用的硬件设备: 直流电机驱动模块YYH-LWZ: H桥 大功率 正反转 刹车 PWM 调速 5/12/24V 12V直流减速电机JGB37-520B:ASLONG JGB37-520B编码器减 ...

  9. Unity在UI界面上显示3D模型/物体,控制模型旋转

    Unity3D物体在UI界面的显示 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...

随机推荐

  1. iOS - OC 内存管理

    1.OC 基本内存管理模型 1.1 自动垃圾收集 在 OC 2.0 中,有一种称为垃圾收集的内存管理形式.通过垃圾收集,系统能够自动监测对象是否拥有其他的对象,当程序执行需要空间的时候,不再被引用的对 ...

  2. KMPlayer

    1. KMP 播放时,有声无图像,黑屏.解决: 打开KMP然后右键-选项-参数设置(或者进入KMP直接按F2)-视频处理-右边选择“渲染器”-在“渲染器”中选择“VMR9 未渲染 (HQ字幕)”-选中 ...

  3. jQuery Jcrop API参数说明(中文版)(转)(图片剪切)

    Jcrop是一个jQuery图片裁剪插件,它能为你的WEB应用程序快速简单地提供图片裁剪的功能.特点如下: 对所有图片均unobtrusively(无侵入的,保持DOM简洁) 支持宽高比例锁定 支持 ...

  4. 选择列表控件的使用(PickList)

    需要下载picklist.dll类库配合使用 <%@ Register TagPrefix="cc1" Namespace="PickListControl&quo ...

  5. (十一)C语言中内存堆和栈的区别

    在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到.但对于很多的初学着来说,堆栈是一个很模糊的概念. 堆栈:一种数据结构.一个在程序运行时用于存放的地方,这可能是很多初学者的认 ...

  6. hdu 2604 Queuing(dp递推)

    昨晚搞的第二道矩阵快速幂,一开始我还想直接套个矩阵上去(原谅哥模板题做多了),后来看清楚题意后觉得有点像之前做的数位dp的水题,于是就用数位dp的方法去分析,推了好一会总算推出它的递推关系式了(还是菜 ...

  7. overridePendingTransition动画只设置一个

    退出动画可以设置为0, 但是两个动画的duration需要一样. 退出动画:<?xml version="1.0" encoding="utf-8"?&g ...

  8. JAVA 判断一个字符串是不是一个合法的日期格式

    原文:http://www.cnblogs.com/xdp-gacl/p/3548307.html 最近开发公司的项目,一直找不到合适的正则表达式可以判断一个字符串是否可以转成日期,今天发现可以采用S ...

  9. 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小

    原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...

  10. LTIB常用命令2

    LTIB 编译配置选项 根据说明文档,ltib 可以通过以下的命令配置: * <verbatim># ./ltib</verbatim>          安装后第一次运行,采 ...