当前位置:文档之家› OPENGL轨迹球实现的鼠标旋转

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实现图形的平移、旋转、缩放

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

检测鼠标单击 要想在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的函数名。

简单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画球体

(计算机图形学)实验报告 实验名称使用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 会自动包含其它两个头文件。例如:glBegin(GL_POLYGON);glClear(GL_COLOR_BUFFER_BIT);在头文件中也定义了OpenGL数据类型:GLfloat, GLdouble, … 关于最初建立文件的步骤 创建一个win32 console application类型的workspace文件,创建一个C/C++

实验四-鼠标交互

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 int ww,hh; // for display window width and height void Myinit(void); void Reshape(int w, int h); void Display(void); 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库; glutInitWindowSize(800, 600); //设置显示窗口大小 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //设置显示模式;(注意双缓冲) glutCreateWindow("鼠标画线小程序演示"); // 创建显示窗口 Myinit(); glutDisplayFunc(Display); //注册显示回调函数 glutReshapeFunc(Reshape); //注册窗口改变回调函数 glutMainLoop(); //进入事件处理循环 return 0; } void Myinit(void) { glClearColor(0.0,0.0,0.0,0.0); glLineWidth(3.0); } //渲染绘制子程序-------------------------------------------------------------------------- void Display(void) {

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的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)

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

1.学习在Visual C++ 6.0 中安装glut库 操作截图: 2. 学习、理解glut库中的基本事件: 测试事件glutDisplayFunc();glutSpecialFunc(); 测试程序: #include #include #include 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) {

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的学习,使我对计算机图形学的一些算法过程有了更多的了解。因为对三维图形的显示比较感兴趣,就做了立方体的简单三维交互式几何变换。 功能:键盘的方向键实现立方体的上下左右平移;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入门教程

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.doczj.com/doc/6a2722043.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.doczj.com/doc/6a2722043.html,/resources/libraries/glut/glutdlls37beta.zip 无法从以上地址下载的话请使用下面的连接: https://www.doczj.com/doc/6a2722043.html,/upfile/200607311626279.zip Windows环境下安装GLUT的步骤: 1、将下载的压缩包解开,将得到5个文件

实验三 OpenGL的简单交互绘制new

实验三 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);

图形学 用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 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();

OpenGL立方体带黑白格格纹理有光照可以鼠标键盘交互c文件

使用方法:新建一个工程,把以下代码拷贝到类文件里。#include "stdafx.h" #include #include GLfloat light0_pos[4] = {0.00f, 0.00f, 1.00f, 0.0f}; typedef struct materialStruct { GLfloat ambient[4]; GLfloat diffuse[4]; GLfloat specular[4]; GLfloat shininess; } materialStruct; typedef struct lightingStruct { GLfloat ambient[4]; GLfloat diffuse[4]; GLfloat specular [4]; } lightingStruct; materialStruct colorCubeMaterials = { {0.2, 0.2, 0.2, 1.0}, {0.8, 0.8, 0.8, 1.0}, {0.0, 0.0, 0.0, 1.0}, 1.0 }; materialStruct brassMaterials = { {0.33, 0.22, 0.03, 1.0}, {0.78, 0.57, 0.11, 1.0}, {0.99, 0.91, 0.81, 1.0}, 27.8 }; materialStruct redPlasticMaterials = { {0.3, 0.0, 0.0, 1.0}, {0.9, 0.0, 0.0, 1.0}, {0.8, 0.6, 0.6, 1.0}, 32.0 }; materialStruct whiteShinyMaterials = { {1.0, 1.0, 1.0, 1.0}, {1.0, 1.0, 1.0, 1.0},

OpenGL实现3D模型的交互控制

第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 。

相关主题
文本预览
相关文档 最新文档