#include
XXXXXXXX大学(计算机图形学)实验报告 实验名称利用OpenGL实现图形的平移、旋转、缩放 实验时间年月日 专业姓名学号 预习操作座位号 教师签名总评 一、实验目的: 1.了解OpenGL下简单图形的平移、旋转、缩放变换的编程的基本思想; 2.掌握OpenGL下简单图形的平移、旋转、缩放变换的编程的基本步骤; 二、实验原理: 在OpenGL中,可以使用下面三个函数便捷地实现简单图形平移、旋转、缩放变换的功能: glRotatef(theta, vx, vy, vz); glTranslatef(dx, dy, dz); glScalef(sx,sy,sz); 三、实验内容: // 1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "glut.h" #include "math.h" void display() { glClear( GL_COLOR_BUFFER_BIT); // Clear the frame buffer glColor3f( 0.0, 1.0, 1.0); // Set current color to green glBegin( GL_POLYGON); // Draw the triangle glV ertex2f( 0.0, -0.2); glV ertex2f( 0.2, 0.0); glV ertex2f( 0.0, 0.0); glEnd(); glFlush(); } void dsp()
检测鼠标单击 要想在OpenGL中处理鼠标事件非常的方便,GLUT已经为我们的注册好了函数,只要我们提供一个方法。使用函数glutMouseFunc,就可以帮我们注册我们的函数,这样当发生鼠标事件时就会自动调用我们的方法。 函数的原型是: void glutMouseFunc(void(*func)(int button,int state,int x,int y)); 参数: func:处理鼠标click事件的函数的函数名。 从上面可以看到,处理鼠标单击事件的函数,一定有4个参数。第一个参数表明哪个鼠标键被按下或松开,这个变量可以是下面的三个值中的一个: GLUT_LEFT_BUTTON GLUT_MIDDLE_BUTTON GLUT_RIGHT_BUTTON 第二个参数表明,函数被调用发生时,鼠标的状态,也就是是被按下,或松开,可能取值如下: GLUT_DOWN GLUT_UP 当函数被调用时,state的值是GLUT_DOWN,那么程序可能会假定将会有个GLUT_UP事件,甚至鼠标移动到窗口外面,也如此。然而,如果程序调用glutMouseFunc传递NULL作为参数,那么GLUT将不会改变鼠标的状态。 剩下的两个参数(x,y)提供了鼠标当前的窗口坐标(以左上角为原点)。 检测动作 GLUT提供鼠标动作检测能力。有两种GLUT处理的motion:active motion和passive motion。Active motion是指鼠标移动并且有一个鼠标键被按下。Passive motion是指当鼠标移动时,并有没鼠标键按下。如果一个程序正在追踪鼠标,那么鼠标移动期间,每一帧将产生一个结果。 和以前一样,你必须注册将处理鼠标事件的函数(定义函数)。GLUT让我们可以指定两个不同的函数,一个追踪passive motion,另一个追踪active motion。 它们的函数原型如下: void glutMotionFunc(void(*func)(int x,int y)); void glutPassiveMotionFunc(void (*func)(int x,int y)); 参数: Func:处理各自类型motion的函数名。
#pragma comment(lib, "glut32.lib") #pragma comment(lib, "glu32.lib") #pragma comment(lib, "opengl32.lib") #include
} glEnd(); glBegin(GL_LINE_LOOP); //绘制原点小圆for (i = 0; i < circle_points; i++) { angle = 2*PI*i/circle_points; glVertex2f(cos(angle), sin(angle)); } glEnd(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glPointSize(1); glBegin(GL_POINTS); //绘制秒针刻度 for (i = 0; i < circle_point; i++) { angle = 2*PI*i/circle_point; glVertex2f(95*cos(angle), 95*sin(angle)); } glEnd(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glPointSize(5); glBegin(GL_POINTS); //绘制时针刻度 for (i = 0; i < 12; i++) { angle = 2*PI*i/12; glVertex2f(95*cos(angle), 95*sin(angle)); } glEnd(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glColor3f(1.f,1.f,0.f); glPushMatrix(); //绘制秒针 glRotatef(m_rotAngle, 0.0f, 0.0f, 1.0f); glTranslatef(0.0f, 10.0f, 0.0f); glBegin(GL_TRIANGLES); glVertex3f(0, -100, 0); glVertex3f(1, 0, 0); glVertex3f(-1, 0, 0); glEnd(); glPopMatrix(); //绘制分针 glColor3f(1.f,0.f,0.f); glPushMatrix();
(计算机图形学)实验报告 实验名称使用OpenGL画球体 实验时间年月日 专业班级学号姓名 成绩教师评语: 一、实验目的 1、了解并学习open GL的编程; 2、掌握在open GL生成图形的基本思想和基本步骤; 3、使用open GL具体生成简单的三维立体图形; 二、实验原理 简单的说,该实验就是使用数学函数与OpenGL库中的函数实现图形的生成,比如生成球的函数为x=sin(thetar)*cos(phir); y=cos(thetar)*cos(phir); z=sin(phir); 之后在对thetar的值进行定义,使其在某一范围内变化。然后面的集合就生成了我们所需要的球体,但是该实验没有进行光照和材质的设定,所以看起来并不像一个立体的球体形状。其间还需要对OpenGL的编程原理和其所包含的库比较了解。 OpenGL核心库:Windows: OpenGL32。大多数Unix/Linux系统:GL库(libGL.a) OpenGL实用库(Utility Library, GLU):利用OpenGL核心库提供一些功能,从而避免重复编写代码,与窗口系统的连接 OpenGL实用工具库(OpenGL Utility ToolkitLibrary, GLUT),提供所有窗口系统的共同功能,打开窗口,从鼠标和键盘获取输入,弹出菜单,事件驱动。代码可以在平台间移植,但是GLUT缺乏在特定平台上优秀工具包所具有的功能滚动条。 函数的功能glVertex3f(x, y, z),属于GL库参数个数,x, y, z为float。在glVertex3fv(p)中注意每部分的大小写,p为指向float的指针。 绝大多数常数采用#define在头文件gl.h, glu.h和glut.h中定义。注意#include
OpenGL的鼠标交互 一、实验目的 1、掌握OpenGL的鼠标按钮响应函数 2、掌握OpenGL的鼠标移动响应函数 3、进一步巩固OpenGL的基本图元绘制的基础 二、实验环境 硬件要求: PC机,主流配置,最好为独立显卡,显存512M以上。 软件环境: 操作系统:Windows XP。 语言开发工具:Microsoft Visual studio 2008,Visual C++。 三、实验内容与要求 要求:实验课上老师要求的效果截图、及其相应代码拷贝到实验报告文档里。 WORD文档命名方式:学号姓名-实验序号-实验名称。 内容: 1) 鼠标画草图-实现鼠标点到哪,线就画到哪 思路: 1.在主程序注册鼠标响应和鼠标移动子函数 glutMouseFunc(mymouse); glutMotionFunc(mymotion); 放在display注册之后和mainloop之前 2. 在程序头部声明鼠标响应和鼠标移动子函数 void myMouse(int button,int state,int x,int y); void myMotion(int x,int y);
3. 构造鼠标响应子函数 //鼠标按钮响应事件.. void myMouse(int button,int state,int x,int y) { //鼠标左键按下—确定起始点 //鼠标左键松开___画最后一个顶点,画线结束 } 4. 构造鼠标移动子函数 //鼠标移动时获得鼠标移动中的坐标----------------------------------------------------- void myMotion(int x,int y) { // 鼠标移动__线画到哪 } 5. 修改显示函数Display(); 附:画直线程序框架 #include"stdafx.h" #include
O p enGL的基本程序结构 常用的程序设计语言,如C、C++、Pascal、Fortran和Java等,都支持OpenGL的开发。这里只讨论C版本下OpenGL的语法。 程序的基本结构 OpenGL程序的基本结构可分为三个部分: 第一部分是初始化部分。主要是设置一些OpenGL的状态开关,如颜色模式(RGBA或ALPHA)的选择,是否作光照处理(若有的话,还需设置光源的特性),深度检验,裁剪等等。这些状态一般都用函数glEnable(???), glDisable(???)来设置,???表示特定的状态。 第二部分设置观察坐标系下的取景模式和取景框位置大小。主要利用了三个函数: 函数void glViewport(left,top,right,bottom):设置在屏幕上的窗口大小,四个参数描述屏幕窗口四个角上的坐标(以象素表示); 函数void glOrtho(left,right,bottom,top,near,far):设置投影方式为正交投影(平行投影),其取景体积是一个各面均为矩形的六面体; 函数void gluPerspective(fovy,aspect,zNear,zFar):设置投影方式为透视投影,其取景体积是一个截头锥体。
第三部分是OpenGL的主要部分,使用OpenGL的库函数构造几何物体对象的数学描述,包括点线面的位置和拓扑关系、几何变换、光照处理等等。 以上三个部分是OpenGL程序的基本框架,即使移植到使用MFC的Windows程序中,也是如此。只是由于Windows自身有一套显示方式,需要进行一些必要的改动以协调这两种不同显示方式。 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; ……
华中科技大学电子科学与技术系 课程设计报告 ( 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.学习在Visual C++ 6.0 中安装glut库 操作截图: 2. 学习、理解glut库中的基本事件: 测试事件glutDisplayFunc();glutSpecialFunc(); 测试程序: #include
glRotatef(angle,0,0,1); glBegin(GL_LINE_LOOP); glColor3f(1,1,0); for(i=0; i<1000; ++i) glVertex2f(0.5*cos(2*pi/1000*i),0.5*sin(2*pi/1000*i)); glEnd(); glBegin(GL_LINE_LOOP); glColor3f(1,1,0); for(i=0; i<1000; ++i) glVertex2f(-0.75+0.25*cos(2*pi/1000*i),0.25*sin(2*pi/1000*i)); glEnd(); glBegin(GL_LINE_LOOP); glColor3f(1,1,0); for(i=0; i<1000; ++i) glVertex2f(0.75+0.25*cos(2*pi/1000*i),0.25*sin(2*pi/1000*i)); glEnd(); glBegin(GL_LINE_LOOP); glColor3f(1,1,0); for(i=0; i<1000; ++i) glVertex2f(0.25*cos(2*pi/1000*i),-0.75+0.25*sin(2*pi/1000*i)); glEnd(); glBegin(GL_LINE_LOOP); glColor3f(1,1,0); for(i=0; i<1000; ++i) glVertex2f(0.25*cos(2*pi/1000*i),0.75+0.25*sin(2*pi/1000*i)); glEnd(); glPopMatrix(); glFlush(); } void Keyboard(int key, int x, int y) //键盘交互 { if (key == GLUT_KEY_LEFT) { angle+=30; } if (key == GLUT_KEY_RIGHT) {
wp.h #include
立方体的简单三维交互式几何变换 这个学期对opengl的学习,使我对计算机图形学的一些算法过程有了更多的了解。因为对三维图形的显示比较感兴趣,就做了立方体的简单三维交互式几何变换。 功能:键盘的方向键实现立方体的上下左右平移;A键,S键分别实现向前,向后旋转;J键,K键分别实现放大,缩小;C键退出。 程序模块: 1.该模块为绘制一个立方体。 void DrawBox() { glBegin(GL_QUADS); //前面 glColor3f(1,0,0); glVertex3f(-1.0f, -1.0f, 1.0f); // 四边形的左下 glVertex3f( 1.0f, -1.0f, 1.0f); // 四边形的右下 glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的右上 glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左上 // 后面 glColor3f(0,1,0); glVertex3f(-1.0f, -1.0f, -1.0f); // 四边形的右下 glVertex3f(-1.0f, 1.0f, -1.0f); // 四边形的右上
glVertex3f( 1.0f, -1.0f, -1.0f); // 四边形的左下 // 顶面 glColor3f(0,0,1); glVertex3f(-1.0f, 1.0f, -1.0f); // 四边形的左上glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左下glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的右下glVertex3f( 1.0f, 1.0f, -1.0f); // 四边形的右上// 底面 glColor3f(1,1,0); glVertex3f(-1.0f, -1.0f, -1.0f); // 四边形的右上glVertex3f( 1.0f, -1.0f, -1.0f); // 四边形的左上glVertex3f( 1.0f, -1.0f, 1.0f); // 四边形的左下glVertex3f(-1.0f, -1.0f, 1.0f); // 四边形的右下// 右面 glColor3f(0,1,1); glVertex3f( 1.0f, -1.0f, -1.0f); // 四边形的右下glVertex3f( 1.0f, 1.0f, -1.0f); // 四边形的右上glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的左上glVertex3f( 1.0f, -1.0f, 1.0f); // 四边形的左下// 左面 glColor3f(1,0,1);
OpenGL入门教程 1.第一课: 说起编程作图,大概还有很多人想起TC的#include
实验三 OpenGL的简单交互绘制 一、实验目的 1、理解OpenGL坐标系的概念,掌握OpengGL裁剪窗口、视区、显示窗口 的概念和它们之间的关系,学会计算世界坐标和屏幕坐标。 2、学会OpenGL的简单键盘交互操作。 3、学会OpenGL的简单字符绘制。 3、进一步掌握OpengGL点、直线、多边形的绘制。 二、实验环境 硬件要求: PC机,主流配置,最好为独立显卡,显存512M以上。 软件环境: 操作系统:Windows XP。 语言开发工具:Microsoft Visual studio 2008,Visual C++。 程序框架:Win32应用程序 三、实验内容与要求 3.1 键盘交互 1、调出实验一的源代码运行,调整修改使得显示窗口在屏幕中央保持缺省大 小(300*300),绘制的矩形在显示窗口中央。如图2-1所示。 提示: (1)添加修改窗口位置的函数glutInitWindowPosition(int x, int y); 其中(x,y)为窗口左上角在屏幕上的位置。 (2)显示窗口的左下角坐标为(-1,-1),右上角坐标为(1,1)。 图2-1 未修改前的win32初始源程序参考如下: /*my first program.cpp*/ #include"stdafx.h" #include
void display(void); void myreshape(GLsizei w, GLsizei h); int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); char *argv[] = {"hello ", " "}; int argc = 2; // must/should match the number of strings in argv glutInit(&argc, argv); //初始化GLUT库; glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //设置显示模式;(缓冲,颜色类型)glutInitWindowSize(500, 500); glutInitWindowPosition(1024 / 2 - 250, 768 / 2 - 250); glutCreateWindow("Hello"); //创建窗口,标题为“hello”; glutDisplayFunc(display); //用于绘制当前窗口; glutMainLoop(); //表示开始运行程序,用于程序的结尾; return 0; } void display(void) { glClear(GL_COLOR_BUFFER_BIT); //刷新颜色缓冲区 glRectf(-0.5,-0.5,0.5,0.5); glFlush(); //用于刷新命令队列和缓冲区,使所有尚未被执行的OpenGL命令得到执行 } 2、在实验一的基础上添加键盘交互,按W键绘制的矩形上移,按S键矩形 下移,按A键矩形左移,按D键矩形右移,如图2-2。参考步骤如下: (1)在主函数里添加注册键盘回调函数 glutKeyboardFunc(mykeyboard); 此函数可放在 glutDisplayFunc(display);后面。 并在程序头部声明添加键盘回调函数: void mykeyboard(unsigned char key, int x, int y);
石正坤 一、实验目的: 1.了解OpenGL下简单图形的平移、旋转、缩放变换的编程的基本思想; 2.掌握OpenGL下简单图形的平移、旋转、缩放变换的编程的基本步骤; 二、实验原理: 在OpenGL中,可以使用下面三个函数便捷地实现简单图形平移、旋转、缩放变换的功能: glRotatef(theta, vx, vy, vz); glTranslatef(dx, dy, dz); glScalef(sx,sy,sz); 三、实验内容: // 1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "glut.h" #include "math.h" void display() {
glClear( GL_COLOR_BUFFER_BIT); // Clear the frame buffer glColor3f( 0.0, 1.0, 1.0); // Set current color to green glBegin( GL_POLYGON); // Draw the triangle glVertex2f( 0.0, -0.2); glVertex2f( 0.2, 0.0); glVertex2f( 0.0, 0.0); glEnd(); glFlush(); } void dsp() { glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BI T); // Clear the frame buffer glColor3f( 0.0, 1.0, 1.0); // Set current color to green display(); //-------------------------- //平移 glPushMatrix(); glTranslatef(0.5,0.5,0.0); display();
使用方法:新建一个工程,把以下代码拷贝到类文件里。#include "stdafx.h" #include
第24卷第10期 计算机应用与软件 Vol 124No .10 2007年10月 Computer App licati ons and Soft w are Oct .2007 O penG L 实现3D 模型的交互控制 孙妮芳 杨志强 陈 诚 何 斌 龚佩曾 (同济大学计算机系 上海 200092) 收稿日期:2006-12-04。孙妮芳,硕士生,主研领域:虚拟现实技术。 摘 要 简述了3DS 文件的结构,以及在OpenG L 中如何读入和显示3DS 文件的模型,并着重讲述了利用OpenG L 编程接口对场 景中的这些模型进行选择、拾取,通过鼠标拖动对这些模型进行交互操作。关键词 OpenG L 选择 拾取 交互操作 CO NTROL THE 3D MOD EL S I NTERACT I VELY I N O PENGL Sun N ifang Yang Zhiqiang Chen Cheng He B in Gong Peizeng (D epart m ent of Co m puter ,Tongji U niversity,Shanghai 200092,China ) Abstract The structure of 3DS For mat File is outlined,and the way t o read and show the models of 3DS For mat File in OpenG L is p resen 2ted .It is exp lained in detail how the interactive contr ol of the models with the select mode and the feedback mode is realized .Keywords OpenG L Select Picking I nteractive 0 引 言 虚拟实验是当今教育改革比较热门的话题之一,通常意义上讲的虚拟实验建立在真实实验的基础之上,对实验所使用的元器件、,实验者通过鼠标点击与拖曳、键盘操作,可以像对真实元器件一样对虚拟实验设备进行操作,从而完成整个虚拟实验过程。 交互技术是建立虚拟实验要解决的最基本和最重要的问题,交互不仅可以向用户演示信息,同时允许用户向程序传递一些控制信息,比如用户可以通过键盘、鼠标等外设来控制程序的运行。OpenG L 作为一个三维工具软件包,在三维交互编程等方面提供了比较完善的机制。比如,通过OpenG L 的选择、反馈模式比较容易实现通过鼠标键盘进行交互。 目前,已经有不少论文和书籍比较详细地阐述了在OpenG L 中通过选择、拾取和反馈实现对三维物体的交互操作。但对读入和显示多个3DS 文件的模型的交互操作却介绍得比较少。本文根据这一情况并结合实际,在虚拟装机系统中,对场景中的多个元器件模型的交互操作进行详细介绍。 1 3D S 文件介绍 3DS 文件存储了模型的材质信息和几何信息,材质信息主 要包括材质的名称,材质的纹理贴图所对应的文件名以及材质 的颜色等;几何信息主要包括顶点的数目,每个顶点的坐标,三角面的数目,每个三角面上3个顶点的索引,此三角面是否可见等。 3DS 文件由许多块组成,每个块包括信息类别和下一个块的相对位置。块的信息类别用I D 表示,它描述了该块的数据信息。下一个块的相对位置指出了下一个块相对于该块起始位置 的偏移字节数。在块结构中,始终用前2个字节保存I D 号,接下来的4个字节保存块的长度,块的实际内容则用(块长度)6个字节保存。块的内容又可能包含子块。 在OpenG L 中读入3DS 文件的模型的方法有很多,由于本文的程序是在VC ++环境下开发的,所以采用了编写一个类来加载3DS 文件的方法。这样的类很多书籍和网站都有提供,只需进行简单的修改就可以使用,比如修改模型的位置信息以实现模型的移动,增加模型的旋转经度和纬度信息以实现模型的旋转。 2 O penGL 的交互技术 在虚拟装机系统中,要求与场景本身进行更多的交互操作,这种交互除了菜单和对话框实现外,在很多情况下是用鼠标来进行的。OpenG L 的一大功能就是提供了实现交互技术的机制。OpenG L 的交互技术是通过选择、拾取和反馈操作来实现的。 2.1 选 择 选择允许在窗口内部的某个位置用鼠标进行点击,并确定它所点击的是哪个物体。选择是OpenG L 的一种操作模式,选择模式不会改变帧缓存区的内容,退出选择模式时,OpenG L 返回与视景体相交的图元列表,它列出了位于视景体内或与视景体相交的图元,每个图元产生一个选择命中的记录,对应名称堆栈中的当前内容。 ?绘制模式 进入选择模式前,调用函数gl Render M ode (),其原型为:gl Render M ode (G Lenu m mode )。控制应用程序当前所处的模式,即绘图、选择和反馈模式,相应的mode 的取值为G L_RE NDER 、G L _SE LECT 或G L_FEE DBACK 。