GL10控制图形旋转
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控制图形旋转的更多相关文章
- 关于MFC与OpenGL结合绘图区域用鼠标来控制图形的移动的坑
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11773171.html 之前开发的导入多个模型,旋转,分别移动什么什么的,都是在纯OpenGL ...
- matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色
一起来学matlab-matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 < ...
- 在DirectX9中使用DXUT定制按钮来控制模型旋转的问题
使用DXUT中的按钮控件类实现 控制模型旋转的过程如下: 1.创建一个CDXUTDialog对话框,并绑定至CDXUTDialogResourceManager对话框资源管理器. 2.绑定回调函数GU ...
- 【转载】ArcBall二维控制三维旋转
原文:http://oviliazhang.diandian.com/post/2012-05-19/40027878859 由于目前大多的显示器是二维的,要控制三维物体的旋转就显得不那么直接了.Ar ...
- threejs 鼠标移动控制模型旋转
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- OpenGl 导入读取多个3D模型 并且添加鼠标控制移动旋转
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11627508.html 前言: 因为接下来的项目需求是要读取多个3D模型,并且移动拼接,那么我 ...
- UI设计篇·入门篇·绘制简单自定义矩形图/设置按钮按下弹起颜色变化/设置图形旋转
Android的基本控件和图形有限,难以满足所有的实际需要和设计需求,好在Android给出了相对完善的图形绘制和自定义控件的API,利用这些API,可以基本满足设计的需求. 自定义图像和控件的方法: ...
- 实现硬件PWM控制电机旋转和通过编码器计算所转圈数的简单例程
该例程所用的硬件设备: 直流电机驱动模块YYH-LWZ: H桥 大功率 正反转 刹车 PWM 调速 5/12/24V 12V直流减速电机JGB37-520B:ASLONG JGB37-520B编码器减 ...
- Unity在UI界面上显示3D模型/物体,控制模型旋转
Unity3D物体在UI界面的显示 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...
随机推荐
- Scrum Meeting---Six(2015-11-1)
说明 由于周五放假,我们团队部分队员回家和外出,所以这一次的Scrum Meeting我们推迟到周日晚上,在周末的这段时间内队员对自己做的任务在周日晚汇报给我. 周末完成任务以及周一计划任务 姓名 周 ...
- dateTimePicker的使用,时间控件
<li> <label>促销时间<span class="imprt">*</span></label> <inp ...
- Android Fragment分页显示的实现
分页显示有两种方式 一种是使用ViewPager 另一种是使用FragmentTransaction 上代码 1 FragmentTransaction实现方式 public class MainAc ...
- Linux计划任务入门详解
Linux操作系统定时任务系统 Cron 入门 cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业.由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动 ...
- hdu_2089 不要62
数位动态规划 数位动态规划是求解一个大区间[L, R]中间满足条件Q的所有数字的个数(或者和,或其他)的一种方法.它通过分析每一位上的数字,一般用 dp[len][digit][...] 来表 ...
- smarty 学习记录
smarty模版是比较大众化的一个模版,在php开发过程当中被很多开发者视为最友好的模版之一,学习smarty课程对于很多培训机构来说也是列入了培训课程之一,那么很多方面就需要我们学习了一. 安装首先 ...
- python操作mongodb之七时间和时区
#时间和时区 import datetime db.test.insert_one({"datetime-datetime-utcnow":datetime.datetime.ut ...
- OpenCV3编程入门笔记(6)自我验证各函数程序代码
// asw.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <opencv2/opencv.hpp> usi ...
- struts2 I18N 国际化
1. 准备properties文件 globalMessages_en_US.properties globalMessages_zh_CN.properties 2. 配置struts.xml &l ...
- bzoj题解汇总(1032~1051)
bzoj1034:贪心 bzoj1036:树剖 bzoj1037:一个比较巧妙,利用连续性维护的dp. http://www.cnblogs.com/Sdchr/p/6129496.html bzoj ...