基于opengl的3d旋转魔方的实现--终期报告加源码内容摘要:
C 语言知识,也对编程及 3D 设计产生了一定的兴趣,分析问题和解决问题的能力也得到了不小的提高。 而且,我也学到了很多人生的道理。 在做一件看似很难的事时,我14 们要有一个总体的框架,不要有畏难心理。 静下心来,沉着的分析问题,问题总会迎刃而解的。 因此,成功的关键在于你是否拥有这样的心理。 参考文献 [1]孙鑫 VC++深入详解 第三版 北京 电子工业出版社 2020年 126 [2]杨柏林,陈根浪,徐静 OpenGL 编程精粹 第三版 北京 机械工 业出版社 2020年 1121 [3]周纯杰,刘正林,何顶新,周凯波 标准 C 语言程序设计及应用 第二版 武汉 华中科技大学出版社 2020年 1263 [4]Dave Shreiner, The Khronons OpenGLARB Working Group OpenGL编程指南 第七版 北京 机械工业出版社 2020年 21328 15 附上源码 第一个文件 头文件 ifndef _MO_FANG_H_ define _MO_FANG_H_ include // windows 的头文件 include include gl/ // 包含 OpenGL 核心库 include gl/ // 包含 OpenGL 实用库 include gl/ // 包含 OpenGL 辅助库 include // 包含数学函数库 define PI2 define CYCLE_COUNT 90 define MAX_CHAR 128 //用于在窗口显示文字而定义的常数 define FRONT 0 define BACK 1 define LEFT 2 define RIGHT 3 define TOP 4 define BOTTOM 5 typedef struct { GLfloat vx,vy,vz。 16 }CubeVertex。 typedef struct { GLfloat p[3]。 }stPoint。 typedef struct { stPoint CubePoint[8]。 }stCube。 void reset_model()。 void Rotate_ZM()。 void Rotate_ZZ()。 void Rotate_ZP()。 void Rotate_XM()。 void Rotate_XZ()。 void Rotate_XP()。 void Rotate_YM()。 void Rotate_YZ()。 void Rotate_YP()。 void Rotate_Z(int ii)。 17 void Rotate_Y(int ii)。 void Rotate_X(int ii)。 void enable_X_roatate(int direction)。 void enable_Y_roatate(int direction)。 void enable_Z_roatate(int direction)。 void selectFont(int size, int charset, const char* face)。 void drawCNString(const char* str)。 void drawString(const char* str)。 extern stCube Cube[27]。 extern int rotAngle。 extern int rotCount。 extern int rotX,rotY,rotZ。 extern GLfloat Vx,Vy。 endif 第二个文件 /* * 这个 cpp 文件包含三阶魔方变换的常规函数 * 作者为张世清 学 号 U202020185 * 华中科技大学电子系集成 1001 班 * 当然成果还离不开组员徐兮、雷韦拉以及何兆华的支持 */ //加入自己编写的魔方头文件,其中包含一些变量定义与函数声明 include //对立方体各顶点编号 18 static stPoint CubePoint[8]= { { , , }, //0 { , , }, //1 {, , }, //2 {, , }, //3 {, , }, //4 {, , }, //5 {, , }, //6 {, , }, //7 }。 extern int cs。 stCube Cube[27]。 //定义一个 3 阶魔方 stCube Static_Cube[27]。 //定义一个静态的 3 阶魔方 //旋转控制 int rotAngle = 1。 //旋转角度 int rotCount。 //一个旋转周期内旋转次数 CYCLE_COUNT = 90/rotAngle。 int rotX,rotY,rotZ。 //指定那个轴旋转 int rotDirect=1。 //正反向旋转 //对当前魔方各个立方体进行编号 BYTE ZP[9] = {0,1,2,3,4,5,6,7,8}。 //z 轴方向正向一层 BYTE ZZ[9] = {9,10,11,12,13,14,15,16,17}。 //z 轴方向中间一层 BYTE ZM[9] = {18,19,20,21,22,23,24,25,26}。 //z 轴方向负向一层 BYTE YM[9] = {0,1,2,11,10,9,18,19,20}。 //y 轴方向负向一层 BYTE YZ[9] = {3,4,5,14,13,12,21,22,23}。 //y 轴方向中 间一层 19 BYTE YP[9] = {6,7,8,17,16,15,24,25,26}。 //y 轴方向正向一层 BYTE XM[9] = {2,3,8,17,12,11,20,21,26}。 //x 轴方向正向一层 BYTE XZ[9] = {1,4,7,16,13,10,19,22,25}。 //x 轴方向中间一层 BYTE XP[9] = {0,5,6,15,14,9,18,23,24}。 //x 轴方向负向一层 //对静态魔方各个立方体进行编号 const BYTE SZP[9] = {0,1,2,3,4,5,6,7,8}。 //z 轴方向正向一层 const BYTE SZZ[9] = {9,10,11,12,13,14,15,16,17}。 //z 轴方向中间一层 const BYTE SZM[9] = {18,19,20,21,22,23,24,25,26}。 //z 轴方向负向一层 const BYTE SYM[9] = {0,1,2,11,10,9,18,19,20}。 //y 轴方向负向一层 const BYTE SYZ[9] = {3,4,5,14,13,12,21,22,23}。 //y 轴方向中间一层 const BYTE SYP[9] = {6,7,8,17,16,15,24,25,26}。 //y 轴方向正向一层 const BYTE SXM[9] = {2,3,8,17,12,11,20,21,26}。 //x 轴方向正向一层 const BYTE SXZ[9] = {1,4,7,16,13,10,19,22,25}。 //x 轴方向中间一层 const BYTE SXP[9] = {0,5,6,15,14,9,18,23,24}。 //x 轴方向负向一层 void Rotate(stCube *pCube,float angle,float x0,float y0,float z0)。 //声明旋转函数 //判断两个立方体是否重合,即判断两个立方体所包含的所有顶点坐标是否相同 int is_equal(stCube *pc1,stCube *pc2){ float x1,x2,y1,y2,z1,z2。 int isFind = 0。 for( int i=0。 i8。 i++) { x1 = pc1CubePoint[i].p[0]。 y1 = pc1CubePoint[i].p[1]。 z1 = pc1CubePoint[i].p[2]。 isFind = 0。 for(int j=0。 j8。 j++) 20 { x2 = pc2CubePoint[j].p[0]。 y2 = pc2CubePoint[j].p[1]。 z2 = pc2CubePoint[j].p[2]。 if( fabs(x1 x2)1e1 amp。 amp。 fabs(y1y2)1e1 amp。 amp。 fabs(z1z2)1e1) { pc1CubePoint[i].p[0] = pc2CubePoint[j].p[0]。 //消除累计误差 pc1CubePoint[i].p[1] = pc2CubePoint[j].p[1]。 pc1CubePoint[i].p[2] = pc2CubePoint[j].p[2]。 isFind = 1。 break。 } } if( isFind == 0) return 0。 } return 1。 } //旋转之后,查找当前旋转面里面包含新的角点 void Update_Cube_index() { int i,j,k=0。 //根据逐一判断立方体是否重合来更新每一层所包含的立方体的索引,总共三个方向有九层 k =0。 for( i=0。 i9。 i++) { for( j=0。 j27。 j++) if( is_equal( amp。 Cube[j], amp。 Static_Cube[ SZM[i] ] ) ) { ZM[k++] = j。 } 21 } k=0。 for(i=0。 i9。 i++) { for(j=0。 j27。 j++) if(is_equal( amp。 Cube[j], amp。 Static_Cube[ SZZ[i] ] )) { ZZ[k++]=j。 } } k = 0。 for( i=0。 i9。 i++) { for( j=0。 j27。 j++) if( is_equal( amp。 Cube[j] , amp。 Static_Cube[ SZP[i] ] ) ) { ZP[k++] = j。 } } k =0。 for( i=0。 i9。 i++) { for( j=0。 j27。 j++) if( is_equal( amp。 Cube[j], amp。 Static_Cube[ SXM[i] ] ) ) { XM[k++] = j。 } } k =0。 for( i=0。 i9。 i++) 22 { for( j=0。 j27。 j++) if( is_equal( amp。 Cube[j], amp。 Static_Cube[ SXZ[i] ] ) ) { XZ[k++] = j。 } } k = 0。 for( i=0。 i9。 i++) { for(j=0。 j27。 j++) if( is_equal( amp。 Cube[j], amp。 Static_Cube[ SXP[i] ] ) ) { XP[k++] = j。 }。基于opengl的3d旋转魔方的实现--终期报告加源码
相关推荐
.................. 30 哈尔滨理工大学学士学位论文 VI 报警主机的安装原则 ................................................................... 30 报警器防范范围 .......................................................................
而产生的,它是一个由可多到 65000 个无线数传模块组成的一个无线数传网络平台,十分类似现有的移动通信的 CDMA 网或 GSM 网,每一个 Zigbee 网络数传 模块类似移动网络的一个基站,在整个网络范围内,它们之间可以进行相互通信。 每个网络节点间的距离可以从标准的 75米,到扩展后的几百米,甚至几公里。 另外整个 Zigbee 网络还可以与现有的其它的各种网络连接。 Zigbee
OpenGL 需要的动态链接库 OpenGL 需要的头文件 OpenGL 指的是开放图形程序库 (Open Graphics Library),是由 Silicon Graphics Incorporated(SGI 公司 )为其图形工作站 IRIS 开发的一种快速的、高质量的 3D 图形软件,是近几年 发展起来的一个性能卓越的三维图形平台。 它的独立性、开放性、前瞻性和跨平台性。 它被集成到
产生大量的娱乐节目和效果。 手机、数码相机等消费电子产品中,基于人脸的娱乐项目越来越丰富。 、 MSN等即时通信 工具以及虚拟化身网络游戏也是人脸合成技术的广阔市场。 另外还有家庭娱乐。 家庭娱乐是指能够识别主人身份的智能玩具,家政机器人,具有真实面像的虚拟游戏玩家等。 随着电子技术水平的提高,家庭娱乐会得到广泛的应用,其中的关键技术之一也是人脸的跟踪识别。 (3)图像搜索 目前, Google
商品信息管理 管理员可以在该功能模块下进行商品信息的编辑,发布新的产品信息删除已经上架的产品,可以随着市场走向来定义自己的产品信息满足消费者追求新鲜的需求,提升自己的市场竞争能力。 ( 3) 商城分类 商城分为四个分类商城可以在任意分类商城下增添子商城分类信息,可以修改和删除过时或失效的子商城 分类。 同时可以移动子商城到其他的分类商城下。 4 便于商家自行调整销售模式和搭配。
点就是采用异步式 I/O 与事件驱动的架构设计。 传统架构对于高并发的解决方案是采用多线程模型,也就是一个系统线程处理一个业务逻辑,通过系统线 程切方式弥补同步式 I/O 的时间开销。 采用的是单线程模型通过异步式的请求方式处理 I/O 调用,减少了切换上下文次数所造成的开销。 运行的过程中将管理一个事件堆栈,不断地循环执行事件然后等待下一个事件的触发。 异步式 I/O