全球中文玩家俱乐部 Chinese players club of the Global .

侠外游戏论坛

 找回密码
 立即注册
快捷导航
搜索
视听
视听
图片
图片
段子
段子
小说
小说
查看: 1211|回复: 4
打印 上一主题 下一主题
收起左侧

[闲聊页游] [3d旋转魔方]基于opengl的3d旋转魔方.doc

[复制链接]

3231

主题

1万

帖子

5万

积分

ミ侠外护法ミ

Rank: 7Rank: 7Rank: 7

  • 威望
    0 点
    银子
    20385 两
    武功
    22062 阶
    元宝
    0 锭
    精华
    0
  • 跳转到指定楼层
    俺是撸主
    发表于 2020-11-2 07:13:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    马上注册,结交更多侠客,享用更多功能,让你轻松玩转侠外论坛。

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    华中科技大学电子科学与技术系课程设计最终报告( 2011-- 2012年度第 2 学期)名    称:软件课程设计题    目:基于OpenGL的3D旋转魔方实现院    系:电子科学与技术系班    级:电子1006班学    号:U201014113学生姓名:黄铁森联系方式:指导教师:杨文涛设计周数:15周成    绩:日期:   2012 年 5 月 22 日目  录TOC \o "1-3" \h  \u  HYPERLINK \l _Toc24335 一、课程设计介绍 PAGEREF _Toc24335 3 HYPERLINK \l _Toc8882 1.1、OpenGL ES基础知识 PAGEREF _Toc8882 3 HYPERLINK \l _Toc25749 1.2、课程设计任务分析及成果 PAGEREF _Toc25749 3 HYPERLINK \l _Toc11705 二、程序功能的实现 PAGEREF _Toc11705 4 HYPERLINK \l _Toc18006 2.1 基本思路 PAGEREF _Toc18006 4 HYPERLINK \l _Toc32535 2.1.1六面纹理贴图立方体的绘制 PAGEREF _Toc32535 4 HYPERLINK \l _Toc28922 2.1.2二阶和三阶立方体的绘制 PAGEREF _Toc28922 4 HYPERLINK \l _Toc6923 2.1.3旋转的控制 PAGEREF _Toc6923 4 HYPERLINK \l _Toc24858 2.1.4三阶魔方视图的控制 PAGEREF _Toc24858 4 HYPERLINK \l _Toc14296 2.2 应用程序功能详细说明 PAGEREF _Toc14296 5 HYPERLINK \l _Toc6092 三、方案设计 PAGEREF _Toc6092 7 HYPERLINK \l _Toc28307 3.1程序设计框架 PAGEREF _Toc28307 7 HYPERLINK \l _Toc23751 3.2主要算法说明 PAGEREF _Toc23751 7 HYPERLINK \l _Toc30531 3.2.1 GLSurfaceView绘制场景 PAGEREF _Toc30531 7 HYPERLINK \l _Toc626 3.2.2 GLSurfaceView.Renderer进行渲染绘制 PAGEREF _Toc626 8 HYPERLINK \l _Toc29484 3.2.3顶点坐标的定义 PAGEREF _Toc29484 8 HYPERLINK \l _Toc17304 3.2.4线程控制魔方的旋转 PAGEREF _Toc17304 8 HYPERLINK \l _Toc7736 3.2.5加载纹理 PAGEREF _Toc7736 10 HYPERLINK \l _Toc20380 四、程序清单 PAGEREF _Toc20380 11 HYPERLINK \l _Toc18648 4.1 资源清单 PAGEREF _Toc18648 11 HYPERLINK \l _Toc347 4.2 类图 PAGEREF _Toc347 11 HYPERLINK \l _Toc17885 五、调试过程出现的问题及解决办法 PAGEREF _Toc17885 13 HYPERLINK \l _Toc24102 5.1 只能加载一面纹理 PAGEREF _Toc24102 13 HYPERLINK \l _Toc5135 5.2 六个面贴图只要第一个正常 PAGEREF _Toc5135 13 HYPERLINK \l _Toc9589 5.3 用线程控制魔方的单层旋转 PAGEREF _Toc9589 14 HYPERLINK \l _Toc2450 5.4 代码精简 PAGEREF _Toc2450 14 HYPERLINK \l _Toc16191 5.5 将二阶与三阶放在同一个程序中 PAGEREF _Toc16191 14 HYPERLINK \l _Toc14167 5.6 镜像技术的实现 PAGEREF _Toc14167 15 HYPERLINK \l _Toc1573 5.7 想做个花样魔方教程 PAGEREF _Toc1573 15 HYPERLINK \l _Toc11560 六、个人体会及建议 PAGEREF _Toc11560 16 HYPERLINK \l _Toc5066 6.1 OpenGL ES缺乏教程 PAGEREF _Toc5066 16 HYPERLINK \l _Toc19221 6.2 基础很重要 PAGEREF _Toc19221 16 HYPERLINK \l _Toc10509 6.3 没有捷径可走 PAGEREF _Toc10509 17 HYPERLINK \l _Toc29517 七、参考资料 PAGEREF _Toc29517 17一、课程设计介绍1.1、OpenGL ES基础知识OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库,是桌面版本OpenGL 的一个子集。
    OpenGL ES 定义了一个在移动平台上能够支持OpenGL最基本功能的精简标准,以适应如手机,PDA或其它消费者移动终端的显示系统。Khronos Group 定义和管理了OpenGL ES标准。OpenGL ES 支撑绘制的几何图形分为三类:点,线段,三角形。也就是说OpenGL ES 只能绘制这三种基本几何图形。任何错杂的2D或是3D图形都是经由过程这三种几何图形机关而成的。为了提高性能,OpenGL ES通常将顶点,颜色等值存放在java.nio 包中定义的Buffer类中。OpenGL ES供给了两类办法来绘制一个空间几何图形:1、public abstract void glDrawArrays(int mode, int first, int count) 应用VetexBuffer 来绘制,顶点的次序由vertexBuffer中的次序指定。2、public abstract void glDrawElements(int mode, int count, int type, Buffer indices) ,可以从头定义顶点的次序,顶点的次序由indices Buffer 指定。

    以上内容就是[3d旋转魔方]基于opengl的3d旋转魔方.doc的相关内容介绍,喜欢侠外游戏论坛的朋友可以关注我们。
                  12345下一页
    这里是你的个性签名位置,可在“设置”-“个人信息”-“个人签名”处修改。
    沙花按摩
     楼主| 发表于 2020-11-2 07:13:47 | 只看该作者
    对应顶点除了可认为其定义坐标外,还可以指定色彩,材质,法线,纹理等 。对应的传入色彩,顶点,材质,法线的办法如下: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等。

    以上内容就是[3d旋转魔方]基于opengl的3d旋转魔方.doc的相关内容介绍,喜欢侠外游戏论坛的朋友可以关注我们。
                  上一页12345下一页
    这里是你的个性签名位置,可在“设置”-“个人信息”-“个人签名”处修改。
    板凳捶腿
     楼主| 发表于 2020-11-2 07:14:35 | 只看该作者
    onDrawFrame:  定义实际的绘图操作。onSurfaceChanged: 如果设备支持屏幕横向和纵向切换,这个方法将发生在横向纵向互换时。此时可以重新设置绘制的纵横比率。以上内容是建立一个opengl es工程的基础。3.2.3顶点坐标的定义xt, yt, zt,// 0a+xt,yt,zt,//1xt, yt, zt,// 0a+xt,yt,zt,//1a+xt,a+yt,zt,//2xt,a+yt,zt,//3xt,yt,-a+zt,//4a+xt,yt,-a+zt,//5a+xt,a+yt,-a+zt,//6xt,a+yt,-a+zt,//70 ,0, 0,// 00 ,0, 0,// 0a,0,0,//1a,a,0,//20a,0,//30,0,-a,//4a,0,-a,//5a,a,-a,//60,a,-a,//7相当于按照向量(xt,yt,zt)平移3.2.4线程控制魔方的旋转一共三个状态,循环往复new Thread() {public void run() {// 省去一些属性的定义while (true) {while (i = t) && (i = 2 * t && i = 3* t) {i = i - 3 * t;//返回第一个状态}}}}.start();3.2.5加载纹理(0,0(0,0)(1,1)(0,1)(1,0)图片区域定义纹理坐标:float[] texST = new float[] { 0, 0, 0, 1, 1, 0, 1, 1, };将坐标值存放到Buffer中:ByteBuffer tbb = ByteBuffer.allocateDirect(texST.length * 4);tbb.order(ByteOrder.nativeOrder());// 设置字节顺序mTextureBuffer = tbb.asFloatBuffer();// 转换为int型缓冲mTextureBuffer.put(texST);// 向缓冲区中放入顶点着色数据mTextureBuffer.position(0);// 设置缓冲区起始位置开启并绑定纹理gl.glEnable(GL10.GL_TEXTURE_2D); // 开启纹理gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);// 允许使用纹理ST坐标缓冲gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTextureBuffer);// 为画笔指定纹理ST坐标缓冲gl.glBindTexture(GL10.GL_TEXTURE_2D, MySurfaceView.frontId);// 绑定纹理图片过大或过小的纹理映射方式://当图片过小时的纹理映射方法gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR_MIPMAP_NEAREST);//当图片过大时的纹理映射方法gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR_MIPMAP_LINEAR);四、程序清单4.1 资源清单资源名大小(KB)像素用途up.bmp32128*128三阶魔方上面贴图down.bmp32128*128三阶魔方下面贴图left.bmp32128*128三阶魔方左面贴图right.bmp32128*128三阶魔方右面贴图back.bmp32128*128三阶魔方后面贴图front.bmp32128*128三阶魔方前面贴图background.jpg171586*950程序主界面背景图片ic_launcher.png751512*1134程序图标up2.bmp16128*128二阶魔方上面贴图down2.bmp16128*128二阶魔方下面贴图left2.bmp16128*128二阶魔方左面贴图right2.bmp16128*128二阶魔方右面贴图back2.bmp16128*128二阶魔方后面贴图front2.bmp16128*128二阶魔方前面贴图Three.mp32.44MB/三阶魔方背景音乐4.2 类图RotateCube.classMySurfaceView myGLSurfaceView;private SeekBar mSeekBarx;RotateCube.classMySurfaceView myGLSurfaceView;private SeekBar mSeekBarx;private SeekBar mSeekBary ;private SeekBar mSeekBarz ;MediaPlayer mediaPlayer;onCreate()onResume()onPause()Main.classMenuInflater mInflater;onCreate()onCreateOptionsMenu()onOptionsItemSelected()exitAler()Setting.classonCreateySetting.classonCreatey()RotateCubeTwo.classMySurfaceViewTwo myGLSurfaceView2;onCreate()onResume()onPause()CubeVertex.classprivate FloatBuffer mVertexBuffer;CubeVertex.classprivate FloatBuffer mVertexBuffer;private FloatBuffer mVertexBuffer1;private FloatBuffer mVertexBuffer2;private FloatBuffer mVertexBuffer3;private FloatBuffer mVertexBuffer4;private FloatBuffer mVertexBuffer5;private FloatBuffer mTextureBuffer;int vCountpublic float mAngleX;public float mAngleY;public float mAngleZ;float a = 0.9f;CubeVertex()drawSelf()MySurfaceView.classprivate SceneRenderer mRenderer;float cx = 10;float cy = 10;float cz = 40;float tx = 0;float ty = 0;float tz = 0;static int upId;static int downId;static int leftId;static int rightId;static int backId;static int frontId;public float size = 5;public long time = 10;public float seekx;public float seeky;public float seekz;MySurfaceView()initTexture()SceneRenderer.class  CubeVertexTwo.classCubeVertexTwo.classprivate FloatBuffer mVertexBuffer;private FloatBuffer mVertexBuffer1;private FloatBuffer mVertexBuffer2;private FloatBuffer mVertexBuffer3;private FloatBuffer mVertexBuffer4;private FloatBuffer mVertexBuffer5;private FloatBuffer mTextureBuffer;int vCountpublic float mAngleX2;public float mAngleY2;public float mAngleZ2;float a = 1.8f;CubeVertexTwo()drawSelfTwo()MySurfaceView.classMySurfaceView.classprivate SceneRenderer mRenderer;float cx = 10;float cy = 10;float cz = 40;float tx = 0;float ty = 0;float tz = 0;static int upId2;static int downId2;static int leftId2;static int rightId2;static int backId2;static int frontId2;MySurfaceView2()initTexture()SceneRenderer2.classSky.classSky.classfinal float R=11.0f;Private FloatBuffer  mVertexBuffer;private IntBuffer   mColorBuffer;int vCount=0;float yAngle;int xOffset;int zOffset;float scale;Sky()drawSelf()五、调试过程出现的问题及解决办法5.1 只能加载一面纹理 加载一个面的纹理较简单,只需在CubeVertex里面定义一个纹理坐标,然后将其存放进纹理缓冲器buffer里面,在绘制时,将纹理坐标与顶点坐标绑定。

    以上内容就是[3d旋转魔方]基于opengl的3d旋转魔方.doc的相关内容介绍,喜欢侠外游戏论坛的朋友可以关注我们。
                  上一页12345下一页
    这里是你的个性签名位置,可在“设置”-“个人信息”-“个人签名”处修改。
    地板擦鞋
     楼主| 发表于 2020-11-2 07:15:05 | 只看该作者
    但是加载六面纹理我一直束手无策,尝试过用gl.glTexCoordPointer与gl.glBindTexture两个函数绑定六个不同纹理坐标以及纹理ID,但是却一直出错,百思不得其解时,我想到立方体是由6个面构成的,如果直接绘制一个立方体不能实现六个面的贴图,我可以一次绘制一个面,并给其贴图,依次将六个面绘制出了,那么六个面不同纹理的立方体也就出来了。于是我将原本一维的索引数组改为二维数组,并设置6个indexBuffer,存放需要绘制六个面的顶点索引缓存,然后再DrawSelf函数中分六次绘制各个面。每次绘制都绑定不同的索引Buffer以及纹理ID。5.2 六个面贴图只要第一个正常 用了上面的办法之后,运行程序时,立方体的每个面都贴上了不同的图片,可以只要第一个显示的完全正常3d旋转魔方,其它五个面的图片都是扭曲的。刚开始我以为是后面几个的纹理坐标没有对应好,然后不断的改纹理坐标,或者修改索引数组,但是依旧只有第一个面贴图正常。上网查了一下gl.glTexCoordPointer,发现它的纹理坐标是与gl.glVertexPointer对应的,也就是说,其他五个面尽管贴上了不同的图片,但是他们都是从第一个面的几个顶点开始的,只不过在对应的那个面才显示出图片而已。
    在这里就不得不说有关openges的绘图方式了,可以直接利用顶点数组绘制,也可以设置好顶点后,再定义一个索引数组进行绘制。 我最初实现立方体的绘制使用了索引数组,觉得这样只需将立方体的八个顶点定义之后,只需在索引数组里面定义好完成每个面绘制需要的顶点即可,这样直观又简单,减少出错的可能。但是到了六个面纹理的地步,我才想到我可能不得不抛弃这种做法了。于是我删除了所有索引数组以及indexBuffer,将顶点坐标改为二维的,来分别定义绘制六个面时绘制每个面需要的四个点。将gl.gldraweliments??  (具有顶点对应功能)改为drawarray(此时我已经不再需要索引了),运行程序发现每个面都正常贴好了图片。5.3 用线程控制魔方的单层旋转 最初设置二阶魔方的旋转时,设定了魔方单层的三种旋转状态,但是当第三种状态结束之后魔方就停止旋转了,我想魔方能够一直保持这三种状态旋转下去,但是做了很多修改都没用(java里面没有C里面的if end语句)。想到我只是对线程部分代码做修改,每修改一次还有上传到模拟器上安装运行很耗时,于是自己新建WhileDemo.java写了一个与线程部分类似的小程序在电脑上面不断调试。
    这样有许多好处,一个不必改动我工程里面的代码,免得代码太多,出现不必要的错误;二个新建java在代码编辑器里面修改,在cmd命令符里面编译运行,速度快。理清逻辑之后做了几次修改就完成了ABC的循环输出。于是在工程里面根据WhileDemo的内容做了相应改动,发现二阶魔方已经能够循环旋转了。5.4 代码精简基本的一些功能都完成之后我回过头来看自己代码,发现效率很低,有很多冗余。于是对代码对了很多精简,首先我在onSurfaceCreated里面将实例化的立方体放在数组中,于是就可以在onDrawFrame里面用数组完成多个立方体的绘制了。在立方体层与层旋转的线程中,与本是一个个列出需要旋转的层对应的立方体,之后用几个for循环,对代码精简了不少。 在cubevertex里面我声明了mVertexBuffer一直到mVertexBuffer5共六个buffer,然后在drawself里面绘制六次才将立方体绘制出来,我打算设置mVertexBuffer,用循环来精简代码,但一直出错,上网查了一下gl.glVertexPointer里面对数据格式有要求,原来这是精简不了的(起码目前对我来说)。
    未解决部分:在立方体的实例化时,本想利用循环实例化对象得到new CubeVertex(i-1, j-1, k-1),这样仅一个语句就可以实例化所想要的对象,但是一直出错,至今没有找到解决办法。5.5 将二阶与三阶放在同一个程序中三阶的工作完成之后,之前写的二阶的代码一直舍不得丢掉,毕竟是自己花费了好多时间写出来的,所以就想到将二阶与三阶都集合到一个工程里面,提供一个选择界面,可以任意选择展示二阶或者三阶魔方。在原来工程的src里面新建一个文件夹专门安放二阶的class,新建一个文件夹安放主界面class,点击主界面的button调用相关的class,然后实现选择功能,但是调用必须在二阶的class里面import原来的文件夹,这样就造成原来类中的函数与二阶类中函数冲突(我都没有改名),这么一想我还不如直接将二阶与三阶的各函数命名不同,然后就安放在同一个文件夹里面,于是就这么简单地实现了能够二阶与三阶进行选择的功能。5.6 镜像技术的实现在书中看到一例实现镜像技术后,觉得自己的魔方也有必要加入镜像技术,因为在转魔方的时候往往不仅需要看到正对着的面,还需要看到背面的情况。于是我依葫芦画瓢,在CubeVertex里面新定义一个DrawSelfMirror方法,仅比DrawSelf多两句gl.glRotatef(180, 1, 1, 1);//将立方体旋转至背面。
    gl.glTranslatef(3 ,3 3,);//将此方法绘制的立方体移动一个距离。这样确实能够在屏幕上面绘制两个魔方,当看到界面时候我有点小兴奋,以为构想能够实现,但是当转完一圈之后发现mirror绘制出来的魔方被分开了,思考了一下,原来不管怎样,我的坐标原点只有一个,而我定义魔方旋转的方法都是绕着坐标原点进行的。因为最初的这个简陋的思路,导致在后续的完善中出现一些不能解决的问题。如果有时间的话,我一定会换一种思路。5.7 想做个花样魔方教程 当所有的都做好之后再看自己的魔方旋转,觉得仅仅几个被固定的层简单旋转没有什么意思,出了自己有点做出小成就感之外对别人没有任何用处,联想到魔方的一些花样玩法,觉得自己可以通过在线程里面设定好旋转的层以及方向,旋转出各种花样,然后将此软件做成一个魔方花样软件,供用户学习魔方花样玩法时使用。由于花样的旋转过程中各个小立方块的位置问题很麻烦,于是自己将买来的魔方每一个小立方体上面都贴了相应标号。最先准备做一个“回”的花样,可是再魔方旋转了两次之后设置第三次旋转时候,线程里面mAngleX与mAngleZ,好像没有区别了一样,无论设置哪个,最后的效果都是对mAngleX进行设置,直接导致我需要某层绕Z轴旋转,但是它却只绕X轴旋转。

    以上内容就是[3d旋转魔方]基于opengl的3d旋转魔方.doc的相关内容介绍,喜欢侠外游戏论坛的朋友可以关注我们。
                  上一页2345下一页
    这里是你的个性签名位置,可在“设置”-“个人信息”-“个人签名”处修改。
    5位围观
     楼主| 发表于 2020-11-2 07:16:05 | 只看该作者
    这个问题困扰了好久,一直得不到解决。时间也有限,于是我做个魔方花样玩法教程软件的想法就被搁浅了。六、个人体会及建议6.1 OpenGL ES缺乏教程关于OpenGL介绍的书还是能找到,可是介绍OpenGL ES的我就一直找不到了。网上介绍android上opengles编程的也仅仅止步于三角形,少有涉及到立方体的也一般是一个面的纹理贴图,有几个六个面贴图的例子,也与自己最初的方法有悖,只能放弃而自己找解决办法。我整个开发过程都一直是在前行中摸索,摸索中前行。在网上找一切可能有用的资源,然后研究思考;天天泡在图书馆203,把关于android上游戏开发的几本书都摆在面前,一个一个案例去摸索OpenGL ES的用法;加入了多个android论坛,经常问人问题等。幸而最后魔方还是如期完成,报告就要交了,不过我的学习之路并没有止步。6.2 基础很重要做android用的是java语言,大学基础课教的是C,java完全是我凭兴趣自学的,由于时间不怎么够,所以java基础不是太好。在最初的时候总犯一些低级错误,导致运行出错,然后再排错上又话费很多时间。还有就是往往要实现某个功能的时候思路有了,却发现自己因为对java掌握不牢固的原因无法实现。
    有时间在看java书籍的时候又会突然想到某个功能竟可以这么完成,然后马上应用到开发中去。个人建议在最初的阶段要把java基础打好,把书上的习题好好想清楚,一个一个靠自己做出来。这样绝不会浪费时间,磨刀不误砍柴工,java基础决定高级android程序。正式动手时候建议多逛逛论坛,往往很多你需要完成的某些功能在论坛里面已经被别人完成了,那么这个时候你就可以站在巨人的肩膀上高校开发了。推荐一个好的论坛:里面的Android Developers小组,这是我偶然中发现的,进去逛了逛发现国外程序员不仅技术牛,而且他们开发氛围很好,大家一起讨论,并且有耐心给新手提供帮助。有什么问题可以用英文给他们发邮件,一般他们都能给你指导。6.3 没有捷径可走记得课设开始后,大部分人首先做的是找学长们要来了他们当时的报告以及源代码,然后稍作修改。这样很不好,很多人这么做是把这个题目想象的有多么难,其中不乏有些人觉得如果没有别人的代码自己该怎么开始。但是我觉得编程这种事情是没有捷径可以走的。那么做的人的确花了比较少的时间就可能比别人做出了更炫的效果,但实质上自己却什么也没有学到。别人的东西已经做好,你思想就被禁锢了。
    Google android apidemo里面有个Kube,就是一个自动旋转的魔方,光class就有十个,我之前的想法是把那代码稍作修改然后做为自己成果上交,但是尝试了一段时间才发现,理清他的思路就话费了好多时间,然后我还要照着他的思路来作修改,最后上交作品的时候还会很心虚。我感觉这样很不值,于是决定一切靠自己,从贴图,旋转,实例化多个对象,坐标等一系列事情一点一点做起,刚开始很艰难,往往几天没有任何进展,可是随着自己掌握的越来越多,越往后越是手到擒来。最后提醒一点:Android开发里面涉及到从一个类跳转到另一个类时一定要忘记在AndroidManifest注册相关类。七、参考资料[1].JAVA 开发实战经典/李兴华编著,北京,清华大学出版社,2009.8(名师讲坛).[2].吴亚峰,苏亚光,北京,电子工业出版社,Android 3D游戏开发技术详解与典型案例 2011.6.[3].李刚,北京,电子工业出版社,2011.7 疯狂Andrid讲义.

    以上内容就是[3d旋转魔方]基于opengl的3d旋转魔方.doc的相关内容介绍,喜欢侠外游戏论坛的朋友可以关注我们。
                  上一页345
    这里是你的个性签名位置,可在“设置”-“个人信息”-“个人签名”处修改。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    发布主题 上个主题 下个主题 快速回复 收藏帖子 返回列表 搜索

    联系我们|Archiver|手机版|小黑屋|侠外网 ( 豫ICP备13018943号-1 )

    GMT+8, 2024-11-14 14:29 , Processed in 0.045227 second(s), 19 queries , Gzip On, Memcache On.

    Copyright © 2001-2023 侠外游戏论坛 Powered by !Zucsud X3.5

    Support By A mysterious team , A great team ! Email:

    快速回复 返回顶部 返回列表