package wyf.ytl;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.IntBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.content.Context;
import android.opengl.GLSurfaceView;
//Download by http://www.codesc.net
import android.view.MotionEvent;
public class MyGLSurfaceView extends GLSurfaceView{
MyRenderer myRenderer;//自定义的渲染器
private IntBuffer mVertexBuffer;//顶点坐标数据缓冲
private IntBuffer mColorBuffer;//顶点着色数据缓冲
private final float TOUCH_SCALE_FACTOR = 180.0f/320;//角度缩放比例
private float mPreviousY;//上次的触控位置Y坐标
private float mPreviousX;//上次的触控位置X坐标
float yAngle=0;//绕y轴旋转的角度
float zAngle=0;//绕z轴旋转的角度
int vertexCount;//顶点的个数
public MyGLSurfaceView(Context context){//构造器
super(context);
myRenderer = new MyRenderer();//创建渲染器
this.setRenderer(myRenderer);//设置渲染器
this.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);//设置渲染模式
this.initVertexBuffer();//初始化顶点坐标数组
this.initColorBuffer();//初始化颜色数组
}
@Override
public boolean onTouchEvent(MotionEvent e){//触摸事件的回调方法
float x = e.getX();//得到x坐标
float y = e.getY();//得到y坐标
switch (e.getAction()) {
case MotionEvent.ACTION_MOVE://触控笔移动
float dy = y - mPreviousY;//计算触控笔Y位移
float dx = x - mPreviousX;//计算触控笔X位移
yAngle += dx * TOUCH_SCALE_FACTOR;//设置沿y轴旋转角度
zAngle += dy * TOUCH_SCALE_FACTOR;//设置沿z轴旋转角度
requestRender();//重绘画面
}
mPreviousY = y;//记录触控笔位置
mPreviousX = x;//记录触控笔位置
return true;//返回true
}
private void initVertexBuffer(){//初始化顶点坐标数据
vertexCount=15;//顶点的个数
final int UNIT_SIZE=10000;//创建像素单位
int vertices[]=new int[]{
0,0,0,-8*UNIT_SIZE,-8*UNIT_SIZE,0,
-8*UNIT_SIZE,8*UNIT_SIZE,0,
0,0,0,-8*UNIT_SIZE,8*UNIT_SIZE,0,
0,14*UNIT_SIZE,0,
0,0,0,0,14*UNIT_SIZE,0,
8*UNIT_SIZE,8*UNIT_SIZE,0,
0,0,0,8*UNIT_SIZE,8*UNIT_SIZE,0,
8*UNIT_SIZE,-8*UNIT_SIZE,0,
0,0,0,8*UNIT_SIZE,-8*UNIT_SIZE,0,
-8*UNIT_SIZE,-8*UNIT_SIZE,0
};
//创建顶点坐标数据缓冲
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);
vbb.order(ByteOrder.nativeOrder());//设置字节顺序
mVertexBuffer = vbb.asIntBuffer();//转换为int型缓冲
mVertexBuffer.put(vertices);//向缓冲区中放入顶点坐标数据
mVertexBuffer.position(0);//设置缓冲区起始位置
}
private void initColorBuffer(){//初始化颜色数组
final int one = 65535;
int colors[]=new int[]{//顶点颜色值数组,每个顶点4个色彩值RGBA
one,one,one,0,0,0,one,0,
0,0,one,0,one,one,one,0,
0,0,one,0,0,0,one,0,
one,one,one,0,0,0,one,0,
0,0,one,0,one,one,one,0,
0,0,one,0,0,0,one,0,
one,one,one,0,0,0,one,0,
0,0,one,0,
};
//创建顶点着色数据缓冲
ByteBuffer cbb = ByteBuffer.allocateDirect(colors.length*4);
cbb.order(ByteOrder.nativeOrder());//设置字节顺序
mColorBuffer = cbb.asIntBuffer();//转换为int型缓冲
mColorBuffer.put(colors);//向缓冲区中放入顶点着色数据
mColorBuffer.position(0);//设置缓冲区起始位置
}
//自定义的渲染器
private class MyRenderer implements GLSurfaceView.Renderer{
@Override
public void onDrawFrame(GL10 gl) {//绘制方法
//清除颜色缓存于深度缓存
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_MODELVIEW);//设置当前矩阵为模式矩阵
gl.glLoadIdentity(); //设置当前矩阵为单位矩阵
gl.glTranslatef(0, 0f, -3f);
gl.glRotatef(yAngle, 0, 1, 0);//沿Y轴旋转
gl.glRotatef(zAngle, 0, 0, 1);//沿X轴旋转
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);//启用顶点坐标数组
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);//启用顶点颜色数组
gl.glVertexPointer(//为画笔指定顶点坐标数据
3,//每个顶点的坐标数量为3 xyz
GL10.GL_FIXED,//顶点坐标值的类型为 GL_FIXED
0, mVertexBuffer//顶点坐标数据
);
gl.glColorPointer(//为画笔指定顶点着色数据
4, //设置颜色的组成成分,必须为4—RGBA
GL10.GL_FIXED,//顶点颜色值的类型为 GL_FIXED
0, mColorBuffer//顶点着色数据
);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, vertexCount); //绘制图形
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
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 onSurfaceCreated(GL10 gl, EGLConfig config) {//创建时被调用
gl.glDisable(GL10.GL_DITHER);//关闭抗抖动
gl.glEnable(GL10.GL_DEPTH_TEST);//启用深度测试
}
}
}
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
weixin_39840914
- 粉丝: 436
- 资源: 1万+
最新资源
- 传统A*算法与创新改进版性能对比及与DWA结合规避障碍物仿真研究:动态路径规划与障碍物避障高效结合策略,传统A*算法与改进A*算法性能对比及融合DWA规避障碍物的仿真研究:全局与局部路径规划的实践探究
- 基于遗传算法优化的光伏发电系统仿真:实现最大功率跟踪与逆变器转换功能评估,基于遗传算法优化的光伏发电系统仿真:MPPT控制及性能评估,基于优化算法的光伏发电系统仿真 在本项目中,设计了基于光伏系统(包
- 风储联合调频模型:Matlab Simulink仿真下的风电储能系统一次调频研究,风储联合调频模型:Matlab Simulink仿真下的风电储能系统一次调频研究,风储调频模型 matlab simu
- 六自由度并联Stewart Platform平台:基于Matlab GUI界面的动态模拟与参数调整系统,六自由度并联Stewart Platform平台:基于Matlab GUI界面的动态模拟与参数调
- 高频注入仿真下的PMSM无感控制:解决零速转矩输出问题与凸极插入式永磁同步电机MATLAB Simulink仿真探究,基于高频注入仿真的PMSM无感控制策略:解决零速转矩输出与凸极问题,高频注入仿真p
- 三维至二维的Comsol布拉格微环谐振器复现:效果差异考量与编号029,基于二维复现的comsol布拉格微环谐振器及其效果差异研究编号029,comsol布拉格微环谐振器(原文为三维,此为二维复现,效
- 基于弯扭耦合特性的行星齿轮系统动力学建模与仿真研究(使用MATLAB实现),弯扭耦合行星齿轮动力学模拟:MATLAB程序应用与性能分析,弯扭耦合行星齿轮动力学程序matlab ,核心关键词: 弯扭耦合
- 基于驾驶员反应与天气影响的车辆紧急防避撞AEB控制及ACC模型研究-Prescan与simulink联合仿真分析,考虑驾驶员反应与天气影响的车辆紧急防避撞AEB控制及ACC模型研究-基于Presc
- LabVIEW与VisionPro框架代码的集成应用:2020年编程实践指南,LabVIEW 2020调用VisionPro框架代码实现图像处理功能,LabVIEW调用VisionPro框架代码 Vi
- FPGA驱动的TCP服务器与UDP IP源码合集:含IP VHDL代码,附赠回环测试演示程序,FPGA TCP Server与UDP IPVHDL源码:附回环测试Demo演示,FPGA TCP ser
- 高压直流输电Matlab仿真模型:涵盖LCC-HVDC 500kv与800kv电压等级的控制切换研究,高压直流输电Matlab仿真模型(含500kv和800kv电压等级及智能控制切换系统研究),高压直
- 基于IEEE 14节点系统的PMU优化配置Matlab程序,涵盖零注入与N-1断线考量,需下载cplex求解,附参考文献,基于IEEE 14节点系统的PMU优化配置Matlab程序:考虑零注入与N-1
- 三相电压型PWM整流器的非线性二阶离散自抗扰电压外环与电流内环PI控制:快速响应与精准扰动跟踪,三相电压型PWM整流器的非线性二阶离散自抗扰电压外环与电流内环PI控制参数调节策略:电压跟随响应迅速,扰
- 基于COMSOL的锂枝晶模型:包含相场、浓度场和电场的多物理场仿真分析与文献参考,comsol下的锂枝晶模型:从单点形核到形状形核-包含相场、浓度场与电场的多物理场研究及文献综述,comsol锂枝晶
- 交错并联Boost电路模型的双闭环LADRC线性自抗扰控制,实现优质电压调节与电流均流,交错并联Boost仿真电路模型:双闭环LADRC线性自抗扰控制实现良好电压与电流性能,交错并联Boost 仿真电
- 基于MATLAB SIMULINK的复杂系统控制策略设计与应用研究,基于MATLAB SIMULINK的复杂系统控制策略设计与应用研究,基于MATLAB SIMULINK的各种控制系统设计 ,基于MA
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)