计算机专业课程设计OPENGL旋转立方体

合集下载

openGL利用顶点数组旋转立方体以及程序

openGL利用顶点数组旋转立方体以及程序
• void key(unsigned char k,int x,int y) • { • if(k=='1')glutIdleFunc(spinCube);
• if(k=='2')glutIdleFunc(NULL); • if(k=='q')exit(0); • } • void main(int argc, char **argv)//主函数 • { • glutInit(&argc, argv); • glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);//设置模式 • glutInitWindowSize(500, 500);//窗口大小 • glutCreateWindow("colorcube"); • glutReshapeFunc(myReshape);//注册重画回调 • glutDisplayFunc(display);//三个回调函数(显示回调) • glutIdleFunc(spinCube); • glutMouseFunc(mouse); • glEnable(GL_DEPTH_TEST);//启用隐藏-面-消去



• • • • • •
glEnableClientState(GL_COLOR_ARRAY);// 调用颜色数组 glEnableClientState(GL_VERTEX_ARRAY);// 调用顶点数组 glVertexPointer(3,GL_FLOAT,0,vertices);//定 点数组变量存放格式 //参数意义:三维对象的颜色,顶点浮点数据类 型,数据元素间隔为0连续存放,数组指针 glColorPointer(3,GL_FLOAT,0,colors);//颜色 数组变量存放格式 glClearColor(1.0,1.0,1.0,1.0); glColor3f(1.0,1.0,1.0); glutMainLoop(); }

从OpenGL图形系统谈计算机图形学的应用领域

从OpenGL图形系统谈计算机图形学的应用领域

科技广场2010.60引言计算机图形学(Computer Graphics,简称CG)是利用计算机处理图形信息的一门学科,包括图形信息的表示、输入输出与显示、图形的几何变换、图形之间的运算以及人机交互绘图等方面的技术。

计算机图形学既是一门科学,它包括一些数学基础和理论,又是一门技术,包括一些技巧和方法。

计算机图形学的研究领域包括图形系统的硬件设备、基本图元的生成技术、图形变换技术、人机交互绘图技术、图形运算和处理技术、实体造型技术和真实图形的表示。

在过去的几十年里,计算机图形学无论是在理论研究,还是在实际应用的深度和广度方面,都取得了令人可喜的成果,其主要推动力来自于图形用户的要求以及软件和硬件技术的突破。

目前,计算机图形学的应用领域多样且范围广泛。

尽管如此,我们仍然可以大致把它划分为四个主要领域:信息的显示、设计、仿真与动画、用户界面。

计算机图形学的许多应用横跨上述两个或多个领域,但图形学的发展还是基于上述四个领域独立工作。

1计算机图形学的应用1.1信息显示传统的图形技术是作为人们之间传递信息的媒介而出现的。

虽然口语和书面语言都能实现类似的目的,但人类视觉系统在数据处理与模式识别方面的作用是无与伦比的。

随着科学技术的迅猛发展,数据量的与日俱增使得人们对数据的分析和处理变得越来越难,人们无法从数据海洋中得到最有用的数据,找到数据的变化规律,提取最本质的特征。

但是如果能将这些数据用图形的形式表示出来,情况就不一样了,事物的发展趋势和本质特征将会很清楚地呈现在人们面前。

现在,超级计算机可以让许多领域中的研究者解决以往看起来似乎不能解决的问题。

科学可视化领域为研究人员理解各自领域里产生的大量数据提供了图形工具。

诸如流体力学、分子生物学和数学、医学等领域产生的大量数据经图形学处理后得到的几何实体可以让研究人员深入了解其复杂过程。

1.2设计设计一直是工程和建筑等领域的专业人员关注的问题。

工程师和建筑师从一系列设计要求出发,寻求一种符合设计要求的既省钱又实用的设计方案。

实现三角体和立方体的旋转

实现三角体和立方体的旋转

实现三角体,正方体的3d效果及自动旋转思路如下:其实要实现三角体,正方体自动旋转效果,只需绘出立方体的三角形与四边形。

在加上gl.glRotatef(angle,x , y, z);就行了。

具体实现如下:Renderer类代码package sim.feel;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.opengl.GLSurfaceView.Renderer;public class MyRender implements Renderer {//google画图单位private int one = 0x10000;//三角体旋转角度private float triangleAngle = 0.5f;//正方体旋转角度private float quaterAngle = 0.5f;//三角体、正方体及其颜色缓冲private IntBuffer triangleBuffer;private IntBuffer quaterBuffer;private IntBuffer triangleColorBuffer;private IntBuffer quaterColorBuffer;// 三角体四个面的顶点private int[] triangle = {0, one, 0,-one, -one, one,one, -one, one,0, one, 0,one, -one, one,one, -one, -one,0, one, 0,one, -one,-one,-one, -one, one,0, one, 0,-one, -one, -one,-one, -one, one};// 正方体8个面得顶点private int[] quater = new int[] { one, one, -one,-one, one, -one,one,one, one,-one, one, one,one, -one, one,-one, -one, one,one,-one, -one,-one, -one, -one,one, one, one,-one, one, one,one, -one, one,-one, -one, one,one, -one, -one,-one, -one, -one,one,one, -one,-one, one, -one,-one, one, one,-one, one, -one,-one, -one, one,-one, -one, -one,one, one, -one,one, one, one,one, -one, -one,one, -one, one,};// 三角体各顶点的颜色(r,g,b,a)private int[] triangleColor = new int[] { // tri 4 faceone, 0, 0, one,0, one, 0, one,0, 0, one, one,one, 0, 0, one,0, one, 0, one,0, 0, one, one,one, 0, 0, one,0, one, 0, one,0, 0,one, one,one, 0, 0, one,0, one, 0, one,0, 0, one, one,};// 正方形各顶点颜色private int[] quaterColor = new int[] { 0, one, 0, one,0, one, 0, one,0,one, 0, one,0, one, 0, one,one, one / 2, 0, one,one, one / 2, 0,one,one, one / 2, 0, one,one, one / 2, 0, one,one, 0, 0, one,one, 0, 0, one,one, 0, 0, one,one, 0, 0, one,one, one, 0, one,one, one, 0, one,one, one, 0, one,one, one, 0, one,0, 0, one,one,0, 0, one, one,0,0, one, one,0,0, one, one,one,0, one, one,one,0, one, one,one,0, one, one,one,0, one, one};//初始化Bufferpublic void init() {ByteBuffer byteBuffer = ByteBuffer.allocateDirect(triangle.length * 4);ByteBuffer byteColorBuffer = ByteBuffer.allocateDirect(triangleColor.length * 4);ByteBuffer byteQuaterBuffer = ByteBuffer.allocateDirect(quater.length * 4);ByteBuffer byteQuterColorBuffer = ByteBuffer.allocateDirect(quaterColor.length * 4);byteBuffer.order(ByteOrder.nativeOrder());byteColorBuffer.order(ByteOrder.nativeOrder());byteQuaterBuffer.order(ByteOrder.nativeOrder());byteQuterColorBuffer.order(ByteOrder.nativeOrder());triangleBuffer = byteBuffer.asIntBuffer();triangleColorBuffer = byteColorBuffer.asIntBuffer();quaterBuffer = byteQuaterBuffer.asIntBuffer();quaterColorBuffer = byteQuterColorBuffer.asIntBuffer();triangleBuffer.put(triangle);triangleColorBuffer.put(triangleColor);quaterBuffer.put(quater);quaterColorBuffer.put(quaterColor);triangleBuffer.position(0);triangleColorBuffer.position(0);quaterBuffer.position(0);quaterColorBuffer.position(0);}@Overridepublic void onDrawFrame(GL10 gl) {// 清除屏幕和深度缓存gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); // 重置gl.glLoadIdentity();// 初始化triangleBuffer与triangleColorBufferinit();// 左移1.5f并向里移6.0fgl.glTranslatef(-1.5f, 0.0f, -6.0f);// 旋转gl.glRotatef(triangleAngle, 0.0f, 1.0f, 0.0f);gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);gl.glEnableClientState(GL10.GL_COLOR_ARRAY);// 设置顶点及颜色gl.glVertexPointer(3, GL10.GL_FIXED, 0, triangleBuffer);gl.glColorPointer(4, GL10.GL_FIXED, 0, triangleColorBuffer);// 绘制for (int i = 0; i < 4; i++) {gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, i * 3, 3);}gl.glFinish();// 重置观察模型gl.glLoadIdentity();gl.glTranslatef(1.5f, 0.0f, -6.0f);gl.glRotatef(quaterAngle, 1.0f, 0.0f, 0.0f);gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer);gl.glColorPointer(4, GL10.GL_FIXED, 0, quaterColorBuffer);// 绘制for (int i = 0; i < 6; i++) {gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, i * 4, 4);}gl.glDisableClientState(GL10.GL_COLOR_ARRAY);gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);// 旋转角度+0.5ftriangleAngle += 0.5f;quaterAngle += 0.5f;}@Overridepublic void onSurfaceChanged(GL10 gl, int width, int height) {float ratio = (float) width / height;gl.glViewport(0, 0, width, height);gl.glMatrixMode(GL10.GL_PROJECTION);gl.glLoadIdentity();gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);gl.glMatrixMode(GL10.GL_MODELVIEW);gl.glLoadIdentity();}@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig arg1) {// 告诉系统对透视进行修正gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); // 黑色背景gl.glClearColor(0, 0, 0, 0);// 启用阴影平滑gl.glShadeModel(GL10.GL_SMOOTH);// 清除深度缓存gl.glClearDepthf(1.0f);// 启用深度测试gl.glEnable(GL10.GL_DEPTH_TEST);// 所做深度测试的类型gl.glDepthFunc(GL10.GL_LEQUAL);} }效果图:。

openGL+VS2010的例程--旋转立方体(三维)

openGL+VS2010的例程--旋转立方体(三维)

openGL+VS2010的例程--旋转⽴⽅体(三维)效果图如上:步骤:⾸先,设置模型视⾓往后退,再旋转视⾓;然后,⽤默认绘制⽴⽅体函数绘制;最后,利⽤空闲对模型做⾓度微调。

实现代码如下:1 #include <GL\glut.h>23 GLfloat xRotated, yRotated, zRotated;45void Display(void)6 {7 glClear(GL_COLOR_BUFFER_BIT);8 glLoadIdentity();9 glTranslatef(0.0,0.0,-4.0);10 glRotatef(xRotated,1.0,0.0,0.0);11 glRotatef(yRotated,0.0,1.0,0.0);12 glRotatef(zRotated,0.0,0.0,1.0);13//glScalef(2.0,1.0,1.0);14 glutWireCube(1.5);15 glFlush(); //Finish rendering16 glutSwapBuffers();17 }1819void Reshape(int x, int y)20 {21if (y == 0 || x == 0) return; //Nothing is visible then, so return22//Set a new projection matrix23 glMatrixMode(GL_PROJECTION);24 glLoadIdentity();25//Angle of view:40 degrees26//Near clipping plane distance: 0.527//Far clipping plane distance: 20.028 gluPerspective(40.0,(GLdouble)x/(GLdouble)y,0.5,20.0);29 glMatrixMode(GL_MODELVIEW);30 glViewport(0,0,x,y); //Use the whole window for rendering31 }32static int times = 0;33void Idle(void)34 {35 times++;36if(times >30000)37 times = 0;3839if(times %30000 == 0)40 {41 xRotated += 0.3;42 yRotated += 0.1;43 zRotated += -0.4;44 Display();45 }46 }474849int main (int argc, char **argv)50 {51//Initialize GLUT52 glutInit(&argc, argv);53 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //For animations you should use double buffering54 glutInitWindowSize(300,300);55//Create a window with rendering context and everything else we need56 glutCreateWindow("Cube example");57 glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);58 xRotated = yRotated = zRotated = 0.0;59 glClearColor(0.0,0.0,0.0,0.0);60//Assign the two used Msg-routines61 glutDisplayFunc(Display);62 glutReshapeFunc(Reshape);63 glutIdleFunc(Idle);64//Let GLUT get the msgs65 glutMainLoop();66return0;67 }。

OpenGL旋转立方体

OpenGL旋转立方体

#include <math.h>#include <windows.h>#include <GL/gl.h>#include <GL/glu.h>#include <gl/glaux.h>#include <stdio.h>#include <io.h>#include <GL/glut.h>#define bool int#define false 0#define true 1#define M_PI 3.1415926int winWidth, winHeight;float angle = 0.0, axis[3], trans[3];bool trackingMouse = false;bool redrawContinue = false;bool trackballMove = false;/* Draw the cube */GLfloat vertices[][3] = {{-1.0,-1.0,-1.0}, {1.0,-1.0,-1.0}, {1.0,1.0,-1.0}, {-1.0,1.0,-1.0}, {-1.0,-1.0,1.0}, {1.0,-1.0,1.0}, {1.0,1.0,1.0}, {-1.0,1.0,1.0} };GLfloat colors[][3] = {{0.0,0.0,0.0}, {1.0,0.0,0.0}, {1.0,1.0,0.0}, {0.0,1.0,0.0},{0.0,0.0,1.0}, {1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0,1.0,1.0}};void polygon(int a, int b, int c , int d, int face){/* draw a polygon via list of vertices */glBegin(GL_POL YGON);glColor3fv(colors[a]);glVertex3fv(vertices[a]);glVertex3fv(vertices[b]);glVertex3fv(vertices[c]);glVertex3fv(vertices[d]);glEnd();}void colorcube(void){/* map vertices to faces */polygon(1,0,3,2,0);polygon(3,7,6,2,1);polygon(7,3,0,4,2);polygon(2,6,5,1,3);polygon(4,5,6,7,4);polygon(5,4,0,1,5);}/* These functions implement a simple trackball-like motion control */float lastPos[3] = {0.0F, 0.0F, 0.0F};int curx, cury;int startX, startY;void trackball_ptov(int x, int y, int width, int height, float v[3]){float d, a;/* project x,y onto a hemisphere centered within width, height */ v[0] = (2.0F*x - width) / width;v[1] = (height - 2.0F*y) / height;d = (float) sqrt(v[0]*v[0] + v[1]*v[1]);v[2] = (float) cos((M_PI/2.0F) * ((d < 1.0F) ? d : 1.0F));a = 1.0F / (float) sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);v[0] *= a;v[1] *= a;v[2] *= a;}void mouseMotion(int x, int y){float curPos[3], dx, dy, dz;trackball_ptov(x, y, winWidth, winHeight, curPos);if(trackingMouse){dx = curPos[0] - lastPos[0];dy = curPos[1] - lastPos[1];dz = curPos[2] - lastPos[2];if (dx || dy || dz) {angle = 90.0F * sqrt(dx*dx + dy*dy + dz*dz);axis[0] = lastPos[1]*curPos[2] - lastPos[2]*curPos[1];axis[1] = lastPos[2]*curPos[0] - lastPos[0]*curPos[2];axis[2] = lastPos[0]*curPos[1] - lastPos[1]*curPos[0];lastPos[0] = curPos[0];lastPos[1] = curPos[1];lastPos[2] = curPos[2];}}glutPostRedisplay();}void startMotion(int x, int y){trackingMouse = true;redrawContinue = false;startX = x; startY = y;curx = x; cury = y;trackball_ptov(x, y, winWidth, winHeight, lastPos);trackballMove=true;}void stopMotion(int x, int y){trackingMouse = false;if (startX != x || startY != y) {redrawContinue = true;} else {angle = 0.0F;redrawContinue = false;trackballMove = false;}}void display(void){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);/* view transform */if (trackballMove){glRotatef(angle, axis[0], axis[1], axis[2]);}colorcube();glutSwapBuffers();}void mouseButton(int button, int state, int x, int y){if(button==GLUT_RIGHT_BUTTON) exit(0);if(button==GLUT_LEFT_BUTTON) switch(state){case GLUT_DOWN:y=winHeight-y;startMotion(x,y);break;case GLUT_UP:stopMotion(x,y);break;}}void myReshape(int w, int h){glViewport(0, 0, w, h);winWidth = w;winHeight = h;}void spinCube(){if (redrawContinue) glutPostRedisplay();}int main(int argc, char **argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(500, 500);glutCreateWindow("colorcube");glutReshapeFunc(myReshape);glutDisplayFunc(display);glutIdleFunc(spinCube);glutMouseFunc(mouseButton);glutMotionFunc(mouseMotion);glEnable(GL_DEPTH_TEST);glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(-2.0, 2.0, -2.0, 2.0, -2.0, 2.0);glMatrixMode(GL_MODELVIEW);glutMainLoop();}。

计算机图形学实验-实验七--三维立方体的旋转

计算机图形学实验-实验七--三维立方体的旋转

贵州大学实验报告学院:计算机科学与信息学院专业:软件工程班级: 102班姓名学号实验组实验时间指导教师成绩实验项目名称实验七三维立方体的旋转实验目的了解并掌握三维立方体的绘制和显示并通过按键控制其旋转,每次旋转150实验要求根据本实验的特点、要求和具体条件,了解并掌握三维立方体的绘制和显示,并通过按键控制其旋转,每次旋转150,成功编写测试代码进行实验。

绘制一个三维立方体。

实验原理Java3D在java3D中坐标轴的显示如下所示:Java3D的编程思想显示如下:在实验时,要引入相关的jar包,显示如下所示:实验环境硬件平台:PC机软件:Windows7平台,eclipse集成开发环境,java编程语言。

Java 3D实验步骤1.掌握算法原理;2.依据算法,编写源程序并进行调试;3.对运行结果进行保存与分析;4.把源程序以文件的形式提交;5.按格式书写实验报告。

实验内容本次实验的核心代码:控制三维立方体旋转的键盘事件class KeyMonitor extends KeyAdapter{public void keyPressed(KeyEvent e) {switch (e.getKeyCode()) {case KeyEvent.VK_X:x -= 0.25f;changeIt();break;case KeyEvent.VK_Y:y -= 0.25f;changeIt();break;case KeyEvent.VK_Z:z -= 0.25f;changeIt();break;}}}搭建框架的一些初始化步骤:protected void initial_setup() {getContentPane().setLayout(new BorderLayout());// 得到框架和设置布局GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();// 得到配置函数Canvas3D canvas3D = new Canvas3D(config);// 创建3d图形的面板getContentPane().add("Center", canvas3D);// 把3d图形面板添加到框架上simpleU = new SimpleUniverse(canvas3D);// 设置3d图形的画布形式rootBranchGroup = new BranchGroup();canvas3D.addKeyListener(new KeyMonitor());//在3d图形的画板上添加监听}设置观察的视角和高光等参数:public void addDirectionalLight(Vector3f direction, Color3f color) {BoundingSphere bounds = new BoundingSphere();bounds.setRadius(1000d);DirectionalLight lightD = new DirectionalLight(color, direction);lightD.setInfluencingBounds(bounds);rootBranchGroup.addChild(lightD);}创建三维正方体的函数:public void addBox(float x, float y, float z, Color3f diffuse, Color3f spec) {Appearance app = new Appearance();// 设置正方体的视角以及绘制参数Material mat = new Material();// 创建节点mat.setDiffuseColor(diffuse);// 设置正方体的轮廓颜色和表面颜色mat.setSpecularColor(spec);mat.setShininess(5.0f);// 超出范围则不显示app.setMaterial(mat);Box box = new Box(x, y, z, app);// 创建正方体TransformGroup tg = new TransformGroup();//建立变换组tg.addChild(box);//把要变换的物体添加进变换组里rootBranchGroup.addChild(tg);tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);tg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);this.tg = tg;}旋转角度的实现函数:private void changeIt() {Transform3D tf = new Transform3D();//建立变换类Quat4f vector = new Quat4f(x, y, z, 2f);//建立旋转变换方法tf.setRotation(vector);//把旋转方法添加进变换类里tg.setTransform(tf);//把变换类添加进变换组里}实验结果说明:因为每次旋转15度,图片变化不明显,所以本次实验的截图是旋转了3次才截的图。

OpenGl绘制一个立方体

OpenGl绘制一个立方体

OpenGl绘制⼀个⽴⽅体OpenGl 绘制⼀个⽴⽅体 为了绘制六个正⽅形,我们为每个正⽅形指定四个顶点,最终我们需要指定6*4=24个顶点。

但是我们知道,⼀个⽴⽅体其实总共只有⼋个顶点,要指定24次,就意味着每个顶点其实重复使⽤了三次,这样可不是好的现象。

最起码,像上⾯这样重复烦琐的代码,是很容易出错的。

稍有不慎,即使相同的顶点也可能被指定成不同的顶点了。

如果我们定义⼀个数组,把⼋个顶点都放到数组⾥,然后每次指定顶点都使⽤指针,⽽不是使⽤直接的数据,这样就避免了在指定顶点时考虑⼤量的数据,于是减少了代码出错的可能性。

// 将⽴⽅体的⼋个顶点保存到⼀个数组⾥⾯ ⽴⽅体的各个顶点的顺序如下图所⽰:1. 定义⽴⽅体的各个顶点数组 将⽴⽅体的⼋个顶点保存到⼀个数组⾥⾯。

这样在指定顶点时,⽤指针,⽽不⽤直接⽤具体的数据。

1// 将⽴⽅体的⼋个顶点保存到⼀个数组⾥⾯2static const GLfloat vertex_list[][3] = {3 -0.5f, -0.5f, -0.5f,40.5f, -0.5f, -0.5f,5 -0.5f, 0.5f, -0.5f,60.5f, 0.5f, -0.5f,7 -0.5f, -0.5f, 0.5f,80.5f, -0.5f, 0.5f,9 -0.5f, 0.5f, 0.5f,100.5f, 0.5f, 0.5f,11 }; 使⽤时可以直接采⽤指针绘制。

1 glBegin(GL_QUADS);2 glVertex3fv(vertex_list[0]);3 glVertex3fv(vertex_list[2]);4 glVertex3fv(vertex_list[3]);5 glVertex3fv(vertex_list[1]);67// ...8 glEnd(); 很容易就看出第0, 2, 3, 1这四个顶点构成⼀个正⽅形。

稍稍观察就可以发现,我们使⽤了⼤量的glVertex3fv函数,其实每⼀句都只有其中的顶点序号不⼀样,因此我们可以再定义⼀个序号数组,把所有的序号也放进去。

计算机图形学 OpenGL 外部图形的的加载、旋转和平移

计算机图形学 OpenGL 外部图形的的加载、旋转和平移

外部图形的加载、旋转和平移1、实验目的和要求外部图形的的加载、旋转和平移2、实验内容用MFC方法和OpengL知识来实现位图和.cur格式图形文件的的加载、旋转和平移。

3、实验步骤1)程序设计Camera.cpp 实现照相机模型与变换。

CoordinateAxis.cpp 实现图中的向量绘制和标注。

MFCGL.cpp 实现的功能相当于主函数调用的功能。

MFCGLView.cpp 主干文件,对图形的编辑的具体实现。

2)程序调试、测试与运行结果分析(1)X视图Y视图Z视图旋转功能平移共能功能选择键,依次为选择、旋转、平移和三种视图。

(2)功能上实现的感觉还可以,基本上已经达到要求,但由于图形文件是从网上下来的,不是自己编辑设计的,而且也不是cad文件,是没有达到题目要求,Win7不能安装CAD软件,这是我自己考虑不周,实验结果还是比较满意的。

4、实验总结此次课程设计,对我的很有挑战。

在课上对文件加载这部分知识没有过多的领会,导致我在网上找了很长时间的加载函数。

后来网上有了个用MFC 加载图形的例子,根据它的截图和关键算法的代码实现,再加上以前对MFC 稍微有点了解,知道函数该添加在什么位置,花了将近一个下午的时间将在RES文件夹中的文件进行了加载、旋转和平移,代码看的不是特别懂,有点糊里糊涂,而且可能对MFC了解的也不是特别深,致使我在编译时错误不断,有时甚至达到了115个错误。

后来原因只是因为一个符号错了,看来还得再细节上多多注意,还有头一次用MFC实现OpengL方法的编程,感觉还好,最起码有结果出来了。

MFC的优点就是框架已经搭建好了,不用在费事去做过多与需求功能无关的事,很多文件都是直接生成的,只需加几个头文件就行了,还有就是添加功能函数。

总体讲收获很大,对自己的编程能力又多了一点自信。

5、附录res/rc2:包含项目使用的附加资源的脚本文件。

1)MFCGLView.cpp文件代码:// MFCGLView.cpp : implementation of the CMFCGLView class//#include "stdafx.h"#include "MFCGL.h"#include "MainFrm.h"#include "MFCGLDoc.h"#include "MFCGLView.h"#include "CoordinateAxis.h"#include <math.h>#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifGLfloat ambientLight[] = { 0.3f, 0.3f,0.3f, 1.0f };GLfloat diffuseLight[] = { 0.7f, 0.7f,0.7f, 1.0f };GLfloat lightPos[] = {-50.0f, 50.0f,100.0f, 1.0f };/////////////////////////////////////////////////////////////////////////////// CMFCGLViewIMPLEMENT_DYNCREATE(CMFCGLView, CView)BEGIN_MESSAGE_MAP(CMFCGLView, CView)//{{AFX_MSG_MAP(CMFCGLView)ON_WM_CREATE()ON_WM_DESTROY()ON_WM_SIZE()ON_WM_TIMER()ON_WM_ERASEBKGND()ON_COMMAND(C_PAN, OnCameraPan)ON_UPDATE_COMMAND_UI(C_PAN, OnUpdateCameraPan)ON_COMMAND(SELECTMODE, OnSELECTMODE)ON_UPDATE_COMMAND_UI(SELECTMODE, OnUpdateSELECTMODE) ON_WM_MOUSEMOVE()ON_WM_KEYDOWN()ON_WM_LBUTTONDOWN()ON_WM_RBUTTONDOWN()ON_COMMAND(C_ROTATE, OnSceneRotate)ON_UPDATE_COMMAND_UI(C_ROTATE, OnUpdateSceneRotate)ON_WM_PAINT()ON_COMMAND(ID_ORTHO, OnOrtho)ON_UPDATE_COMMAND_UI(ID_ORTHO, OnUpdateOrtho)ON_COMMAND(ID_PERSPECTIVE, OnPerspective)ON_UPDATE_COMMAND_UI(ID_PERSPECTIVE, OnUpdatePerspective)ON_COMMAND(ID_X_VIEW, OnXView)ON_COMMAND(ID_Y_VIEW, OnYView)ON_COMMAND(ID_Z_VIEW, OnZView)ON_COMMAND(ID_FREE_VIEW, OnFreeView)ON_UPDATE_COMMAND_UI(ID_X_VIEW, OnUpdateXView)ON_UPDATE_COMMAND_UI(ID_Y_VIEW, OnUpdateYView)ON_UPDATE_COMMAND_UI(ID_Z_VIEW, OnUpdateZView)ON_UPDATE_COMMAND_UI(ID_FREE_VIEW, OnUpdateFreeView)ON_COMMAND(ID_SHOW_COORDINATE_AXIS, OnShowCoordinateAxis) ON_UPDATE_COMMAND_UI(ID_SHOW_COORDINATE_AXIS, OnUpdateShowCoordinateAxis)ON_COMMAND(ID_DRAWMODE_SOLID, OnDrawmodeSolid)ON_UPDATE_COMMAND_UI(ID_DRAWMODE_SOLID, OnUpdateDrawmodeSolid)ON_COMMAND(ID_DRAWMODE_WIRE, OnDrawmodeWire)ON_UPDATE_COMMAND_UI(ID_DRAWMODE_WIRE, OnUpdateDrawmodeWire)ON_WM_SETCURSOR()ON_COMMAND(ID_DRAWMODE_POINTS, OnDrawmodePoints)ON_UPDATE_COMMAND_UI(ID_DRAWMODE_POINTS, OnUpdateDrawmodePoints)ON_COMMAND(ID_DRAWMODE_SILHOUETTE, OnDrawmodeSilhouette) ON_UPDATE_COMMAND_UI(ID_DRAWMODE_SILHOUETTE,OnUpdateDrawmodeSilhouette)ON_COMMAND(ID_DRAWMODE_ORIENTATION_INSIDE, OnDrawmodeOrientationInside)ON_UPDATE_COMMAND_UI(ID_DRAWMODE_ORIENTATION_INSIDE, OnUpdateDrawmodeOrientationInside)ON_COMMAND(ID_DRAWMODE_ORIENTATION_OUTSIDE, OnDrawmodeOrientationOutside)O N_UPDATE_COMMAND_UI(ID_DRAWMODE_ORIENTATION_OUTSIDE, OnUpdateDrawmodeOrientationOutside)ON_COMMAND(ID_DRAWMODE_SHADING_FLAT, OnDrawmodeShadingFlat)ON_UPDATE_COMMAND_UI(ID_DRAWMODE_SHADING_FLAT, OnUpdateDrawmodeShadingFlat)ON_COMMAND(ID_DRAWMODE_SHADING_NONE, OnDrawmodeShadingNone)ON_UPDATE_COMMAND_UI(ID_DRAWMODE_SHADING_NONE, OnUpdateDrawmodeShadingNone)ON_COMMAND(ID_DRAWMODE_SHADING_SMOOTH, OnDrawmodeShadingSmooth)ON_UPDATE_COMMAND_UI(ID_DRAWMODE_SHADING_SMOOTH, OnUpdateDrawmodeShadingSmooth)//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // CMFCGLView construction/destructionCMFCGLView::CMFCGLView(){// TODO: add construction code herem_pShape = gluNewQuadric();m_fLineWidth = 0.05;m_hGLContext = NULL;m_GLPixelIndex = 0;m_Action = SELECT;m_RotateAxis = AXIS_Z;m_bBuildList = FALSE;m_bOrtho = FALSE;m_ViewMode = FREE_VIEW;m_bShowAxis = TRUE;m_bSelection = FALSE;m_nDrawMode = SOLID;m_nDrawOrient = OUTSIDE;m_nShading = SMOOTH;}CMFCGLView::~CMFCGLView(){gluDeleteQuadric(m_pShape);}BOOL CMFCGLView::PreCreateWindow(CREATESTRUCT& cs) {// TODO: Modify the Window class or styles here by modifyingcs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS);return CView::PreCreateWindow(cs);}/////////////////////////////////////////////////////////////////////////////// CMFCGLView drawingvoid CMFCGLView::OnDraw(CDC* pDC){CMFCGLDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data here}/////////////////////////////////////////////////////////////////////////////// CMFCGLView printingBOOL CMFCGLView::OnPreparePrinting(CPrintInfo* pInfo) {// default preparationreturn DoPreparePrinting(pInfo);}void CMFCGLView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {// TODO: add extra initialization before printing}void CMFCGLView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {// TODO: add cleanup after printing}/////////////////////////////////////////////////////////////////////////////// CMFCGLView diagnostics#ifdef _DEBUGvoid CMFCGLView::AssertValid() const{CView::AssertValid();}void CMFCGLView::Dump(CDumpContext& dc) const{CView::Dump(dc);}CMFCGLDoc* CMFCGLView::GetDocument() // non-debug version is inline {ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCGLDoc))); return (CMFCGLDoc*)m_pDocument;}#endif //_DEBUG/////////////////////////////////////////////////////////////////////////////// CMFCGLView message handlersBOOL CMFCGLView::SetWindowPixelFormat(HDC hDC) {PIXELFORMATDESCRIPTOR pixelDesc;pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR); pixelDesc.nVersion = 1;pixelDesc.dwFlags =PFD_DRAW_TO_WINDOW |PFD_SUPPORT_OPENGL |PFD_STEREO_DONTCARE|PFD_DOUBLEBUFFER;pixelDesc.iPixelType = PFD_TYPE_RGBA;olorBits = 32;pixelDesc.cRedBits = 8;pixelDesc.cRedShift = 16;pixelDesc.cGreenBits =8;pixelDesc.cGreenShift =8;pixelDesc.cBlueBits = 8;pixelDesc.cBlueShift = 0;pixelDesc.cAlphaBits = 0;pixelDesc.cAlphaShift = 0;pixelDesc.cAccumBits = 64;pixelDesc.cAccumRedBits = 16;pixelDesc.cAccumGreenBits = 16;pixelDesc.cAccumBlueBits = 16;pixelDesc.cAccumAlphaBits = 0;pixelDesc.cDepthBits = 32;pixelDesc.cStencilBits = 8;pixelDesc.cAuxBuffers = 0;pixelDesc.iLayerType = PFD_MAIN_PLANE;pixelDesc.bReserved = 0;pixelDesc.dwLayerMask = 0;pixelDesc.dwVisibleMask = 0;pixelDesc.dwDamageMask = 0;m_GLPixelIndex = ChoosePixelFormat( hDC, &pixelDesc); if (m_GLPixelIndex==0){m_GLPixelIndex = 1;if (DescribePixelFormat(hDC,m_GLPixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0){return FALSE;}}if (SetPixelFormat( hDC,m_GLPixelIndex,&pixelDesc)==FALSE){return FALSE;}return TRUE;}int CMFCGLView::OnCreate(LPCREATESTRUCT lpCreateStruct) {if (CView::OnCreate(lpCreateStruct) == -1)return -1;HWND hWnd = GetSafeHwnd();HDC hDC = ::GetDC(hWnd);if (SetWindowPixelFormat(hDC)==FALSE)return 0;if (CreateViewGLContext(hDC)==FALSE)return 0;SetTimer(0,100,NULL);return 0;}BOOL CMFCGLView::CreateViewGLContext(HDC hDC){m_hGLContext = wglCreateContext(hDC);if (m_hGLContext == NULL){return FALSE;}if (wglMakeCurrent(hDC, m_hGLContext)==FALSE) {return FALSE;}return TRUE;}void CMFCGLView::OnDestroy(){if(wglGetCurrentContext()!=NULL){wglMakeCurrent(NULL, NULL) ;}if (m_hGLContext!=NULL){wglDeleteContext(m_hGLContext);m_hGLContext = NULL;}CView::OnDestroy();}void CMFCGLView::OnSize(UINT nType, int cx, int cy) {CView::OnSize(nType, cx, cy);GLsizei width, height;GLdouble aspect;width = cx;height = cy;if (cy==0)aspect = (GLdouble)width;elseaspect = (GLdouble)width/(GLdouble)height; m_WHRatio=aspect;glViewport(0, 0, width, height);InitOpenGL();}void CMFCGLView::OnTimer(UINT nIDEvent) {CView::OnTimer(nIDEvent);}//override the virtual function to prevent the window redraw the window client BOOL CMFCGLView::OnEraseBkgnd(CDC* pDC){return FALSE;}void CMFCGLView::OnCameraPan(){m_Action = CAMERA_PAN;m_bSelection = FALSE;}void CMFCGLView::OnUpdateCameraPan(CCmdUI* pCmdUI){pCmdUI->SetCheck(m_Action==CAMERA_PAN);pCmdUI->Enable(m_ViewMode==FREE_VIEW);}void CMFCGLView::OnSELECTMODE(){m_Action = SELECT;m_bSelection = TRUE;}void CMFCGLView::OnUpdateSELECTMODE(CCmdUI* pCmdUI){pCmdUI->SetCheck(m_Action==SELECT);pCmdUI->Enable(m_ViewMode==FREE_VIEW);}void CMFCGLView::OnMouseMove(UINT nFlags, CPoint point) {DisplayWorldCoord(point);if(nFlags==MK_LBUTTON){int rx = point.x-m_OldPoint.x;int ry = point.y-m_OldPoint.y;switch(m_Action){case CAMERA_PAN:m_Camera.Offset(rx/100.0,-ry/100.0,0);break;case SCENE_ROTATE:m_Scene.RotateRoundAxis(rx/10,m_RotateAxis);break;}m_OldPoint=point;Invalidate();}if(nFlags==MK_RBUTTON){int rx=point.x-m_OldPoint.x;switch(m_Action){case CAMERA_PAN:m_Camera.Offset(0,0,rx/100.0);HCURSOR hCursor = NULL;CWinApp *cWinApp = AfxGetApp ();hCursor = cWinApp->LoadCursor (IDC_CUR_ZOOM);::SetCursor(hCursor);break;}m_OldPoint=point;Invalidate();}//DisplayWorldCoord(point);CView::OnMouseMove(nFlags, point);}void CMFCGLView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {if(nChar == VK_TAB && m_Action == SCENE_ROTATE)m_RotateAxis = (m_RotateAxis+1) %3;CView::OnKeyDown(nChar, nRepCnt, nFlags);}void CMFCGLView::OnLButtonDown(UINT nFlags, CPoint point) {m_OldPoint = point;UINT xPos = point.x;WORD yPos = point.y;if(m_bSelection == TRUE){ProcessSelection(xPos, yPos);}CView::OnLButtonDown(nFlags, point);}void CMFCGLView::OnRButtonDown(UINT nFlags, CPoint point) {m_OldPoint = point;HCURSOR hCursor = NULL;CWinApp *cWinApp = AfxGetApp ();if(m_Action == CAMERA_PAN){hCursor = cWinApp->LoadCursor (IDC_CUR_ZOOM);::SetCursor(hCursor);}CView::OnRButtonDown(nFlags, point);}void CMFCGLView::OnSceneRotate(){m_Action = SCENE_ROTATE;m_bSelection = FALSE;}void CMFCGLView::OnUpdateSceneRotate(CCmdUI* pCmdUI) {pCmdUI->SetCheck(m_Action == SCENE_ROTATE);pCmdUI->Enable(m_ViewMode==FREE_VIEW);}void CMFCGLView::OnPaint(){CPaintDC dc(this);glLoadIdentity();glClearColor(0.0,0.0,0.0,1);glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);CheckOrtho();SetViewMode();if(m_bShowAxis){glDisable(GL_DEPTH_TEST);CCoordinateAxis(2,2,2).Display();glEnable(GL_DEPTH_TEST);}RenderScene();SwapBuffers(dc.m_ps.hdc);}void CMFCGLView::OnOrtho(){if(m_bOrtho)return;else{m_bOrtho=TRUE;Invalidate();}}void CMFCGLView::OnUpdateOrtho(CCmdUI* pCmdUI){pCmdUI->SetCheck(m_bOrtho);}void CMFCGLView::OnPerspective(){if(!m_bOrtho)return;else{m_bOrtho=FALSE;Invalidate();}}void CMFCGLView::OnUpdatePerspective(CCmdUI* pCmdUI) {pCmdUI->SetCheck(!m_bOrtho);}void CMFCGLView::InitOpenGL(){glLineWidth(m_fLineWidth);glEnable(GL_LINE_SMOOTH);glFrontFace(GL_CW);glEnable(GL_CULL_FACE);glCullFace(GL_FRONT);glEnable(GL_LIGHTING);glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);glLightfv(GL_LIGHT0, GL_POSITION, lightPos);glEnable(GL_LIGHT0);glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT_AND_BACK,GL_DIFFUSE);glDepthFunc(GL_LESS);glEnable(GL_DEPTH_TEST);glEnable(GL_NORMALIZE);}void CMFCGLView::OnXView(){m_ViewMode = X_VIEW;m_bOrtho = TRUE;Invalidate();}void CMFCGLView::OnYView(){m_ViewMode = Y_VIEW;m_bOrtho = TRUE;Invalidate();}void CMFCGLView::OnZView(){m_ViewMode = Z_VIEW;m_bOrtho = TRUE;Invalidate();}void CMFCGLView::OnFreeView(){m_ViewMode = FREE_VIEW;m_bOrtho = FALSE;Invalidate();}void CMFCGLView::OnUpdateXView(CCmdUI* pCmdUI) {pCmdUI->SetCheck(m_ViewMode == X_VIEW);}void CMFCGLView::OnUpdateYView(CCmdUI* pCmdUI) {pCmdUI->SetCheck(m_ViewMode == Y_VIEW);}void CMFCGLView::OnUpdateZView(CCmdUI* pCmdUI) {pCmdUI->SetCheck(m_ViewMode == Z_VIEW);}void CMFCGLView::OnUpdateFreeView(CCmdUI* pCmdUI) {pCmdUI->SetCheck(m_ViewMode == FREE_VIEW);}void CMFCGLView::SetViewMode(){glMatrixMode(GL_MODELVIEW);switch(m_ViewMode){case X_VIEW:gluLookAt(100,0,0,0,0,0,0,0,1);break;case Y_VIEW:gluLookAt(0,100,0,0,0,0,0,0,1);break;case Z_VIEW:gluLookAt(0,0,100,0,0,0,0,1,0);break;case FREE_VIEW:m_Camera.Apply();gluLookAt(5,5,2,0,0,0,0,0,1);m_Scene.Apply();break;}}void CMFCGLView::CheckOrtho() {if(!m_bOrtho){glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(35,m_WHRatio,1,1000); glMatrixMode(GL_MODELVIEW); }else{glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(-3*m_WHRatio,3*m_WHRatio,-3,3,-1000,1000);glMatrixMode(GL_MODELVIEW);}}void CMFCGLView::OnShowCoordinateAxis(){m_bShowAxis =! m_bShowAxis;Invalidate();}void CMFCGLView::OnUpdateShowCoordinateAxis(CCmdUI* pCmdUI) {pCmdUI->SetCheck(m_bShowAxis);}void CMFCGLView::OnDrawmodeSolid(){// TODO: Add your command handler code herem_nDrawMode = SOLID;InvalidateRect(NULL);}void CMFCGLView::OnUpdateDrawmodeSolid(CCmdUI* pCmdUI) {// TODO: Add your command update UI handler code herepCmdUI->SetCheck (m_nDrawMode == SOLID);}void CMFCGLView::OnDrawmodeWire(){// TODO: Add your command handler code herem_nDrawMode = WIRE;Invalidate();}void CMFCGLView::OnUpdateDrawmodeWire(CCmdUI* pCmdUI) {// TODO: Add your command update UI handler code herepCmdUI->SetCheck (m_nDrawMode == WIRE);}// Parse the selection buffer to see which planet/moon was selected void CMFCGLView::ProcessPlanet(GLuint *pSelectBuff){int id,count;char cMessage[64];count = pSelectBuff[0];id = pSelectBuff[3];if(m_Action == SELECT && m_bSelection){switch(id){case DISK:strcpy(cMessage,"Success: Selected Disk.");break;case SPHERE:strcpy(cMessage,"Success: Selected Sphere.");break;case CONE:strcpy(cMessage,"Success: Selected Cone.");break;case CYLINDER:strcpy(cMessage,"Success: Selected Cylinder.");break;case TEAPOT:strcpy(cMessage,"Success: Selected Teapot.");break;case TORUS:strcpy(cMessage,"Success: Selected Torus.");break;case CUBE:strcpy(cMessage,"Success: Selected Cube.");break;default:strcpy(cMessage,"Error - Nothing was clicked on!");break;}}AfxMessageBox(cMessage,0,0);}#define BUFFER_LENGTH 64void CMFCGLView::ProcessSelection(int xPos, int yPos) {GLuint selectBuff[BUFFER_LENGTH];GLint hits, viewport[4];glSelectBuffer(BUFFER_LENGTH, selectBuff);glGetIntegerv(GL_VIEWPORT, viewport);glMatrixMode(GL_PROJECTION);glPushMatrix();glRenderMode(GL_SELECT);glLoadIdentity();gluPickMatrix(xPos, viewport[3] - yPos, 2,2, viewport); gluPerspective(45.0f, m_WHRatio, 1.0, 425.0);RenderScene();hits = glRenderMode(GL_RENDER);if(hits == 1)ProcessPlanet(selectBuff);glMatrixMode(GL_PROJECTION);glPopMatrix();glMatrixMode(GL_MODELVIEW);}void CMFCGLView::RenderScene(){switch(m_nDrawMode){case SOLID:gluQuadricDrawStyle(m_pShape, GLU_FILL);break;case WIRE:gluQuadricDrawStyle(m_pShape, GLU_LINE);break;case POINTS:gluQuadricDrawStyle(m_pShape, GLU_POINT);break;case SILHOUETTE:gluQuadricDrawStyle(m_pShape, GLU_SILHOUETTE);break;}switch(m_nDrawOrient){case INSIDE:gluQuadricOrientation(m_pShape, GLU_INSIDE);break;case OUTSIDE:gluQuadricOrientation(m_pShape, GLU_OUTSIDE);break;}switch(m_nShading){case NONE:gluQuadricNormals(m_pShape, GLU_NONE);break;case FLAT:gluQuadricNormals(m_pShape, GLU_FLAT);break;case SMOOTH:gluQuadricNormals(m_pShape, GLU_SMOOTH);break;}glMatrixMode(GL_MODELVIEW);glPushMatrix();glInitNames();glPushName(0);glColor3ub(255,255,255);glLoadName(SPHERE);gluSphere( m_pShape, 1, 50, 50 );glPushMatrix();glColor3ub(255,255,255);glTranslatef(-3.0,0.0,0.0);glLoadName(CONE);gluCylinder( m_pShape, 1, 0, 2, 50, 50 );CCoordinateAxis(2,2,2).Display();glPopMatrix();glPushMatrix();glColor3ub(255,255,255);glTranslatef(0.0,2.0,0.0);glLoadName(CYLINDER);gluCylinder( m_pShape, 0.5, 0.5, 2, 50, 50 ); CCoordinateAxis(2,2,2).Display();glPopMatrix();glPushMatrix();glColor3ub(255,255,255);glTranslatef(-2.0,-2.0,0.0);glLoadName(DISK);gluDisk( m_pShape, 0.5, 1, 15, 25 );CCoordinateAxis(2,2,2).Display();glPopMatrix();switch(m_nDrawMode){case WIRE:glPushMatrix();glColor3ub(255,255,255);glTranslatef(2.0,2.0,0.0);glLoadName(TEAPOT);auxWireTeapot(0.5);CCoordinateAxis(2,2,2).Display();glPopMatrix();glPushMatrix();glColor3ub(255,255,255);glTranslatef(-2.0,-2.0,0.0);glLoadName(TORUS);auxWireTorus(0.3, 0.09);CCoordinateAxis(2,2,2).Display(); glPopMatrix();glPushMatrix();glColor3ub(255,255,255);glTranslatef(2.5,0.0,0.0);glLoadName(CUBE);auxWireCube(1.0);CCoordinateAxis(2,2,2).Display(); glPopMatrix();break;case SOLID:glPushMatrix();glColor3ub(255,255,255);glTranslatef(2.5,0.0,0.0);glLoadName(CUBE);auxSolidCube(1.0);CCoordinateAxis(2,2,2).Display(); glPopMatrix();glPushMatrix();glColor3ub(255,255,255);glTranslatef(-2.0,-2.0,0.0);glLoadName(TORUS);auxSolidTorus(0.3,0.09);CCoordinateAxis(2,2,2).Display();glPopMatrix();glPushMatrix();glColor3ub(255,255,255);glTranslatef(2.0,2.0,0.0);glLoadName(TEAPOT);auxSolidTeapot(0.5);CCoordinateAxis(2,2,2).Display();glPopMatrix();break;}glFlush();}BOOL CMFCGLView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message){// TODO: Add your message handler code here and/or call defaultif (nHitTest != HTCLIENT){return CView::OnSetCursor(pWnd, nHitTest, message);}HCURSOR hCursor = NULL;CWinApp *cWinApp = AfxGetApp ();switch (m_Action) {case SCENE_ROTATE:hCursor = cWinApp->LoadCursor (IDC_CUR_ROTATE);break;case CAMERA_PAN:hCursor = cWinApp->LoadCursor (IDC_CUR_MOVE);break;case SELECT:hCursor = cWinApp->LoadCursor (IDC_CUR_SELECT);break;default:hCursor = LoadCursor (NULL, IDC_ARROW);break;}if (hCursor) SetCursor (hCursor);return TRUE;}void CMFCGLView::OnDrawmodePoints(){// TODO: Add your command handler code herem_nDrawMode = POINTS;Invalidate();}void CMFCGLView::OnUpdateDrawmodePoints(CCmdUI* pCmdUI) {// TODO: Add your command update UI handler code herepCmdUI->SetCheck (m_nDrawMode == POINTS);}void CMFCGLView::OnDrawmodeSilhouette(){// TODO: Add your command handler code herem_nDrawMode = SILHOUETTE;Invalidate();}void CMFCGLView::OnUpdateDrawmodeSilhouette(CCmdUI* pCmdUI) {// TODO: Add your command update UI handler code herepCmdUI->SetCheck (m_nDrawMode == SILHOUETTE);}void CMFCGLView::OnDrawmodeOrientationInside(){// TODO: Add your command handler code herem_nDrawOrient = INSIDE;Invalidate();}void CMFCGLView::OnUpdateDrawmodeOrientationInside(CCmdUI* pCmdUI) {// TODO: Add your command update UI handler code herepCmdUI->SetCheck(m_nDrawOrient == INSIDE);}void CMFCGLView::OnDrawmodeOrientationOutside(){// TODO: Add your command handler code herem_nDrawOrient = OUTSIDE;Invalidate();}void CMFCGLView::OnUpdateDrawmodeOrientationOutside(CCmdUI* pCmdUI){// TODO: Add your command update UI handler code herepCmdUI->SetCheck(m_nDrawOrient == OUTSIDE);}void CMFCGLView::OnDrawmodeShadingFlat(){// TODO: Add your command handler code herem_nShading = FLAT;Invalidate();}void CMFCGLView::OnUpdateDrawmodeShadingFlat(CCmdUI* pCmdUI) {// TODO: Add your command update UI handler code herepCmdUI->SetCheck(m_nShading == FLAT);}void CMFCGLView::OnDrawmodeShadingNone(){// TODO: Add your command handler code herem_nShading = NONE;Invalidate();}void CMFCGLView::OnUpdateDrawmodeShadingNone(CCmdUI* pCmdUI) {// TODO: Add your command update UI handler code herepCmdUI->SetCheck(m_nShading == NONE);}void CMFCGLView::OnDrawmodeShadingSmooth(){// TODO: Add your command handler code herem_nShading = SMOOTH;Invalidate();}void CMFCGLView::OnUpdateDrawmodeShadingSmooth(CCmdUI* pCmdUI) {// TODO: Add your command update UI handler code herepCmdUI->SetCheck(m_nShading == SMOOTH);}void CMFCGLView::DisplayWorldCoord(CPoint point){// Display the world coordinates on the status barchar buf[80];CPoint x = point.x;CPoint y = point.y;CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;ASSERT(pFrame);CStatusBar* pStatus = &pFrame->m_wndStatusBar;ASSERT(pStatus);sprintf(buf, "X = %5.2f , Y= %5.2f \n", x, y);pStatus->SetPaneText(1, buf, TRUE);pStatus->Invalidate();}2)Camera.cpp代码#include "stdafx.h"#include "Camera.h"void MyMatrixMult(float* V1,float* V2,float* V3) {glPushMatrix();glLoadMatrixf(V1);glMultMatrixf(V2);glGetFloatv(GL_MODELVIEW_MATRIX,V3); glPopMatrix();}CTransferMatrix::CTransferMatrix(){MyIdentity();}void CTransferMatrix::MyIdentity(){int i;for(i=0;i<16;i++)Matrix[i]=0.0;for(i=0;i<16;i+=5)Matrix[i]=1.0;}void CTransferMatrix::Load(float* M){for(int i=0;i<16;i++)Matrix[i]=M[i];}CScene::CScene(){}void CScene::RotateRoundAxis(float r,int axis){ glPushMatrix();glLoadMatrixf(m_TransferMatrix.Matrix);if(axis==AXIS_X)glRotatef(r,1,0,0);if(axis==AXIS_Y)glRotatef(r,0,1,0);if(axis==AXIS_Z)glRotatef(r,0,0,1);float m_newMatrix[16];glGetFloatv(GL_MODELVIEW_MATRIX,m_newMatrix); m_TransferMatrix.Load(m_newMatrix);glPopMatrix();}void CScene::Apply(){glMultMatrixf(m_TransferMatrix.Matrix);}void CCamera::RotateRoundAxis(float r,int axis){glPushMatrix();glLoadMatrixf(m_TransferMatrix.Matrix);if(axis==AXIS_X)glRotatef(r,1,0,0);if(axis==AXIS_Y)glRotatef(r,0,1,0);if(axis==AXIS_Z)glRotatef(r,0,0,1);float m_newMatrix[16];glGetFloatv(GL_MODELVIEW_MATRIX,m_newMatrix); m_TransferMatrix.Load(m_newMatrix);glPopMatrix();}CCamera::CCamera(){}void CCamera::Offset(float x,float y,float z){glPushMatrix();glLoadIdentity();glTranslatef(x,y,z);float m_tempMatrix[16];float m_newMatrix[16];glGetFloatv(GL_MODELVIEW_MATRIX,m_newMatrix);MyMatrixMult(m_newMatrix,m_TransferMatrix.Matrix,m_newMatrix); m_TransferMatrix.Load(m_newMatrix);glPopMatrix();}void CCamera::Apply(){glMultMatrixf(m_TransferMatrix.Matrix);}。

7.1 旋转立方体——创建三维空间教学设计

7.1 旋转立方体——创建三维空间教学设计
(3)按评分标准进行自评、组评。
课题小结
(3分钟)
(1)引导回顾本课题的学习内容、技术技能要点;
(2)带领学生探索完成任务的新方法。
(1)回顾和总结本课题学习内容。
(2)探索完成任务的新方法。
拓展提升
(2分钟)
布置课后作业“三维盒子的打开”,提示技术要点。
1创建2个空图层
2创建各自的父子关系,制作动画
3渲染导出合成
4整理工程 增加可移植性
(5)提示操作技巧。
(6)辅导和答疑。
(1)观看和倾听教师操作和讲解。
(2)理清空1层和空2层的关系。了解父子关系的用途。
(3)结合教材、完成旋转立方体制作。
展示评价
(17分钟)
(1)展示评价内容及标准
项目
评价标准
得分
(1)视频中的立方体是怎么制作的?
(2)立方体又是怎么进行倾斜旋转的?
(1)观看视频,小组讨论;
(2)小组代表交流讨论结果;
(3)聆听老师的分析。
目标展示
(2分钟)
(1)开启对象的三维属性;
(2)在不同视图中构建对象;
(3)旋转动画的制作;
了解本课题学习内容,明确学习目标。
新课教学
(50分钟)
活动1创建立方体(30分钟
(3)能制作旋转的立方体实例。
素 养
(1)主动学习新知识、新技能技术。
(2)培养学生随时存盘职业习惯。
(3)精益求精的品质意识。
教学重点
对象三维属性的开启、三维对象的构建。
教学难点
利用父子关系制作倾斜旋转的立方体动画。
教学方法
演示法,探究法,小组合作法
教学环境
硬件环境:多媒体机房或者多媒体教室

计算机专业课程设计OPENGL旋转立方体

计算机专业课程设计OPENGL旋转立方体

西安文理学院计算机科学系课程设计报告设计名称:软件课程设计设计题目:旋转立方体的设计学生学号:专业班级:学生姓名:学生成绩:指导教师(职称):课题工作时间:2010.5.31至2010.6.11说明:1、报告中的任务书、进度表由指导教师在课程设计开始前填写并发给每个学生;四、五两项(中英文摘要)由学生在完成综合设计后填写。

2、学生成绩由指导教师根据学生的设计情况给出各项分值及总评成绩。

3、指导教师评语一栏由指导教师就学生在整个设计期间的平时表现、设计完成情况、报告的质量及答辩情况,给出客观、全面的评价。

4、所有学生必须参加课程设计的答辩环节,凡不参加答辩者,其成绩一律按不及格处理。

答辩小组成员应由2人及以上教师组成。

5、报告正文字数一般应不少于3000字,也可由指导教师根据本门综合设计的情况另行规定。

6、平时表现成绩低于6分的学生,取消答辩资格,其本项综合设计成绩按不及格处理。

计算机科学系课程设计任务书1.谭浩强C程序设计(M)(第三版)清华大学出版社20102.严蔚敏.吴伟民数据结构[M] 高等教育20043.钱能C++程序设计教程(M)(第二版)清华大学出版社20094.郑丽Visual Basic程序设计清华大学出版社2009-10-29指导教师:系主任:日期:2010 年 5 月 28 日计算机科学系课程设计进度安排表指导教师签名:2010年5 月 28 日指导教师评语答辩记录表成绩评定表学生姓名:学号:班级:摘要软件工程专业经过两年的课程学习,已经积累了相关高级语言程序设计的基本知识。

画出正方体并使之旋转,这一题目考察了程序设计自顶而下、逐步细化的相关基本思想。

题目难点在于实现可视化界面的交互、以及图像的旋转过程。

分析题目可以得出程序可以大致分为两个方面的内容:1.画出一个正方体。

2.使正方体旋转起来。

经过查找相关资料,本程序采用功能强大的图形库OPENGL并调用一系列WINDOWS API采用C/C++语言在Microsoft Visual C++6.0环境下编写。

几何画板教案(旋转正方体)

几何画板教案(旋转正方体)

几何画板教案(旋转正方体)第一篇:几何画板教案(旋转正方体)几何画板教案课题:制作旋转的正方体教学目标:(1)掌握几何画板下作旋转的正方形(2)正方形的直观图与旋转的正方体教学过程:一)作品展示二)讲授新课例1.旋转的正方形。

[画圆O;构造圆O上的点A;验证:选圆O、A,编辑|按钮/动画,A应绕圆O转动,否则将来正方形不能转动。

构造直线OA;构造圆O、OA的交点C;构造OA、O的垂直线l;构造圆O、l的交点B、D;隐藏直线OA、l;构造线段AB、BC、CD、DA;选点A、圆O;编辑|按钮|动画慢速地动画;双击动画按钮→显示动画。

单击→停止动画。

] 动画0[另B、C、D点可由A绕O点旋转90(或对称变换得到)]例2.作正方形的直观图[按照课本中“450,长不变,宽一半”的斜二测作图原理去制作。

作其水平放置后的对应点。

] [过P作水平直径的垂线得交点O',以O'为中心将P旋转450,再缩一半,得A'点,同理得B'点,再作出其关于O的对称点C'、D',连结后便得水平放置的正方形A'B'C'D'。

让P绕圆O动画则完成其旋转动画。

] BAP'B'OPA'OO'D'C'CD例3.作旋转的正方体 [略,如图] 思考:如何实现虚实变化?三)小结略¶¯»-A'D'B'C'PDABCCC第二篇:《几何画板》教案《几何画板》教案──21世纪的动态几何《几何画板》是一个适用于几何教学的软件,它给人们提供了一个观察几何图形的内在关系,探索几何图形奥妙的环境。

它以点、线、圆为基本元素,通过对这些基本元素的变换、构造、测算、计算、动画、跟踪轨迹等,构造出其它较为复杂的图形。

和其他同类软件相比,几何画板有如下几个优势,使得他成为数学、物理教学中的强有力的工具。

1.动态性。

2.形象性。

3.操作简单。

4.开发软件的速度非常快。

基于OpenGL的3D旋转魔方实现讲解

基于OpenGL的3D旋转魔方实现讲解

华中科技大学电子科学与技术系课程设计报告( 2010-- 2011年度第2 学期)名称:软件课程设计题目:基于OpenGL的3D旋转魔方实现院系:班级:学号:学生姓名:指导教师:设计周数:成绩:日期:年月日目录1.课程设计介绍............................................................................................ (2)1.1目的.............................................................................................................. (2)1.2内容.............................................................................................................. (2)1.3取得的成果 (2)2.程序分析..................................................................................................... (3)2.1 程序原理 (3)2.2 程序流程 (4)2.3 数据结构 (13)2.4 重要函数 (13)3.程序分析与结果演示 (16)3.1 成果演示 (16)3.2 程序分析 (17)4.出现过的问题 (18)5.心得和小节 (19)1.课程设计介绍1.1目的21世纪是高科技时代,是信息技术时代,而计算机技术无疑会引领各行各业,为我们带来一个全新的时代。

作为新世纪的接班人,我们必须拥有良好的计算机应用能力,才能跟上世界发展的大流,不至于在激烈的竞争中被淘汰。

而程序作为计算机的灵魂,因此编程能力对当代大学生来说至关重要。

OpenGL第五课 中文

OpenGL第五课  中文

第五课中文3D空间:我们使用多边形和四边形创建3D物体,在这一课里,我们把三角形变为立体的金子塔形状,把四边形变为立方体。

在上节课的内容上作些扩展,我们现在开始生成真正的3D对象,而不是象前两节课中那样3D世界中的2D对象。

我们给三角形增加一个左侧面,一个右侧面,一个后侧面来生成一个金字塔(四棱锥)。

给正方形增加左、右、上、下及背面生成一个立方体。

我们混合金字塔上的颜色,创建一个平滑着色的对象。

给立方体的每一面则来个不同的颜色。

int DrawGLScene(GLvoid) // 此过程中包括所有的绘制代码{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕及深度缓存glLoadIdentity(); // 重置模型观察矩阵glTranslatef(-1.5f,0.0f,-6.0f); // 左移1.5 单位,并移入屏幕6.0glRotatef(rtri,0.0f,1.0f,0.0f); // 绕Y轴旋转金字塔glBegin(GL_TRIANGLES); // 开始绘制金字塔的各个面有些人可能早已在上节课中的代码上尝试自行创建3D对象了。

但经常有人来信问我:"我的对象怎么不会绕着其自身的轴旋转?看起来总是在满屏乱转。

"要让您的对象绕自身的轴旋转,您必须让对象的中心坐标总是(0.0f,0,0f,0,0f)。

下面的代码创建一个绕者其中心轴旋转的金字塔。

金字塔的上顶点高出原点一个单位,底面中心低于原点一个单位。

上顶点在底面的投影位于底面的中心。

注意所有的面-三角形都是逆时针次序绘制的。

这点十分重要,在以后的课程中我会作出解释。

现在,您只需明白要么都逆时针,要么都顺时针,但永远不要将两种次序混在一起,除非您有足够的理由必须这么做。

我们开始画金字塔的前侧面。

因为所有的面都共享上顶点,我们将这点在所有的三角形中都设置为红色。

OpenGL核心技术之立方体贴图

OpenGL核心技术之立方体贴图

OpenGL 核心技术之立方体贴图OpenGL 核心技术之立方体贴图在这里介绍立方体贴图主要是告诉读者,利用立方体贴图原理,我们可以做很多事情:比如天空盒,环境映射中的反射和折射效果等等。

当然环境映射也可以使用一张纹理贴图实现,这个会在博文的最后给读者介绍,下面开始介绍立方体贴图实现原理。

我们在游戏开发中通常的做法是将2D纹理映射到物体的一个面上,本篇博文介绍的是将多个纹理组合起来映射到一个单一纹理,这就称为立方体贴图。

在介绍立方体贴图前,先解释一下纹理采样,假设我们有一个单位立方体,有个以原点为起点的方向向量在它的中心。

从立方体贴图上使用橘黄色向量采样一个纹理值看起来下图:注意,方向向量的大小无关紧要,一旦提供了方向,OpenGL就会获取方向向量碰触到立方体表面上的相应的纹理像素,这样就返回了正确的纹理采样值。

方向向量触碰到立方体表面的一点也就是立方体贴图的纹理位置,这意味着只要立方体的中心位于原点上,我们就可以使用立方体的位置向量来对立方体贴图进行采样。

然后我们就可以获取所有顶点的纹理坐标,就和立方体上的顶点位置一样。

所获得的结果是一个纹理坐标,通过这个纹理坐标就能获取到立方体贴图上正确的纹理。

下面开始介绍创建立方体贴图,立方体贴图和其他纹理一样,所以要创建一个立方体贴图,在进行任何纹理操作之前,需要生成一个纹理,激活相应纹理单元然后绑定到合适的纹理目标上。

这次要绑定到 GL_TEXTURE_CUBE_MAP纹理类型: [cpp] view plain copyGLuint textureID;glGenTextures(1, &textureID); glBindTexture(GL_TEXTURE_CUBE_MAP, textureID);由于立方体贴图包含6个纹理,立方体的每个面一个纹理,我们必须调用glTexImage2D函数6次,函数的参数和前面教程讲的相似。

然而这次我们必须把纹理目标(target)参数设置为立方体贴图特定的面,这是告诉OpenGL我们创建的纹理是对应立方体哪个面的。

Opengl实验报告及源代码实验五 几何变换

Opengl实验报告及源代码实验五  几何变换

实验报告学生姓名:学号:专业班级:实验类型:□验证□综合□设计□创新实验日期:2018.11 实验成绩:一、实验名称实验五几何变换二、实验内容1.编写程序绘制若干三维物体,将其放置在场景的不同位置,并让物体绕自身的某条轴做旋转运动;2.编写一个可在三维场景中自由移动和改变观察方向的摄像机,利用键盘和鼠标控制摄像机实现三维场景的动态漫游。

三、实验目的1.了解缩放、平移和旋转等模型变换的实现原理,掌握模型变换矩阵的使用方法,能够利用模型变换建立三维场景;2.了解视点变换的实现原理,掌握视点变换与摄像机功能的具体关系和利用视点变换矩阵构造摄像机的具体方法。

3.了解投影变换和视口变换的实现原理,掌握投影变换与视口变换在场景缩放和显示中的作用。

四、实验步骤1.建立立方体几何模型。

定义立方体顶点的位置坐标和纹理坐标,设置不同立方体在世界坐标系中的位置。

// Set up vertex data and attribute pointersGLfloat vertices[] = {-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,0.5f, -0.5f, -0.5f, 1.0f, 0.0f,0.5f, 0.5f, -0.5f, 1.0f, 1.0f,0.5f, 0.5f, -0.5f, 1.0f, 1.0f,-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,0.5f, -0.5f, 0.5f, 1.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 1.0f,0.5f, 0.5f, 0.5f, 1.0f, 1.0f,-0.5f, 0.5f, 0.5f, 0.0f, 1.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,-0.5f, 0.5f, 0.5f, 1.0f, 0.0f,-0.5f, 0.5f, -0.5f, 1.0f, 1.0f,-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,-0.5f, 0.5f, 0.5f, 1.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f,0.5f, 0.5f, -0.5f, 1.0f, 1.0f,0.5f, -0.5f, -0.5f, 0.0f, 1.0f,0.5f, -0.5f, -0.5f, 0.0f, 1.0f,0.5f, -0.5f, 0.5f, 0.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f,-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,0.5f, -0.5f, -0.5f, 1.0f, 1.0f,0.5f, -0.5f, 0.5f, 1.0f, 0.0f,0.5f, -0.5f, 0.5f, 1.0f, 0.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,0.5f, 0.5f, -0.5f, 1.0f, 1.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f,-0.5f, 0.5f, 0.5f, 0.0f, 0.0f,-0.5f, 0.5f, -0.5f, 0.0f, 1.0f };// World space positions of our cubes glm::vec3 cubePositions[] = {glm::vec3(0.0f, 0.0f, 0.0f),glm::vec3(2.0f, 5.0f, -15.0f),glm::vec3(-1.5f, -2.2f, -2.5f),glm::vec3(-3.8f, -2.0f, -12.3f),glm::vec3(2.4f, -0.4f, -3.5f),glm::vec3(-1.7f, 3.0f, -7.5f),glm::vec3(1.3f, -2.0f, -2.5f),glm::vec3(1.5f, 2.0f, -2.5f),glm::vec3(1.5f, 0.2f, -1.5f),glm::vec3(-1.3f, 1.0f, -1.5f)};2.加载立方体模型的顶点数据。

openGL+VS2010的例程--旋转变色立方体(三维)

openGL+VS2010的例程--旋转变色立方体(三维)

openGL+VS2010的例程--旋转变⾊⽴⽅体(三维)效果图如上。

步骤:⾸先,变换模型视⾓;然后,改变颜⾊;最后,利⽤顶点数组绘制⽴⽅体。

源代码如下:#include <GL/glut.h>// 绘制⽴⽅体// 将⽴⽅体的⼋个顶点保存到⼀个数组⾥⾯static const float vertex_list[][3] ={-0.5f, -0.5f, -0.5f,0.5f, -0.5f, -0.5f,-0.5f, 0.5f, -0.5f,0.5f, 0.5f, -0.5f,-0.5f, -0.5f, 0.5f,0.5f, -0.5f, 0.5f,-0.5f, 0.5f, 0.5f,0.5f, 0.5f, 0.5f,};// 将要使⽤的顶点的序号保存到⼀个数组⾥⾯static const GLint index_list[][2] ={{0, 1},{2, 3},{4, 5},{6, 7},{0, 2},{1, 3},{4, 6},{5, 7},{0, 4},{1, 5},{7, 3},{2, 6}};// 绘制⽴⽅体void DrawCube(void){int i,j;glBegin(GL_LINES);for(i=0; i<12; ++i) // 12 条线段{for(j=0; j<2; ++j) // 每条线段 2个顶点{glVertex3fv(vertex_list[index_list[i][j]]);}}glEnd();}static float rotate = 0;static int times = 0;void renderScene(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清理颜⾊缓冲和深度缓冲glMatrixMode(GL_MODELVIEW); // 对模型视景的操作glLoadIdentity(); // 重置当前指定的矩阵为单位矩阵glPushMatrix(); // 压栈//glTranslatef(-0.2, 0, 0); // 平移//glScalef(1, 1, 1); // 缩放times++;if(times > 100){times = 0;}if(times % 100 == 0) // [0, 100){rotate += 0.5; // [0, 20)}glRotatef(rotate, 0, 1, 0); // 旋转glRotatef(rotate, 1, 0, 0);// 动态颜⾊变换--红->绿->蓝->红if(rotate == 0)glColor3f(1, 0, 0);if(rotate ==90)glColor3f(0, 1, 0);if(rotate ==180)glColor3f(0, 0, 1);if(rotate ==270)glColor3f(1, 1, 0);if(rotate ==360)rotate = 0;DrawCube(); // 绘制⽴⽅体glPopMatrix();// 出栈glutSwapBuffers();}int main(int argc, char* argv[]){glutInit(&argc, argv); // 初始化GLUTglutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); glutInitWindowPosition(100, 100); // 显⽰窗⼝在屏幕的相对位置glutInitWindowSize(500, 500); // 设置显⽰窗⼝⼤⼩glutCreateWindow(argv[0]); // 创建窗⼝,附带标题glutDisplayFunc(renderScene); // 注册显⽰⽤的函数glutIdleFunc(renderScene); // 注册空闲⽤的函数glutMainLoop(); // GLUT 状态机return0;}。

旋转式正方体和正四面体

旋转式正方体和正四面体
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glVertex3f(-1.0f,-1.0f,-1.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
glEnd();
glLoadIdentity();
glTranslatef(1.5f,0.0f,-7.0f);
glRotatef(rquad,1.0f,1.0f,1.0f);
wc.hCursor= LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground= NULL;
wc.lpszMenuName= NULL;
wc.lpszClassName= "OpenGL";
if (!RegisterClass(&wc))
{
MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
wc.style= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc= (WNDPROC) WndProc;
wc.cbClsExtra= 0;
wc.cbWndExtra= 0;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

西安文理学院计算机科学系课程设计报告设计名称:软件课程设计设计题目:旋转立方体的设计学生学号:专业班级:学生姓名:学生成绩:指导教师(职称):课题工作时间:2010.5.31至2010.6.11说明:1、报告中的任务书、进度表由指导教师在课程设计开始前填写并发给每个学生;四、五两项(中英文摘要)由学生在完成综合设计后填写。

2、学生成绩由指导教师根据学生的设计情况给出各项分值及总评成绩。

3、指导教师评语一栏由指导教师就学生在整个设计期间的平时表现、设计完成情况、报告的质量及答辩情况,给出客观、全面的评价。

4、所有学生必须参加课程设计的答辩环节,凡不参加答辩者,其成绩一律按不及格处理。

答辩小组成员应由2人及以上教师组成。

5、报告正文字数一般应不少于3000字,也可由指导教师根据本门综合设计的情况另行规定。

6、平时表现成绩低于6分的学生,取消答辩资格,其本项综合设计成绩按不及格处理。

计算机科学系课程设计任务书1.谭浩强C程序设计(M)(第三版)清华大学出版社20102.严蔚敏.吴伟民数据结构[M] 高等教育20043.钱能C++程序设计教程(M)(第二版)清华大学出版社20094.郑丽Visual Basic程序设计清华大学出版社2009-10-29指导教师:系主任:日期:2010 年 5 月 28 日计算机科学系课程设计进度安排表指导教师签名:2010年5 月 28 日指导教师评语答辩记录表成绩评定表学生姓名:学号:班级:摘要软件工程专业经过两年的课程学习,已经积累了相关高级语言程序设计的基本知识。

画出正方体并使之旋转,这一题目考察了程序设计自顶而下、逐步细化的相关基本思想。

题目难点在于实现可视化界面的交互、以及图像的旋转过程。

分析题目可以得出程序可以大致分为两个方面的内容:1.画出一个正方体。

2.使正方体旋转起来。

经过查找相关资料,本程序采用功能强大的图形库OPENGL并调用一系列WINDOWS API采用C/C++语言在Microsoft Visual C++6.0环境下编写。

很好的解决了用C/C++编写图形界面的难点问题。

通过Win32平台的OPENGL API实现了逼真的三维旋转效果关键词:正方体;旋转;可视化;OPENGLAbstractSoftware Engineering after two years course of study, has accumulated a relevant high-level language programming basics. Draw the cube and make it spin, this subject examines the design top-down process, gradually refining the basic idea related.Subject difficulty is to achieve interactive visual interface, and image rotationprocess.Analysis procedures can be drawn subject can be broadly divided into two aspects:1.Draw a cube.2. 2. To make a cube spin.After find relevant information, this program features a powerful graphics library OPENGL and call a WINDOWS API using C / C + + language in Microsoft Visual C + +6.0 environment preparation.Good solution using C / C + + graphical interface written and difficult problems. OPENGL API through the Win32 platform to achieve a realistic three-dimensional rotation effect Keywords:cube;spin;visual;OpenGL西安文理学院计算机科学系课程设计报告目录目录 (I)第一章课题背景 (2)1.1引言 (2)1.1.1背景及目的 (2)1.2题目概述 (2)1.2.1问题及技术要求 (2)1.2.2理论依据及工作内容 (2)第二章设计简介及设计方案论述 (3)2.1设计简介 (3)2.2OPENGL图形库简介 (3)2.2.1 OPENGL历史简介 (3)2.2.2 OPENGL特点 (3)2.2.3 OPENGL工作顺序 (4)2.3OPENGL简单编程方法 (4)2.3.1 OPENGL基本语法 (4)2.3.2 OPENGL状态机制 (4)2.3.3 OPENGL基本结构 (5)2.4程序所使用的OPENGL库函数 (5)2.5OPENGL及WINDOWS坐标系 (6)2.6WINDOWS下配置OPENGL环境 (7)2.7WINDOWS消息机制 (7)2.8大体设计方案 (8)第三章详细设计 (10)3.1OPENGL的绘制工作 (10)3.1.1 OPENGL的初始化工作 (10)3.1.2 OPENGL的主体绘制工作 (10)3.2鼠标控制正方体的旋转 (11)3.3重置OPENGL窗口 (12)3.4WINDOWS中OPENGL窗体设置及创建 (12)3.5完成WINDOWS主程序 (13)第四章设计结果及分析 (14)4.1设计结果分析 (14)4.2进一步美化程序 (14)总结 (15)致谢 (16)参考文献 (17)附录 (18)第一章课题背景1.1引言随着专业课程学习的深入,相关高级语言程序设计的知识已经有所积累,如何更好的掌握并应用已经成为当务之急。

通过软件工程课程设计的过程能够学习程序设计的基本思想以及整体流程。

1.1.1背景及目的基本高级语言程序设计以及相关专业基础课程已经学习完毕,在学习过程中遇到的一些难点问题,为了综合以前学过的课程知识并融会贯通。

可以通过课程设计的独立完成来通过相关途径解决,从而能够更好的掌握程序设计的思想,提升编程能力。

1.2题目概述1.2.1问题及技术要求本题:画出一个正方体,并将它旋转起来。

主要应实现以下4点基本要求:1.用C/C++或VB实现;2.友好性:界面要友好;3.可读性:源程序代码清晰、有层次;4.当鼠标离屏幕中心的位置远近可以决定立方体旋转速度的快慢。

1.2.2理论依据及工作内容题目难点在于实现可视化界面的交互、以及图像的旋转过程。

分析题目可以得出程序可以大致分为两个方面的工作内容:1.画出一个正方体。

2.使正方体旋转起来。

通过在互联网上查找资料,我决定使用OPENGL图形库来解决C/C++编写图形界面困难的问题。

第二章设计简介及设计方案论述2.1设计简介为了实现本程序的两大功能,计划采用OPENGL图形库并调用一系列WINDOWS API采用C/C++语言编写。

首先,应熟悉OPENGL在WIN32平台下的相关API,以及其余WINDOWS窗口交互的相关接口方法,来构建窗口的内容。

其次,熟悉了解OPENGL库函数在窗体中实现绘图(既绘制正方体),实现正方体旋转功能的相关函数。

最后,实现OPENGL与WINDOWS的交互的过程,完成程序及注释。

2.2 OPENGL图形库简介2.2.1 OPENGL历史简介OpenGL是SGI(Silicon Graphics Inc.)公司对IRIS GL进行改进,扩展可移植性,形成的一个跨平台开放式图形编程接口,利用它可以很方便地开发出有多种特殊视觉效果(如光照、纹理、透明、阴影)的三维图形。

由于OpenGL采用类似C语言的语法,所以对于学过C语言的人来说使用起来特别方便。

2.2.2 OPENGL特点从程序开发人员的角度来看,OpenGL 是一组绘图命令的API 集合。

利用这些API 能够方便地描述二维和三维几何物体,并控制这些物体按某种方式绘制到显示缓冲区中。

OpenGL 的API 集合提供了物体描述、平移、旋转、缩放、光照、纹理、材质、象素、位图、文字、交互以及提高显示性能等方面的功能,基本涵盖了开发二、三维图形程序所需的各个方面。

与一般的图形开发工具相比,OpenGL 具有以下几个突出特点:(1)应用广泛(2)跨平台性(3)高质量和高性能(4)出色的编程特性(5)网络透明性2.2.3 OPENGL工作顺序OpenGL 的工作顺序就是一个从定义几何要素到把象素段写入帧缓冲区的过程。

在屏幕上显示图象的主要步骤是以下3 步:1)构造几何要素(点、线、多边形、图像、位图),创建对象的数学描述。

在三维空间放置对象,选择有利的观察点。

2)计算对象的颜色,这些颜色可能直接定义,或由光照条件及纹理间接给出。

3)光栅化,把对象的数学描述和颜色信息转换到屏幕的象素。

2.3 OPENGL简单编程方法2.3.1 OPENGL基本语法OpenGL 基本函数均使用gl 作为函数名的前缀,如glClearColor();实用函数则使用glu 作为函数名的前缀,如gluSphere()。

OpenGL 基本常量的名字以GL_开头,如GL_LINE_LOOP;实用常量的名字以GLU_开头,如GLU_FILL。

一些函数如glColor*()(定义颜色值),函数名后可以接不同的后缀以支持不同的数据类型和格式。

如glColor3b(…)、glColor3d(…)、glColor3f(…)和glColor3bv(…)等,这几个函数在功能上是相似的,只是适用于不同的数据类型和格式,其中3 表示该函数带有三个参数,b、d、f 分别表示参数的类型是字节型、双精度浮点型和单精度浮点型,v 则表示这些参数是以向量(数组)形式出现的。

OpenGL 还定义了一些特殊的类型名,如GLfloat,GLvoid。

它们其实就是C 中的float 和void。

在gl.h 文件中可以看到以下定义:typedef float GLfloat;typedef void GLvoid;……一些基本的数据类型都有类似的定义。

2.3.2 OPENGL状态机制OpenGL 的工作方式是一种状态机制,它可以进行各种状态或模式设置,这些状态或模式在重新改变它们之前一直有效。

例如,当前颜色就是一个状态变量,在这个状态改变之前,绘制的每个象素都将使用该颜色,直到当前颜色被设置为其它颜色为止。

OpenGL 中大量地使用了这种状态机制,如颜色模式、投影模式、单双显示缓存区的设置、背景色的设置、光源的位置和特性等等。

相关文档
最新文档