以上内容就是[3d旋转魔方]基于opengl的3d旋转魔方.doc的相关内容介绍,喜欢侠外游戏论坛的朋友可以关注我们。
12345下一页作者: orange 时间: 2020-11-2 07:13
对应顶点除了可认为其定义坐标外,还可以指定色彩,材质,法线,纹理等 。对应的传入色彩,顶点,材质,法线的办法如下:glColorPointer(int size,int type,int stride,Buffer pointer)glVertexPointer(int size, int type, int stride, Buffer pointer)glTexCoordPointer(int size, int type, int stride, Buffer pointer)glNormalPointer(int type, int stride, Buffer pointer)OpenGL ES 内部存放图形数据的Buffer有COLOR ,DEPTH (深度信息)等,在绘制图形只前一般须要清空COLOR 和 DEPTH Buffer。1.2、课程设计任务分析及成果 本课程设计要求:基于OpenGL的3D魔方实现:在3D空间中实现2X2魔方,各个魔方单元格显示不同的贴图,魔方体能在3D空间自由旋转、每层也能旋转。Android系统使用OpenGL的标准接口来支持3D图像功能,因此我对课程设计的定位是android平台上基于OPENGL ES的旋转魔方实现。
经过几个星期的努力3d旋转魔方,我已经建立好功能,生成了RotateCube.apk的android手机程序,安装在手机上后,能看到二阶以及三阶的旋转魔方。并添加了一些设置菜单,背景音乐,星空效果等。二、程序功能的实现2.1 基本思路2.1.1六面纹理贴图立方体的绘制立方体有六个面,定义一个六维数组存放六个面的顶点坐标,然后定义一个一维数组存放单个面对的纹理坐标,在draw函数里面分六次,每一次绘出一个有纹理贴图的面,六次之后有不同纹理贴图的立方体就绘制出来了。2.1.2二阶和三阶立方体的绘制 定义好一个立方体的坐标之后,之后所有的立方体可以看做是最初立方体在坐标空间平移而来的,考虑到坐标平移,以及方便在立方体的对象实例化中方便定义平移出的立方体,我将vertex里面的顶点坐标定义为基本坐标+空间平移量的形式。为了方便平移以及使坐标更简单化,我将二阶里面坐标原点设置在基本立方体的期中 一个点上,在三阶里将坐标原点设置在基本立方体的体心上。2.1.3旋转的控制 魔方单层的旋转可以说是这个题目的最难点,困扰了我好久,最后我想到了一个最“傻”的办法完成了此功能。在单个立方体的绘制时候,我在每个面的绘制函数中添加该面分别绕XYZ轴旋转的代码,这样当我改变旋转的角度值时,每个面都跟着旋转了,看起来就像整个小立方体跟着旋转了。
然后在对象实例化之后添加一个线程,控制不同立方体的旋转,只要在线程里面定义好要旋转的立方体,即可时魔方实现单层的旋转。2.1.4三阶魔方视图的控制如能实现屏幕上触摸控制视图方向是最好的事情,触摸控制立方体各个方向的转动需要计算手指在屏幕上的微小位移以及方向,然后对应到整个坐标系绕XYZ轴旋转的角度值中去。但是时间按有限,我用了三个seekbar分别控制坐标系分别绕XYZ轴转动的角度值。2.2 应用程序功能详细说明点击程序图标进图主界面,有两个按钮供选择,点击“二阶魔方”则进入到二阶旋转魔方的界面,点击“三阶魔方”则进入到三阶旋转魔方的界面。(如图1-1)按手机的菜单键可以弹出菜单(如图1-2),由于做的程序较简单,我只设置了三个菜单项:“设置”--点击设置即进入设置界面,可以对魔方的大小,旋转速度进行个性化设置;“关于”--点击关于弹出一个对话框,主要是我个人的关于程序的一下描述,以及对指导老师的感谢;“退出”--点击退出弹出对话框询问是否退出,点击确定就退出主程序。图1—1图1—2图1-3图1-4图1-5二阶与三阶魔方每个面都可以按照设定好的路径自由旋转,每个小立方体都贴图,并且显示正常;增加设置菜单,能设置魔方的大小、魔方旋转的速度。
(如图1-3)三阶魔方旋转时候增加了背景音乐播放功能,并在三阶魔方的外层增加了一个星空类,有线程控制自动旋转,使魔方看起来像在天空中旋转一样。三阶魔方最上面有三个seekbar,分别控制整个魔方向xyz轴的转动,调整三个seekbar,可以对魔方进行全方位的观察。(如图1-5)三、方案设计Mian.javaSetting.javaRotateCube.javaRotateCubeTwo.javaMySurfaceView.javaCubeVerTexTwo.javaMian.javaSetting.javaRotateCube.javaRotateCubeTwo.javaMySurfaceView.javaCubeVerTexTwo.javaMySurfaceViewTwo.javaCubeVerTex.java调用传递 启动启动启动启动实例化旋转控制实例化旋转控制绘制三阶旋转魔方实例化旋转控制绘制二阶旋转魔方3.2主要算法说明3.2.1 GLSurfaceView绘制场景编写OpenGL ES应用的起始点是从类GLSurfaceView开始,设置GLSurfaceView只需调用一个方法来设置OpenGLView用到的GLSurfaceView.Renderer. mRenderer = new SceneRenderer(); // 创建场景渲染器setRenderer(mRenderer); // 设置渲染器3.2.2 GLSurfaceView.Renderer进行渲染绘制GLSurfaceView.Renderer定义了一个统一图形绘制的接口,覆写该方法时会自动生成三个函数:// Called when the surface is created or recreated.public void onSurfaceCreated(GL10 gl, EGLConfig config){}// Called to draw the current frame.public void onDrawFrame(GL10 gl) {}// Called when the surface changed size.public void onSurfaceChanged(GL10 gl, int width, int height){}onSurfaceCreated : 在这个方法中主要用来设置一些绘制时不常变化的参数,比如:背景色,是否打开 z-buffer等。