OpenGL 键盘控制及鼠标控制实例

合集下载

【VIP专享】OPENGL-第6章交互处理

【VIP专享】OPENGL-第6章交互处理

鼠标回调函数举例
void glutMouseFunc (mousebutton)
当鼠标左键被按下时
哪个键? 按下/抬起? 当前坐标?
void mousebutton(int button, int state, int x, int y)
{ if (button==GLUT_LEFT_BUTTON && state==GLUT_DOWN) {
glutKeyboardFunc(keyboard);键盘按下
glutSpecialFunc(special);非ASCII键盘按下
glutIdleFunc(animate);空闲函数
弹出式菜单的制作及过程
•考虑菜单的安排:菜单的级数 •生成各子菜单; •对每个菜单项:
•菜单名:让用户看到的菜单项 •菜单变量:程序用,判别是哪个菜单项,即菜单 的ID •生成主菜单; •建立主菜单和子菜单的关系。 •菜单什么情况弹出?(什么动作?) •回调函数对动作对应的操作处理
回调函数:KeyPressFunc(unsigned char key, int x, int y) 在回调函数中,参数表示了敲击的键和光标位置。 key – 敲击的哪个键; x,y – 光标的位置;
ASCII键动作举例
void KeyPressFunc(unsigned char key, int x, int y) { if(key == 32)//空格键 { nStep++;
xRot-= 5.0f;
F键: GLUT_KEY_F1
if(key == GLUT_KEY_DOWN)
xRot += 5.0f;
if(key == GLUT_KEY_LEFT)

opengl简介及实例

opengl简介及实例

C# 实例OpenGL是图形硬件的一个软件接口,是一种快速、高质量的3D图形软件。

它提供了近120个绘制点、线点多边形等3D图形的命令,可以完成绘制物体、变换、光照处理、着色、反走样、融合、雾化、位图和图像、纹理映射、动画等基本操作,通过把这一系列基本操作进行组合,可以构造更复杂的3D物体和描绘丰富多彩、千变万化的客观世界。

C#是以运行库为基础的一种编程语言,它几乎集中了所有关于软件开发和软件工程研究的最新成果,如面向对象、类型安全等,并被寄希望成为微软发布的用于企业编写基于COM+和视窗系统的程序语言中的最好的一种[2]。

与C++相比,C#的语法更加简洁,调试更加容易,且应用程序开发更加快速。

把C#和OpenGL结合起来开发3D应用程序和软件,将显著提高开发效率。

在C#中,程序间的依赖项通过符号而不是文本来控制,因而不使用头文件,而且opengl32.dll以及opengl32.lib等文件也不能像在C++中那样进行部署和引用,所以,无法直接使用OpenGL所提供的图形库。

在C#中通过调用OpenGL 动态链接库文件:csgl.dll和csgl.native.dll实现OpenGL所提供的强大的图形功能。

这2个文件可以从网页上获取。

csgl.dll中定义了4个名称空间,即CsGL,CsGL.OpenGL,CsGL.Pointers,CsGL.Util,其中,CsGL.OpenGL定义的4个类OpenGL、GL、GLU、GLUT中封装了几乎所有的OpenGL函数、用户库函数、辅助库函数和实用库函数及常量;类OpenGLControl中定义了OpenGL场景绘制函数,如场景的初始化、场景的绘制函数等;类OpenGLContext中定义了OpenGL环境控制命令,如像素格式、调色板的创建等命令。

CsGL.Util定义了键盘、鼠标事件及异常处理等。

为了能够使用这2个文件,先将这2个文件拷贝到系统文件夹%systemroot%╲system32中,然后在项目的属性页对话框中将"引用路径"设置为系统文件夹%systemroot%╲system32,这样C#就可以找到运行/调试应用程序所需要的库文件。

OPENGL-第6章交互处理

OPENGL-第6章交互处理

事件编程
Display Handler Keyboard Handler Mouse Handler
Main Event Loop
键盘事件- ASCII键
事件函数:void glutKeyboardFunc(KeyPressFunc) 注册一个键盘ASCII键事件的回调函数,当有键盘按 下时执行回调函数
鼠标回调函数举例
void glutMouseFunc (mousebutton)
Байду номын сангаас
哪个键? 按下/抬起? 当前坐标?
当鼠标左键被按下时
void mousebutton(int button, int state, int x, int y) { if (button==GLUT_LEFT_BUTTON && state==GLUT_DOWN) { rx = x; ry = winHeight - y; } }
鼠标事件
鼠标的键有按键动作: void glutMouseFunc (func) 注册一个鼠标事件的回调函数 回调函数:func (int button, int state, int x, int y) Button:哪个键?左键还是右键 (GLUT_LEFT_BUTTON)(GLUT_RIGHT_BUTTON) state:按下还是抬起? GLUT_UP or GLUT_DOWN
void glutMotionFunc (motion) 当鼠标按下并移动时
void motion(int x, int y) { rx = x; ry = winHeight - y; } 当前坐标?
各种键盘和鼠标的回调函数总结 glutMouseFunc(mousebutton);鼠标按下 或抬起 glutMotionFunc(motion);鼠标按下并运动 glutKeyboardFunc(keyboard);键盘按下

弹弹堂游戏在C开发环境下使用OpenGL库进行开发

弹弹堂游戏在C开发环境下使用OpenGL库进行开发

弹弹堂游戏在C开发环境下使用OpenGL库进行开发弹弹堂游戏是一款极其受欢迎的休闲游戏,玩家可以通过弹射弹性球来消除屏幕上的方块。

在本文中, 将介绍如何利用C开发环境下的OpenGL库来实现弹弹堂游戏的开发。

这个过程将涵盖如何创建游戏窗口、加载资源、绘制游戏元素以及处理用户输入等方面。

1. 引言OpenGL是一个强大的图形渲染库,通过利用它的功能,我们可以轻松实现弹弹堂游戏中的各种效果,例如绘制图形、添加贴图以及实现动画效果等。

C语言是一种方便、简单的编程语言,适用于对底层操作有需求的开发工作。

因此,使用C开发环境下的OpenGL库来开发弹弹堂游戏,不仅能保证程序的高效性,还能满足开发人员对于底层控制的需求。

2. 创建游戏窗口为了在C语言环境下使用OpenGL库进行游戏开发,首先需要创建一个游戏窗口来显示游戏画面。

可以使用OpenGL的工具库来创建窗口,并设置窗口的大小、标题等属性。

在创建窗口后,还需要初始化OpenGL的上下文环境,以确保之后的绘制操作能够正常进行。

3. 加载资源弹弹堂游戏中需要加载的资源包括游戏关卡的地图、玩家的角色模型、音效等。

在C开发环境下,可以利用OpenGL库提供的纹理加载函数来加载贴图资源,并将其应用到游戏元素上。

同时,还可以使用其他C语言的文件操作函数来加载地图数据、读取角色模型等。

4. 绘制游戏元素在弹弹堂游戏中,有许多不同的游戏元素需要绘制,如方块、弹性球、角色模型等。

使用OpenGL库的绘图功能,可以通过指定每个元素的顶点坐标、纹理坐标等属性来绘制它们。

同时,还可以利用OpenGL提供的变换函数来实现元素的平移、旋转、缩放等动画效果。

5. 处理用户输入弹弹堂游戏需要根据用户的输入来控制玩家角色的移动、发射弹性球等操作。

在C语言环境下,可以通过监听键盘或鼠标事件,并根据用户的操作来更新游戏状态。

通过OpenGL库提供的回调函数,可以轻松地捕获用户的输入,并进行相应的处理。

计算机图形学实验报告-OpenGL基本使用

计算机图形学实验报告-OpenGL基本使用

学生实验实习报告册学年学期:2016-2017学年 春□√秋学期课程名称:大学计算机基础学生学院:通信与信息工程学院专业班级:学生学号:学生姓名:联系电话:重庆邮电大学教务处印制实验实习名OpenGL基本使用指导教师秦红星考核成绩课程名称计算机图形学A 课程编号实验实习地点信息科技大厦S306 完成日期学生姓名学生学号学院专业广电与数字媒体类所在班级教师评语教师签名:年月日一、实验实习目的及要求目的:认识了解OpenGL的性质、功能要求:1.利用OpenGL绘制一个简单的场景:比如球体、正方体2.加入灯光3.实现交互操作:平移、缩放、旋转二、实验实习设备(环境)及要求(软硬件条件)采用Microsoft Visual C 2010生成环境并用C++编写程序三、实验实习内容与步骤内容:背景为黑色,在点光源下,能够实现平移、缩放、旋转的球。

步骤:建立立体-->添加光照-->添加变换1.先写“主函数”,在主函数中将窗口生成好。

2.在“自定义函数1”中对窗口进行清除、填色等操作。

3.在“自定义函数1”中设置点光源,设置光照的各种参数。

4.在“自定义函数1”中设置平移、缩放、旋转及各参数。

5.在“自定义函数2”中设置平移和缩放的循环。

6.在主函数中调用这两个自定义函数,并且在主函数里面用“自定义函数1”为参数调用glutDisplayFunc()来注册一个绘图函数。

其次用空闲回调函数glutIdleFunc()来使球体不停地循环有缩放、平移功能的函数。

实现动画。

四、实验实习过程或算法(源程序、代码)#include<GL/glut.h>GLfloat angle = 0.0f;GLfloat multiply = 0.0f;void display(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //设置窗口里面的背景颜色glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(90.0f, 1.0f, 1.0f, 20.0f);glLoadIdentity();gluLookAt(0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);{//设置一个点光源GLfloat light_position[] = { 0.5f,0.0f,0.0f,1.0f };//(xyzw)w为1时代表点光源,0时代表方向光源GLfloat light_ambient[] = { 0.5f,0.5f,0.5f,1.0f };//(0001)GLfloat light_diffuse[] = { 1.0f,1.0f,1.0f,1.0f };//(1111)GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };//(1111)glLightfv(GL_LIGHT0, GL_POSITION, light_position);glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);//光源环境光强值glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);//光源漫反射强值glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);//光源镜面反射强值glEnable(GL_LIGHT0);//打开该光源glEnable(GL_LIGHTING);//打开光照}{glRotatef(angle, 0.0f, 1.0f, 0.0f);glTranslatef(0.0f, 0.0f, 0.6f); //平移glScaled(multiply, multiply, multiply); //缩放glutSolidSphere(0.2, 50, 50);}glutSwapBuffers();}void rotateAndzoom(void) //旋转和缩放{angle += 1.0f;if (angle >= 360.0f)angle = 0.0f;display();//设置旋转multiply += 0.01f;if (multiply >= 2.0f)// multiply -= 0.01f;//if (multiply <= 1.0f)multiply = 1.0f;display();//设置缩放}int main(int argc, char* argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);glutInitWindowPosition(400, 50);glutInitWindowSize(800, 800);glutCreateWindow("立体");glutDisplayFunc(&display);glutIdleFunc(&rotateAndzoom);//旋转glutMainLoop();//调用该函数启动程序,所有以创建的窗口将会显示return 0;}五、实验实习结果分析和(或)源程序调试过程实验实习名直线扫面和区域填充实现指导教师考核成绩课程名称课程编号实验实习地点完成日期学生姓名学生学号学院专业通信与信息工程学院广电与数字媒体类所在班级教师评语教师签名:年月日一、实验实习目的及要求项目目的:熟悉光栅图形学中的相关算法项目要求:1.应用OpenGL点绘制函数直线与区域2.采用直线扫面算法绘制一条线段,直线有离散点组成3.利用区域填充算法绘制多边形区域,区域由离散点组成二、实验实习设备(环境)及要求(软硬件条件)采用Microsoft Visual C 2010生成环境并用C++编写程序三、实验实习内容与步骤内容:1.用DDA算法实现点绘制直线。

OpenGl读取导入3D模型并且添加鼠标移动旋转显示

OpenGl读取导入3D模型并且添加鼠标移动旋转显示

OpenGl读取导⼊3D模型并且添加⿏标移动旋转显⽰原⽂作者:aircraft最近实习要⽤到opengl库就是跟opencv 有点像的那个,然后下了⼀个3D模型的读取显⽰来研究现在分享给⼤家吧注释基本我都打好了,所以也懒得再写很多解析了,⾃⼰看注释吧!本⽂⽤到obj ⽂件的百度云下载是:控制⼀个3d模型不难,那么控制多个呢?看下⾯这篇博客:下载之后,复制代码到⾃⼰的项⽬运⾏改⼀个那个我定义的路径,然后还要配置⼀下opengl和openmesh来读取obj⽂件解析,,配置过程肯定会出现很多的问题的没事习惯就好加油⾃⼰百度去不要来问我路径就是这个:改⼀下file变成你们⾃⼰的就⾏了,,最后说⼀下配置有问题⾃⼰百度OK 百度⽆敌⼀、操作⿏标控制物体旋转移动,滚轮缩放,上下左右键可以控制模型的移动F1,F2,F3,F4,F5,F6,F7,F8可以更换显⽰⽂件Insert键更换显⽰模式 (wire,flat,flatlines)⼆、实验演⽰按F1 读⼊⼀个 cow的 obj⽂件切换为只显⽰线的模式:切换为可以显⽰线和⾯⼀起的模式:可以实现旋转:旋转之后:可以实现缩放:缩⼩:可以实现平移:按完相应键盘的按键之后,就会进⾏⼊读obj⽂件,使⽤命令⾏显⽰当前状态#include <iostream>#include<stdlib.h>#include<OpenMesh/Core/IO/MeshIO.hh>#include<OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>#include<GL/glut.h>#include <math.h>#include <Windows.h>#include <string>#define GLUT_WHEEL_UP 3 //定义滚轮操作#define GLUT_WHEEL_DOWN 4using namespace std;typedef OpenMesh::TriMesh_ArrayKernelT<> MyMesh;//⿏标交互有关的int mousetate = 0; //⿏标当前的状态GLfloat Oldx = 0.0; // 点击之前的位置GLfloat Oldy = 0.0;GLuint texture;//与实现⾓度⼤⼩相关的参数,只需要两个就可以完成float xRotate = 0.0f; //旋转float yRotate = 0.0f;float ty = 0.0f;float tx = 0.0f;float scale = 0.004;//⽂件读取有关的MyMesh mesh; //mesh把⽂件读取了,封装在mesh对象中//"dinosaur.obj";const string file = "D:\\参考项⽬代码\\objdata\\objdata\\";const string file_1 = file + "cow.obj";const string file_2 = file + "bunny.obj";const string file_3 = file + "dinosaur.obj";const string file_4 = file + "mba1.obj";const string file_5 = file + "monkey.obj";const string file_6 = file + "porsche.obj";//const string file_7 = "teddy.obj";const string file_7 = file + "huangfeng.obj";const string file_8 = file + "file.obj";const string file_9 = file + "face.sur";int currentfile = 1;GLuint showFaceList, showWireList;int showstate = 1;bool showFace = true;bool showWire = false;bool showFlatlines = false;void setLightRes() {//GLfloat lightPosition[] = { 0.0f, 0.0f, 1.0f, 0.0f };GLfloat lightPosition[] = { 0.0f, 1.0f, 0.0f, 0.0f }; // 平⾏光源, GL_POSITION属性的最后⼀个参数为0glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);glEnable(GL_LIGHTING); //启⽤光源glEnable(GL_LIGHT0); //使⽤指定灯光}void SetupRC(){//当你想剔除背⾯的时候,你只需要调⽤glEnable(GL_CULL_FACE)就可以了,OPENGL状态机会⾃动按照默认值进⾏CULL_FACE,//默认是glFrontFace(GL_CCW) GL_CCW逆时针为正,GL_CW顺时针glEnable(GL_DEPTH_TEST);glFrontFace(GL_CCW);glEnable(GL_CULL_FACE);// 启⽤光照计算glEnable(GL_LIGHTING);// 指定环境光强度(RGBA)此时可以控制模型的显⽰颜⾊GLfloat ambientLight[] = { 1.0f, 0.0f, 0.0f, 0.0f };// 设置光照模型,将ambientLight所指定的RGBA强度值应⽤到环境光glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);// 启⽤颜⾊追踪//GL_COLOR_MATERIAL使我们可以⽤颜⾊来贴物体。

OpenGL 键盘控制及鼠标控制实例

OpenGL 键盘控制及鼠标控制实例

1.学习在Visual C++ 6.0 中安装glut库操作截图:2. 学习、理解glut库中的基本事件:测试事件glutDisplayFunc();glutSpecialFunc(); 测试程序:#include<GL/glut.h>#include<math.h>#include<stdlib.h>int angle;double pi=3.1415;void init(void){glOrtho(-5,5,-5,5,-1,1);//视野缩放}void display(void){glClear(GL_COLOR_BUFFER_BIT);//清除所有像素glColor3f(1.0,0,0);int i;glPushMatrix();//入栈glTranslatef(0,0,0);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){angle-=30;}glutPostRedisplay();//重新调用绘制函数}void mymouse(int button,int state,int x,int y){if(state==GLUT_DOWN){if(button==GLUT_LEFT_BUTTON){glTranslatef(-0.5,0,0);//左移}else if(button==GLUT_RIGHT_BUTTON){glTranslatef(0.5,0,0);//右移}glutPostRedisplay();//重新调用绘制函数}return;}void main(int argc, char **argv){glutInit(&argc, argv); // 初始化工具包glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置显式模式glutInitWindowSize(640,480); // 设置窗口大小glutInitWindowPosition(100, 150); // 设置窗口位置glutCreateWindow("旋转平移"); // 创建屏幕窗口init();glutMouseFunc(&mymouse);//调用鼠标响应函数glutDisplayFunc(display); // 注册绘制函数glutSpecialFunc(&Keyboard);//调用键盘回调函数glutMainLoop(); // 进入主循环}运行结果:初始位置:当按下键盘←键时图形逆时针旋转如图:同理按下键盘→时,图形顺时针旋转。

OpenGL轨迹球实现的鼠标旋转

OpenGL轨迹球实现的鼠标旋转

OpenGL:轨迹球实现的鼠标旋转轨迹球控制By Terence J. Grant 如果只用鼠标来控制你的模型是不是很酷?轨迹球可以帮你做到这一点,我将告诉你我的实现,你可以把它应用在你的工程里。

我的实现是基于Bretton Wade’s,它是基于Ken Shoemake’s 实现的,最初的版本,你可以从游戏编程指南这本图上找到。

但我还是修正了一些错误,并优化了它。

轨迹球实现的内容就是把二维的鼠标点映射到三维的轨迹球,并基于它完成旋转变化。

为了完成这个设想,首先我们把鼠标坐标映射到[-1,1]之间,它很简单:MousePt.X = ((MousePt.X / ((Width -1) / 2)) -1);MousePt.Y = -((MousePt.Y / ((Height -1) / 2))-1);这只是为了数学上的简化,下面我们计算这个长度,如果它大于轨迹球的边界,我们将简单的把z轴设为0,否则我们把z轴设置为这个二维点映射到球面上对应的z值。

一旦我们有了两个点,就可以计算它的法向量了和旋转角了。

下面我们从构造函数开始,完整的讲解这个类:ArcBall_t::ArcBall_t(GLfloat NewWidth, GLfloat NewHeight)当点击鼠标时,记录点击的位置void ArcBall_t::click(const Point2fT* NewPt)当拖动鼠标时,记录当前鼠标的位置,并计算出旋转的量。

void ArcBall_t::drag(const Point2fT* NewPt, Quat4fT* NewRot)如果窗口大小改变,设置鼠标移动的范围void ArcBall_t::setBounds(GLfloat NewWidth, GLfloat NewHeight)下面是完成计算所要用到的数据结果,都是一些矩阵和向量Matrix4fT Transform ={ 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f };Matrix3fT LastRot = { 1.0f, 0.0f, 0.0f,0.0f, 1.0f, 0.0f,0.0f, 0.0f, 1.0f };Matrix3fT ThisRot = { 1.0f, 0.0f, 0.0f,0.0f, 1.0f, 0.0f,0.0f, 0.0f, 1.0f };ArcBallT ArcBall(640.0f, 480.0f);Point2fT MousePt;bool isClicked = false; // 是否点击鼠标bool isRClicked = false; // 是否右击鼠标bool isDragging = false; // 是否拖动在上面定义的变量中,transform是我们获得的最终的变换矩阵,lastRot是上一次鼠标拖动得到的旋转矩阵,thisRot为这次鼠标拖动得到的旋转矩阵。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.学习在Visual C++ 6.0 中安装glut库
操作截图:
2. 学习、理解glut库中的基本事件:
测试事件glutDisplayFunc();glutSpecialFunc(); 测试程序:
#include<GL/glut.h>
#include<math.h>
#include<stdlib.h>
int angle;
double pi=3.1415;
void init(void)
{
glOrtho(-5,5,-5,5,-1,1);//视野缩放
}
void display(void){
glClear(GL_COLOR_BUFFER_BIT);//清除所有像素glColor3f(1.0,0,0);
int i;
glPushMatrix();//入栈
glTranslatef(0,0,0);
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)
{
angle-=30;
}
glutPostRedisplay();//重新调用绘制函数
}
void mymouse(int button,int state,int x,int y)
{
if(state==GLUT_DOWN)
{
if(button==GLUT_LEFT_BUTTON)
{
glTranslatef(-0.5,0,0);//左移
}
else if(button==GLUT_RIGHT_BUTTON)
{
glTranslatef(0.5,0,0);//右移
}
glutPostRedisplay();//重新调用绘制函数
}
return;
}
void main(int argc, char **argv)
{
glutInit(&argc, argv); // 初始化工具包
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置显式模式glutInitWindowSize(640,480); // 设置窗口大小
glutInitWindowPosition(100, 150); // 设置窗口位置
glutCreateWindow("旋转平移"); // 创建屏幕窗口
init();
glutMouseFunc(&mymouse);//调用鼠标响应函数
glutDisplayFunc(display); // 注册绘制函数
glutSpecialFunc(&Keyboard);//调用键盘回调函数
glutMainLoop(); // 进入主循环
}
运行结果:
初始位置:
当按下键盘←键时图形逆时针旋转如图:
同理按下键盘→时,图形顺时针旋转。

当点击鼠标左键时,图形向左移动如图:
当点击鼠标右键时,图形向右移动如图:。

相关文档
最新文档