OpenGL绘制棱锥,剔除
/**
* 缓冲区工具类
*/
public class BufferUtil {
/**
* 将浮点数组转换成字节缓冲区
*/
public static ByteBuffer arr2ByteBuffer(float[] arr){
ByteBuffer ibb = ByteBuffer.allocateDirect(arr.length * 4);
ibb.order(ByteOrder.nativeOrder());
FloatBuffer fbb = ibb.asFloatBuffer();
fbb.put(arr);
ibb.position(0);
return ibb ;
}
/**
* 将list转换成字节缓冲区
*/
public static ByteBuffer list2ByteBuffer(List<Float> list){
ByteBuffer ibb = ByteBuffer.allocateDirect(list.size() * 4);
ibb.order(ByteOrder.nativeOrder());
FloatBuffer fbb = ibb.asFloatBuffer();
for(Float f : list){
fbb.put(f);
}
ibb.position(0);
return ibb ;
}
}
/**
* 渲染器
*/
public abstract class AbstractMyRenderer implements android.opengl.GLSurfaceView.Renderer
{
private float ratio;
public float xrotate = 0f;//围绕x轴旋转角度
public float yrotate = 0f;//围绕x轴旋转角度
/**
* 1.
*/
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
//清平色
gl.glClearColor(0f, 0f, 0f, 1f);
//启用顶点缓冲区数组
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
}
/**
* 2.
*/
public void onSurfaceChanged(GL10 gl, int width, int height) {
//设置视口
gl.glViewport(0, 0, width, height);
ratio = (float)width / (float)height;
//投影矩阵
gl.glMatrixMode(GL10.GL_PROJECTION);
//加载单位矩阵
gl.glLoadIdentity();
//设置平截头体
gl.glFrustumf(-ratio, ratio, -1, 1, 3f, 7f); }
/**
* 3.
*/
public abstract void onDrawFrame(GL10 gl);
}
**
* 棱锥,正方形
*/
public class MyTriangleConeRenderer extends AbstractMyRenderer{
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glClearColor(0f, 0f, 0f, 1f);
//顶点缓冲区
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
//启用颜色缓冲区
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
}
public void onDrawFrame(GL10 gl) {
//清除颜色缓冲区和深度缓冲区
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
//设置绘图颜色
gl.glColor4f(1f, 0f, 0f, 1f);
//启用深度测试
gl.glEnable(GL10.GL_DEPTH_TEST);
//启用表面剔除
gl.glEnable(GL10.GL_CULL_FACE);
//指定前面()
//ccw:counter clock wise-->逆时针
//cw:clock wise--> 顺时针
gl.glFrontFace(GL10.GL_CCW);
//剔除背面
gl.glCullFace(GL10.GL_BACK);
//GL10.GL_SMOOTH:平滑着色(默认)
//GL10.GL_FLAT:单调模式
gl.glShadeModel(GL10.GL_FLAT);
//操作模型视图矩阵
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
//设置眼球的参数
GLU.gluLookAt(gl,0f,0f,5f, 0f, 0f, 0f, 0f,1f,0f);
//旋转角度
gl.glRotatef(xrotate, 1, 0, 0);
gl.glRotatef(yrotate, 0, 1, 0);
//计算点坐标
float r = 0.5f ;//半径
float x = 0f,y = 0f,z = -0.5f ;
/******************** 锥面 ************************/
//顶点坐标集合
List<Float> coordsList = new ArrayList<Float>();
//添加锥顶点
coordsList.add(0f);
coordsList.add(0f);
coordsList.add(0.5f);
//顶点颜色集合
List<Float> colorList = new ArrayList<Float>();
colorList.add(1f);//r
colorList.add(0f);//g
colorList.add(0f);//b
colorList.add(1f);//a
/******************** 锥底 ************************/
//锥底坐标
List<Float> coordsConeBottomList = new ArrayList<Float>();
coordsConeBottomList.add(0f);
coordsConeBottomList.add(0f);
coordsConeBottomList.add(-0.5f);
boolean flag = false ;
//底面
for(float alpha = 0f ; alpha < Math.PI * 6 ; alpha = (float) (alpha + Math.PI / 8)){
//锥面
x = (float) (r * Math.cos(alpha));
y = (float) (r * Math.sin(alpha));
coordsList.add(x);
coordsList.add(y);
coordsList.add(z);
//锥底坐标
coordsConeBottomList.add(x);
coordsConeBottomList.add(y);
coordsConeBottomList.add(z);
//点颜色值
if(flag = !flag){
//黄色
colorList.add(1f);
colorList.add(1f);
colorList.add(0f);
colorList.add(1f);
}
else{
//红色
colorList.add(1f);
colorList.add(0f);
colorList.add(0f);
colorList.add(1f);
}
}
//点颜色值
if(flag = !flag){
//黄色
colorList.add(1f);
colorList.add(1f);
colorList.add(0f);
colorList.add(1f);
}
else{
//红色
colorList.add(1f);
colorList.add(0f);
colorList.add(0f);
colorList.add(1f);
}
//颜色缓冲区
ByteBuffer colorBuffer = BufferUtil.list2ByteBuffer(colorList);
gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer);
//绘制锥面
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, BufferUtil.list2ByteBuffer(coordsList));
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, coordsList.size() / 3);
//剔除正面
gl.glCullFace(GL10.GL_FRONT);
//绘制锥底
colorBuffer.position(4);
gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, BufferUtil.list2ByteBuffer(coordsConeBottomList));
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, coordsConeBottomList.size() / 3);
}
}
//主界面
public class MainActivity extends Activity {
private AbstractMyRenderer render;
private MyGLSurfaceView view;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
view = new GLSurfaceView(this);
render = new MyTriangleConeRenderer();
view.setRenderer(render);
//GLSurfaceView.RENDERMODE_CONTINUOUSLY:持续渲染(默认)
//GLSurfaceView.RENDERMODE_WHEN_DIRTY:脏渲染,命令渲染
view.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
setContentView(view);
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
float step = 5f ;
//up
if(keyCode == KeyEvent.KEYCODE_DPAD_UP){
render.xrotate = render.xrotate - step ;
} else if(keyCode == KeyEvent.KEYCODE_DPAD_DOWN){
render.xrotate = render.xrotate + step ;
} else if(keyCode == KeyEvent.KEYCODE_DPAD_LEFT){
render.yrotate = render.yrotate + step ;
} else if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){
render.yrotate = render.yrotate - step ;
}
//请求渲染,和脏渲染配合使用
view.requestRender();
return super.onKeyDown(keyCode, event);
}
}
OpenGL绘制棱锥,剔除的更多相关文章
- OpenGl 绘制一个立方体
OpenGl 绘制一个立方体 为了绘制六个正方形,我们为每个正方形指定四个顶点,最终我们需要指定6*4=24个顶点.但是我们知道,一个立方体其实总共只有八个顶点,要指定24次,就意味着每个顶点其实重复 ...
- [Modern OpenGL系列(三)]用OpenGL绘制一个三角形
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51347008 在上一篇文章中已经介绍了OpenGL窗口的创建.本文接着说如 ...
- opengl绘制正弦曲线
利用opengl绘制正弦曲线 ,见代码: #include <windows.h> //#include <GLUT/glut.h> #include <GL/glut. ...
- OpenGL绘制自由落体小球
OpenGL绘制自由落体小球 一. 程序运行的软硬件环境 本次设计在window10系统下进行,运用C++进行编写,在CodeBlocks环境下使用OpenGL进行设计. 所需环境配置分为2部分 ...
- OpenGL绘制简单场景,实现旋转缩放平移和灯光效果
本项目实现了用OpenGL绘制一个简单场景,包括正方体.球体和网格,实现了物体的旋转.缩放.平移和灯光效果.附有项目完整代码.有具体凝视.适合刚開始学习的人熟悉opengl使用. 开发情况 开发环境V ...
- Opengl绘制我们的小屋(二)第一人称漫游
这章我们先讲第一人称漫游的实现.在openTK里,我们用函数Matrix4.LookAt(caram.Eye,caram.Target,Vector3.UnitY)来放置摄像机,其中三个参数分别与摄像 ...
- OPENGL绘制文字
OPENGL没有提供直接绘制文字的功能,需要借助于操作系统. 用OPENGL绘制文字比较常见的方法是利用显示列表.创建一系列显示列表,每个字符对应一个列表编号.例如,'A'对应列表编号1000+'A' ...
- 第一课、OpenGL绘制直线等等
第一课.OpenGL绘制直线等等 分类: [开发技术]OpenGL 2012-01-18 14:59 5217人阅读 评论(0) 收藏 举报 buffer图形c // // main.c // o ...
- 46.Qt 使用OpenGL绘制立方体
main.cpp #include <QApplication> #include <iostream> #include "vowelcube.h" in ...
随机推荐
- 怎样用OleDbDataAdapter来对数据库进行操作?
请问怎样用OleDbDataAdapter来对数据库进行删除.改动和加入? OleDbDataAdapter是DataSet和数据源之间建立联系的重要纽带.用它我们能够对数据库进行删除.改动和加入 ...
- android activity 后的形式 藏
activity 希望的形式 于AndroidManifest.xml 建立 theme 属性 <activity android:name="zicox.u ...
- Codeforces Round #248 (Div. 2) (ABCD解决问题的方法)
比赛链接:http://codeforces.com/contest/433 A. Kitahara Haruki's Gift time limit per test:1 second memory ...
- Android Fragment与Activity之间的数据交换(Fragment从Activity获取数据)
Fragment与Activity之间的数据交换,通常含有3: 一.Fragment从Activity获取数据(仅本文介绍了一个第一): 两.Activity从Fragment获取数据: 三.Frag ...
- 【转】HTTP协议两种提交参数的方式Form-data和raw
原文:http://www.cnblogs.com/zhangfei/p/5099036.html HTTP协议的接口测试中,使用到最多的就是GET请求与POST请求,其中POST请求有FORM参数提 ...
- 从头开始学JavaScript (六)——语句
原文:从头开始学JavaScript (六)--语句 一.条件分支语句:if 基本格式: if (<表达式1>){ <语句组1>}else if (<表达式2> ...
- jQuery组织您钞四----jQuery操作DOM
一.采用jQuery创建节点 节点是DOM基础设施.依据DOM产品规格,Node是一个很宽泛的概念,包含元素.属性.正文.档..实际开发过程中,要创建动态内容,主要操作的节点包括元素. 属性和文本. ...
- ASP.NET学习笔记--自己写的Login.aspx
以前有大学有学过,但是没学好,现在准备完全自己动手做一个网站,学习一下ASP.NET 做一个登录页面,首先要有创建一个新的网站,添加Login.aspx,然后做出自己想要的DIV和CSS布局, 之后创 ...
- 修改 dll
由于没有源码,想改dll,就要依靠反汇编了. 输入 ildasm.exe 据说也可以直接 C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin 找到该软件 ...
- CentOs Linux 常见命令
整理一些常用的命令(持续更新): 查看端口是否开启: netstat -an | grep prot (查看是否打开23端口) |:通道的意思,grep是指查看当前字符所在的行 LINUX通过下面的命 ...