基于OpenGL的烟花粒子系统设计

基于OpenGL的烟花粒子系统设计
基于OpenGL的烟花粒子系统设计

计算机图形学OpenGL中绘制太阳_地球_月亮的运动模型源代码

#include static int day = 148; // day的变化:从0到359 void myDisplay(void) { glEnable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(75, 1, 1, 400000000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0, -200000000, 200000000, 0, 0, 0, 0, 0, 1); // 红色的“太阳” glColor3f(1.0, 0.0, 0.0); glutSolidSphere(69600000, 100, 100); // 蓝色的“地球” glColor3f(0.0, 0.0, 1.0); glRotatef(day/360.0*360.0, 0.0, 0.0, -1.0); glTranslatef(150000000, 0.0, 0.0); glutSolidSphere(15945000, 100, 100); // 黄色的“月亮” glColor3f(1.0, 1.0, 0.0); glRotatef(day/30.0*360.0 - day/360.0*360.0, 0.0, 0.0, -1.0); glTranslatef(38000000, 0.0, 0.0); glutSolidSphere(4345000, 100, 100); glFlush(); glutSwapBuffers(); } void myIdle(void) { ++day; if( day >= 360 ) day = 0; myDisplay(); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); glutInitWindowPosition(100, 100); glutInitWindowSize(450, 450);

简单Opengl时钟时钟源代码 可以运行

#pragma comment(lib, "glut32.lib") #pragma comment(lib, "glu32.lib") #pragma comment(lib, "opengl32.lib") #include #include #define PI 3.14159 GLfloat m_rotAngle=0.0; void Display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLineWidth(5); GLfloat i,angle; GLint circle_points = 100; GLint circle_point = 60; glBegin(GL_LINE_LOOP); //绘制闹钟的外圆for (i = 0; i < circle_points; i++) { angle = 2*PI*i/circle_points; glVertex2f(100*cos(angle), 100*sin(angle));

} 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的基本程序结构

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; ……

opengl绘制教室大作业源代码wp

wp.h #include // Windows的头文件 #include // 包含OpenGL实用库 #include// 标准输入/输出库的头文件 #include// GLaux库的头文件 #include #include #include #include //..................................定义变量区............................................................// //.............................用于场景漫游有关变量........................................// GLfloat xrot=0.0f;// X 旋转量 GLfloat yrot=0.0f;// Y 旋转量 GLfloat x=0.0f;// X 平移量 GLfloat y=0.0f;// Y 平移量 GLfloat z=-40.0f;// 深入屏幕的距离 //.............................用于键盘操作有关变量.......................................// BOOL light=TRUE;// 光源的开/关 BOOL lp;// L键按下了么? BOOL fp;// F键按下了么? BOOL TurnOn=FALSE; // 开灯GLUquadricObj *qobj; int fantheta=0; // 风扇转过角度 HGLRC hRC=NULL;// 窗口着色描述表句柄 HDC hDC=NULL;// OpenGL渲染描述表句柄 HWND hWnd=NULL;// 保存我们的窗口句柄 HINSTANCE hInstance;// 保存程序的实例 bool keys[256];// 保存键盘按键的数组 bool active=TRUE;// 窗口的活动标志,缺省为TRUE bool fullscreen=TRUE;// 全屏标志缺省,缺省设定成全屏模式 //.................................光照材质有关变量......................................//

_OpenGL入门教程

OpenGL入门教程 1.第一课: 说起编程作图,大概还有很多人想起TC的#include 吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率、16色来做吗?显然是不行的。 本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物。 OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。 1、与C语言紧密结合。 OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。 2、强大的可移植性。 微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机)。而OpenGL不仅用于Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL的基本命令都做到了硬件无关,甚至是平台无关。 3、高性能的图形渲染。 OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。 总之,OpenGL是一个很NB的图形软件接口。至于究竟有多NB,去看看DOOM3和QUAKE4等专业游戏就知道了。 OpenGL官方网站(英文) https://www.360docs.net/doc/7c7838534.html, 下面我将对Windows下的OpenGL编程进行简单介绍。 学习OpenGL前的准备工作 第一步,选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL 的。但这里我们选择Visual Studio 2005作为学习OpenGL的环境。 第二步,安装GLUT工具包 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。 Windows环境下的GLUT下载地址:(大小约为150k) https://www.360docs.net/doc/7c7838534.html,/resources/libraries/glut/glutdlls37beta.zip 无法从以上地址下载的话请使用下面的连接: https://www.360docs.net/doc/7c7838534.html,/upfile/200607311626279.zip Windows环境下安装GLUT的步骤: 1、将下载的压缩包解开,将得到5个文件

计算机专业图形学openGL五角星代码

// 填充五角星.cpp : Defines the entry point for the console application. // wujiaoxing.cpp : Defines the entry point for the console application. #include "stdafx.h" #include "gl/glut.h" #include #include #include void display(void){ glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POL YGON); double y=sin(3.15/5)*tan(3.14/5)-cos(3.14/5); glVertex2f(0,y); glVertex2f(-sin(3.14/5),-cos(3.14/5)); glVertex2f(cos(3.14/10)*y,sin(3.14/10)*y); glVertex2f(-cos(3.14/10),sin(3.14/10)); glVertex2f(sin(3.14/5)*y,-cos(3.14/5)*y); glVertex2f(0,1); glVertex2f(-sin(3.14/5)*y,-cos(3.14/5)*y); glVertex2f(cos(3.14/10),sin(3.14/10)); glVertex2f(-cos(3.14/10)*y,sin(3.14/10)*y); glVertex2f(sin(3.14/5),-cos(3.14/5)); glEnd(); glEnd(); glFlush(); } void init(void) { glClearColor(0.0,0.0,0.0,0.0); glColor3f(255.0,0,0.0); } void main(int argc,char * * argv){ glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(400,400); glutInitWindowPosition(0,0); glutCreateWindow("sample"); glutDisplayFunc(display); init();

OpenGL入门学习——第一课 编写第一个OpenGL程序

OpenGL入门学习——第一课编写第一个OpenGL程序 OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。 1、与C语言紧密结合。 OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL 是容易理解和学习的。如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。 2、强大的可移植性。 微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机)。而OpenGL不仅用于Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL的基本命令都做到了硬件无关,甚至是平台无关。 3、高性能的图形渲染。 OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。 总之,OpenGL是一个很NB的图形软件接口。至于究竟有多NB,去看看DOOM3和QUAKE4等专业游戏就知道了。 OpenGL官方网站(英文) https://www.360docs.net/doc/7c7838534.html, 下面我将对Windows下的OpenGL编程进行简单介绍。 学习OpenGL前的准备工作 第一步,选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL的。但这里我们选择Visual Studio 2005作为学习OpenGL的环境。 第二步,安装GLUT工具包 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。Windows环境下的GLUT下载地址:(大小约为150k) https://www.360docs.net/doc/7c7838534.html,/resources/libraries/glut/glutdlls37beta.zip 无法从以上地址下载的话请使用下面的连接: https://www.360docs.net/doc/7c7838534.html,/upfile/200607311626279.zip Windows环境下安装GLUT的步骤: 1、将下载的压缩包解开,将得到5个文件 2、在“我的电脑”中搜索“gl.h”,并找到其所在文件夹(如果是VisualStudio2005,则应该是其安装目录下面的“VC\PlatformSDK\include\gl文件夹”)。把解压得到的glut.h放到这个文件夹。 3、把解压得到的glut.lib和glut32.lib放到静态函数库所在文件夹(如果是VisualStudio2005,则应该是其安装目录下面的“VC\lib”文件夹)。 4、把解压得到的glut.dll和glut32.dll放到操作系统目录下面的system32文件夹内。(典型的位置为:C:\Windows\System32) 第三步,建立一个OpenGL工程 这里以VisualStudio2005为例。 选择File->New->Project,然后选择Win32 Console Application,选择一个名字,然后按OK。

OpenGL库函数一览表

OpenGL库函数列表 OpenGl核心函数库 glAccum 操作累加缓冲区 glAddSwapHintRectWIN 定义一组被SwapBuffers拷贝的三角形glAlphaFunc允许设置alpha检测功能 glAreTexturesResident 决定特定的纹理对象是否常驻在纹理内存中glArrayElement 定义一个被用于顶点渲染的数组成分 glBegin,glEnd 定义一个或一组原始的顶点 glBindTexture 允许建立一个绑定到目标纹理的有名称的纹理glBitmap 绘制一个位图 glBlendFunc 特殊的像素算法 glCallList 执行一个显示列表 glCallLists 执行一列显示列表 glClear 用当前值清除缓冲区 GlClearAccum 为累加缓冲区指定用于清除的值 glClearColor 为色彩缓冲区指定用于清除的值 glClearDepth 为深度缓冲区指定用于清除的值 glClearStencil 为模板缓冲区指定用于清除的值 glClipPlane 定义被裁剪的一个平面几何体 glColor 设置当前色彩 glColorMask 允许或不允许写色彩组件帧缓冲区 glColorMaterial 使一个材质色彩指向当前的色彩 glColorPointer 定义一列色彩 glColorTableEXT 定义目的一个调色板纹理的调色板的格式和尺寸glColorSubTableEXT 定义目的纹理的调色板的一部分被替换glCopyPixels 拷贝帧缓冲区里的像素 glCopyTexImage1D 将像素从帧缓冲区拷贝到一个单空间纹理图象中glCopyTexImage2D 将像素从帧缓冲区拷贝到一个双空间纹理图象中glCopyTexSubImage1D 从帧缓冲区拷贝一个单空间纹理的子图象glCopyTexSubImage2D 从帧缓冲区拷贝一个双空间纹理的子图象glCullFace 定义前面或后面是否能被精选 glDeleteLists 删除相邻一组显示列表 glDeleteTextures 删除命名的纹理 glDepthFunc 定义用于深度缓冲区对照的数据 glDepthMask 允许或不允许写入深度缓冲区 glDepthRange 定义z值从标准的设备坐标映射到窗口坐标glDrawArrays 定义渲染多个图元 glDrawBuffer 定义选择哪个色彩缓冲区被绘制 glDrawElements 渲染数组数据中的图元 glDrawPixels 将一组像素写入帧缓冲区 glEdgeFlag 定义一个边缘标志数组 glEdgeFlagPointer 定义一个边缘标志数组 glEnable, glDisable 打开或关闭OpenGL的特殊功能

openglD迷宫C实现源代码

o p e n g l D迷宫C实现源 代码 Document serial number【LGGKGB-LGG98YT-LGGT8CB-LGUT-

#include "" #include <> #include <> #include #include <> #include using namespace std; void drawwalls(void); void drawtop(void); void drawball(void); #define IDM_APPLICATION_EXIT (101) #define IDM_APPLICATION_TEXTURE (102) #define IDM_APPLICATION_BANK (103) #define MAZE_HEIGHT (16) #define MAZE_WIDTH (16) #define STARTING_POINT_X ; #define STARTING_POINT_Y ; #define STARTING_HEADING ; float player_x = STARTING_POINT_X ; float player_y = STARTING_POINT_Y ; float player_h = STARTING_HEADING ; // player's heading float player_s = ; // forward speed of the player float player_m = ; // speed multiplier of the player float player_t = ; // player's turning (change in heading) float player_b = ; // viewpoint bank (roll) static float texcoordX=; int walllist=0; int mazelist=0; int balllist=0; int status=1; bool searchroute=false; bool keystate[4]={false,false,false,false}; char mazedata[MAZE_HEIGHT][MAZE_WIDTH] = { {'H','H','H','H','H','H','H','H','H','H','H','H','H',' H','H','H'}, {'H',' ',' ',' ',' ',' ',' ',' ','H',' ',' ',' ',' ',' ',' ','H'}, {'H',' ','H',' ','H','H','H',' ','H',' ','H',' ',' ',' ',' ','H'}, {'H',' ','H','H',' ',' ','H',' ','H','H',' ','H',' ','H',' ','H'}, {'H',' ',' ',' ',' ',' ','H',' ',' ',' ',' ',' ',' ','H',' ','H'}, {'H',' ','H','H','H','H','H','H','H','H','

基于openGl的三维旋转魔方源代码

基于openGl的三维旋转魔方源代码/* * This Code Was Created By Jeff Molofee 2000 * A HUGE Thanks To Fredric Echols For Cleaning Up * And Optimizing The Base Code, Making It More Flexible! * If You've Found This Code Useful, Please Let Me Know. * Visit My Site At https://www.360docs.net/doc/7c7838534.html, */ // Header File For Standard Input/Output #include "MoFang.h" HDC hDC=NULL; // Private GDI Device Context HGLRC hRC=NULL; // Permanent Rendering Context HWND hWnd=NULL; // Holds Our Window Handle HINSTANCE h Instance; // Holds The Instance Of The Application bool keys[256]; // Array Used For The Keyboard Routine bool active=TRUE; // Window Active Flag Set To TRUE By Default bool fullscreen=TRUE; // Fullscreen Flag Set To Fullscreen Mode By Default GLfloat xrot; // X Rotation ( NEW ) GLfloat yrot; // Y Rotation ( NEW ) GLfloat zrot; // Z Rotation ( NEW ) GLfloat RX; GLfloat RY; GLuint texture[24]; // Storage For One Texture ( NEW ) GLboolean b_RX,b_RY; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Declaration For WndProc AUX_RGBImageRec *LoadBMP(char *Filename) // Loads A Bitmap Image { FILE *File=NULL; // File Handle if (!Filename) // Make Sure A Filename Was Given

opengl旋转球程序

#include #include #include #include #include #include #include static GLfloat xAngle = 0.0f; static GLfloat yAngle = 0.0f; //定义旋转角度 #define PI 3.1415926 typedef struct point { float x,y,z; }PT; struct point p[2][1000]; void Initial(void) { GLfloat mat_ambient[]={0.2f,0.2f,0.2f,1.0f}; GLfloat mat_diffuse[]={0.8f,0.8f,0.8f,1.0f}; GLfloat mat_specular[]={1.0f,1.0f,1.0f,1.0f}; GLfloat mat_shininess[]={50.0f}; GLfloat light0_diffuse[]={0.0f,0.0f,1.0f,1.0f}; GLfloat light0_position[]={1.0f,1.0f,1.0f,0.0f}; GLfloat light1_ambient[]={0.2f,0.2f,0.2f,1.0f}; GLfloat light1_diffuse[]={1.0f,0.0f,0.0f,1.0f}; GLfloat light1_specular[]={1.0f,0.6f,0.6f,1.0f}; GLfloat light1_position[]={-2.0f,-2.0f,1.0f,0.0f}; GLfloat spot_direction[]={1.0f,1.0f,-1.0f}; //定义材质属性 glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient); //指定材质的环境反射光反射系数 glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse); //指定材质的漫反射光反射系数 glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular); //指定材质的镜面反射光反射系数 glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess); //指定材质的镜面发射指数值 //light0为漫反射的蓝色点光源 glLightfv(GL_LIGHT0,GL_DIFFUSE,light0_diffuse); //指定漫反射光成分 glLightfv(GL_LIGHT0,GL_POSITION,light0_position); //设置光源的位置 //light1为红色聚光光源 glLightfv(GL_LIGHT1,GL_AMBIENT,light1_ambient); //指定环境光成分 glLightfv(GL_LIGHT1,GL_DIFFUSE,light1_diffuse); //指定漫反射光成分 glLightfv(GL_LIGHT1,GL_SPECULAR,light1_specular); //指定镜面光成分

基于OpenGL的飞机3D实时仿真_程序代码

#include "total.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define GLUT_DISABLE_ATEXIT_HACK #define FILE_NAME "feiji.3DS" //指定对应的FILE NAME #define SCREEN_WIDTH 800 #define SCREEN_HEIGHT 600 #define SCREEN_DEPTH 16 #define MAX_TEXTURES 100 // 最大的纹理数目 #define PRIMARY 0x4D4D// 基本块(Primary Chunk),位于文件的开始// 主块(Main Chunks) #define OBJECTINFO 0x3D3D // 网格对象的版本号 #define VERSION 0x0002 // .3ds文件的版本 #define EDITKEYFRAME 0xB000 // 所有关键帧信息的头部 // 对象的次级定义(包括对象的材质和对象) #define MATERIAL 0xAFFF // 保存纹理信息 #define OBJECT 0x4000 // 保存对象的面、顶点等信息// 材质的次级定义 #define MATNAME 0xA000 // 保存材质名称 #define MATDIFFUSE 0xA020 // 对象/材质的颜色 #define MATMAP 0xA200 // 新材质的头部 #define MATMAPFILE 0xA300 // 保存纹理的文件名 #define OBJECT_MESH 0x4100 // 新的网格对象 // OBJECT_MESH的次级定义 #define OBJECT_VERTICES 0x4110 // 对象顶点 #define OBJECT_FACES 0x4120 // 对象的面 #define OBJECT_MATERIAL 0x4130 // 对象的材质 #define OBJECT_UV 0x4140 // 对象的UV纹理坐标 int g_ViewMode = GL_TRIANGLES;

opengl3d迷宫c实现源代码

#include "" #include <> #include <> #include #include <> #include using namespace std; void drawwalls(void); void drawtop(void); void drawball(void); #define IDM_APPLICATION_EXIT (101) #define IDM_APPLICATION_TEXTURE (102) #define IDM_APPLICATION_BANK (103) #define MAZE_HEIGHT (16)

#define MAZE_WIDTH (16) #define STARTING_POINT_X ; #define STARTING_POINT_Y ; #define STARTING_HEADING ; float player_x = STARTING_POINT_X ; float player_y = STARTING_POINT_Y ; float player_h = STARTING_HEADING ; // player's heading float player_s = ; // forward speed of the player float player_m = ; // speed multiplier of the player float player_t = ; // player's turning (change in heading) float player_b = ; // viewpoint bank (roll) static float texcoordX=; int walllist=0; int mazelist=0;

opengl鼠标交互代码

计算机图形学学习 CG,OpenGL 实验8 OpenGL交互 1.实验目的: 理解掌握一个OpenGL程序的常见交互方法。 2.实验内容: (1)运行示范实验代码1,掌握程序鼠标交互方法,尝试为其添加键盘与菜单控制,实现同样功能; (2)运行示范实验代码2,掌握程序鼠标坐标获取与绘图方法,尝试为其添加绘制直线功能; (3)结合上述两步,能否实现通过鼠标右键菜单切换实现一个简单的绘图程序,可以绘制直线、三角形、正方形等常见图形? 3.实验原理: 要想在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)提供了鼠标当前的窗口坐标(以左上角为原点)。 键盘相关知识可参考:https://www.360docs.net/doc/7c7838534.html,/xie_zi/article/details/1911891 菜单相关知识可参考:https://www.360docs.net/doc/7c7838534.html,/xie_zi/article/details/1963383 4.示范代码: (1)鼠标控制旋转的正方形 #include #include

opengl实现画矩形

实验二 1、实验目的和要求 了解使用OpenGL绘制图形的功能,原理。 使用OpenGL绘制一个简单的矩形框,并指定颜色。 2、实验内容 先实现窗口管理,再调用一些OpenGL函数来实现矩形的绘制。 3、实验步骤 ⑴、程序设计 1)头文件包含 首先要引入OpenGL核心库以及其他需要使用的库的头文件。 其次,通过头文件引入窗口系统。 2)使用GLUT库实现窗口管理 首先,对GLUT库进行初始化,对命令行的参数进行处理。 其次,创建一个窗口。创建前要设定窗口的显示模式,包括缓存和颜色模型等。 3)利用OpenGL绘图 实现了窗口管理之后,要调用一些OpenGL函数来实现图形的绘制。 具体步骤如下: 调用glClearColor( )函数指定窗口的背景颜色。 调用glMatrixMode( )函数指定设置投影参数

调用gluOrtho2D( )函数设置投影参数 调用glClear y( )函数填充绘图颜色 调用glRectf( )函数绘制一个矩形 调用glFlush()函数清空缓冲区,执行OpenGL程序 调用glutInitDisplayMode( )函数初始化窗口的显示模式 调用glutInitWindowSize( )函数设置窗口的大小 调用glutInitWindowPosition( )函数设置窗口的位置 调用glutCreateWindow(" ")函数创建窗口 调用glutDisplayFunc(Display)函数设置当前窗口回调函数 调用Initial()函数完成窗口初始化。 调用glutMainLoop()函数启动主GLUT事件循环。 ⑵、程序调试、测试与运行结果分析 1)运行结果

OPENGL中利用鼠标实现画矩形的操作代码

#include #include #include int x0,y0; int x1,y1; int x2,y2; int x3,y3; int width; int height=500; int first=500; int iPointNum = 0; //已确定点的数目 int winWidth = 400, winHeight = 300; //窗口的宽度和高度bool have_square=false; int draw=0; bool drawable=true; void Key(unsigned char key, int x, int y) { switch(key){ case 'p': if(iPointNum == 0 || iPointNum == 2) { iPointNum = 1; x1 = x; y1 = winHeight - y; } else { iPointNum = 2; x2 = x; y2 = winHeight - y; glutPostRedisplay(); } break;

default: break; } } void display(void); void mouse(int button,int state, int x,int y) { glEnable(GL_LOGIC_OP); if(have_square == false) { if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN&&draw==0) { x1=x2=x3=x0 = x; y1=y2=y3=y0 = height-y; glColor3f(0.0,1.0,0.0); glLogicOp(GL_XOR); first = 0; } if(button == GLUT_LEFT_BUTTON && state == GLUT_UP&&draw==0) { glBegin(GL_LINE_LOOP); glVertex2f(x0,y0); glVertex2f(x1,y1); glVertex2f(x2,y2); glVertex2f(x3,y3); glEnd(); glFlush(); x2 = x; y2 = height-y; x1 = x0; y1 = y2; x3 = x; y3 = y0; glFlush();

相关主题
相关文档
最新文档