当前位置:文档之家› opengl学习手记(三) 旋转的三维立方体

opengl学习手记(三) 旋转的三维立方体

opengl学习手记(三) 旋转的三维立方体
opengl学习手记(三) 旋转的三维立方体

opengl学习手记(三) 旋转的三维立方体

注意:

1. 在onInit函数中加入了,开启深度测试的代码。

2. glClear清屏的时候多个参数GL_DEPTH_BUFFER_BIT,因为开启了深度测试,所以要清除深度缓存。

尝试:

1. 你可以先注释onInit函数中的代码,并且不使用GL_DEPTH_BUFFER_BIT看下效果。

2. 再试下,启用onInit函数中的代码,但不使用GL_DEPTH_BUFFER_BIT看下效果。

说明:

使用左右方向键,可以旋转立方体。

// 包含windows的头文件

#include

// 包含opengl需要用到的头文件(完整的vs编辑器中会自带这些文件)

#include

#include

#include

// 设置链接时的库文件

#pragma comment(lib, "OPENGL32.LIB")

#pragma comment(lib, "glu32.lib")

#pragma comment(lib, "glaux.lib")

// 所有的初始化都放这个函数

bool onInit()

{

glClearDepth(1.0f); // 设置深度缓存 glEnable(GL_DEPTH_TEST); // 启用深度测试

return true;

}

// 当窗口大小改变时的处理函数

void CALLBACK onSize(GLint w, GLint h)

{

// 防止h为0时,后面计算w/h时出现除法错误

if (h == 0) h = 1;

// 指定视口的位置和大小(可以自己改下参数看下效果)

glViewport(0, 0, w, h);

// 切换当前矩阵到投影矩阵

glMatrixMode(GL_PROJECTION);

// 设置投影矩阵为一个单位矩阵

glLoadIdentity();

// 设置45度角的投影矩阵,aspect一般都是设置成宽/高(是视景体的宽高比)

gluPerspective(45.0, (GLdouble)w/(GLdouble)h, 1.0, 100.0);

// 切换当前矩形到模型视景矩阵

glMatrixMode(GL_MODELVIEW);

// 设置模型视景矩阵为一个单位矩阵

glLoadIdentity();

}

// 渲染一个立方体

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); // 四边形的左上 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);

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); // 四边形的左上 glEnd();

}

float ratX = 60;

float ratY = 60;

float ratZ = 60;

// 这个函数是渲染循环的回调函数

void CALLBACK onRender(void)

{

// 设置清屏颜色

glClearColor(0, 0, 0, 0);

// 用glClearColor设置的颜色来清除屏幕

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();

glTranslatef(0, 0, -6.0f);

// 绕x,y,z轴旋转

glRotatef(ratX, 1.0f, 0.0f, 0.0f);

glRotatef(ratY, 0.0f, 1.0f, 0.0f);

glRotatef(ratZ, 0.0f, 0.0f, 1.0f);

DrawBox();

// 渲染到后备缓冲

// 注意auxInitDisplayMode中不是AUX_AUX_SINGLE,而是AUX_DOUBLE

// 这个例子里使用了双缓冲机制,所以glFlush只渲染到后缓冲,不画到窗口上了

// 使用双缓冲是为了解决闪屏的问题

glFlush();

// 把后缓冲中的渲染结果一次性渲染到窗口

auxSwapBuffers();

}

void CALLBACK leftKeyProc()

{

ratX += 2;

ratY += 2;

ratZ += 2;

}

void CALLBACK rightKeyProc()

{

ratX -= 2;

ratY -= 2;

ratZ -= 2;

}

void main()

{

// 调用glaux.h中的设置显示模式的接口

auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA);

// 调用glaux.h中的设置窗口位置和大小

auxInitPosition(512,300,250,200);

// 调用glaux.h中的创建窗口

auxInitWindow("sample");

// 注册left键的处理函数

auxKeyFunc(AUX_LEFT, leftKeyProc);

// 注册right键的处理函数

auxKeyFunc(AUX_RIGHT, rightKeyProc);

// 注册窗口大小改变时的处理函数

auxReshapeFunc(onSize);

// 自定义初始化

onInit();

// 注册主渲染循环(注册了这个以后)

auxMainLoop(onRender);

}

计算机图形学 实验 利用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画球体 实验时间年月日 专业班级学号姓名 成绩教师评语: 一、实验目的 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的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.了解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实现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 。

OpenGL课程设计-三维球体的实现

游戏软件设计课程报告 (三维球体的实现) 院系: 专业: 学号: 姓名: 指导教师: 2010年10月10日

目录 目录 一、应用程序的最终界面----------------------------------------------------------------1 二、三维球体的绘制---------------------------------------------------------------------2 1、球体绘制方法研究 ----------------------------------------------------------------2 2、面分解法的实现----------------------------------------------------------------3 2.1面分解函数 ----------------------------------------------------------------3 2.2初值的选取 ----------------------------------------------------------------3 2.3 球体的实现----------------------------------------------------------------4 3、三角形绘制函数----------------------------------------------------------------4 4、三角面法向量函数 ----------------------------------------------------------------5 5、点的模长扩展函数 ----------------------------------------------------------------5 6、南北极法的实现----------------------------------------------------------------5 7、动画的实现-------------------------------------------------------------------10 三、二种绘制方法的比较---------------------------------------------------------------12

基于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.doczj.com/doc/c310540345.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坐标变换

1.实验五OpenGL坐标变换(选做) 1.实验五:OpenGL坐标变换。 2.实验目的:通过上机编程,熟悉OpenGL程序的基本框架,掌握OpenGL基本图元 的绘制方法和OpenGL图形坐标的变换方法,理解坐标变换的原理。 3.实验要求: (1)每人一组,独立完成。 (2)构架一个OpenGL程序框架,绘制两个茶壶,一个先平移再旋转,一个先旋转再平移,比较两个茶壶因坐标变换次序不同而产生的不同效果。 说明:从本实验开始,很多实验都需要参考《三维游戏设计师宝典——学OpenGL 编3D游戏》一书,该书按章节提供了对应的源代码。 4.实验原理及内容: (1)OpenGL是输出到图形硬件的一个软件编程接口,它定义了一个独立于语言的图形核心系统,编程时调用其提供的API函数即可。 (2)Visual C++ 6.0环境中的OpenGL程序基本框架: 在Windows操作系统下编制OpenGL程序,必需先建立Windows框架,然后再在Windows框架下建立OpenGL的框架(“A01_OpenGL的程序框架”文件夹中 就包含了一个这样的完整框架程序,后面的实验都将使用这个程序框架),其中:Windows框架主要由三个函数构建: a)WinMain():主程序入口,程序从这里开始运行,它定义了一个Windows 的窗口的样式、大小等等,并建立这个窗口。 b)MsgProc():消息处理函数。Windows程序是基于事件响应的运行机制, 该函数在整个运行周期中随时对其所定义的外部事件(如鼠标移动、点 击、窗口变化、键盘,以及其它函数发出的消息)做出反应。 c)GameLoop():消息循环。这是利用Windows的消息机制做成的主循环 函数,它被程序反复执行,OpenGL的图形处理函数Render()就在其中 被调用。GameLoop()函数的作用是侦听消息,有消息时返回Windows 的消息链,没有消息时就执行Render()。 OpenGL的基本框架由四个函数组成,与Windows框架的调用关系参见图5-1:

OpenGL 球面相机旋转算法

旋转作为三维开发的基本功能,在任何3D程序中都需要。用户通过旋转来实现对模型各个面的浏览,形成直观印象。 球面相机旋转 这种旋转方式用户体验方式要优于x轴y轴混合旋转方式,模型旋转的方向和鼠标移动方向保持一致。 下面给出一种“球面相机”实现旋转的方法。 原理: 移动鼠标时,通过gluLookAt来改变视点的位置(采用增量的方式),而模型保持不动。即:只进行视点变换,不进行模型变换。 下图是用户按下左键,在屏幕上移动的一段距离(从A移动到B)。 由于屏幕坐标y轴向下,为了与投影平面坐标系(传统笛卡尔坐标)保持一致。 AM = y1-y2; /*将消息代码描述*/ BM = x2-x1; 建立屏幕和投影变换近裁截面之间的对应关系(如下图)。

代码实现: 1 void setSphereCameraPos() 2 { 3 // 左键未按下,直接返回 4 if (!is_left_button_down) 5 return; 6 7 // 从聚焦点指向视点的向量 OA向量 8 vector3dd a(eye-target); 9 10 // 计算球面相机半径 11 radius = a.getLength();

12 13 // 将其单位化 14 a.normailize(); 15 16 // 当前相机向上方向与a做叉乘,计算投影面水平向右方向向量u 17 vector3dd u = upvector.crossProduct(a); 18 // 将其单位化 19 u.normailize(); 20 21 // 计算相机向上方向在投影面上的投影向量即垂直向上的方向向量v 22 vector3dd v = a.crossProduct(u); 23 // 将其单位化 24 v.normailize(); 25 26 // 计算屏幕AB在投影面上对应的向量 AB向量 27 vector3dd m = u*delta_point.x + v*delta_point.y; 28 29 // 计算m向量的长度 30 double len = m.getLength(); 31 // 降低灵敏度 32 len /= 20.0; 33 34 if (len>0.0) 35 { 36 // 角度AOB 弧度表示弧长/半径 37 double x = len/radius;

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

1 3DS文件介绍 3DS文件存储了模型的材质信息和几何信息,材质信息主要包括材质的名称,材质的纹理贴图所对应的文件名以及材质的颜色等;几何信息主要包括顶点的数目,每个顶点的坐标,三角面的数目,每个三角面上3个顶点的索引,此三角面是否可见等。 3DS文件由许多块组成,每个块包括信息类别和下一个块的相对位置。块的信息类别用ID表示,它描述了该块的数据信息。下一个块的相对位置指出了下一个块相对于该块起始位置的偏移字节数。在块结构中,始终用前2个字节保存D号,接下来的4个字节保存块的长度,块的实际内容则用(块长度)6个字节保存。块的内容又可能包含子块。 在OpenGL中读入3DS文件的模型的方法有很多,由于本文的程序是在VC + +环境下开发的,所以采用了编写一个类来加载3DS文件的方法。这样的类很多书籍和网站都有提供,只需进行简单的修改就可以使用,比如修改模型的位置信息以实现模型的移动,增加模型的旋转经度和纬度信息以实现模型的旋转。 1 OpenGL的交互技术 在虚拟装机系统中,要求与场景本身进行更多的交互操作,这种交互除了菜单和对话框实现外,在很多情况下是用鼠标来进行的。OperGL的一大功能就是提供了实现交互技术的机制。 OperGL的交互技术是通过选择、拾取和反馈操作来实现的。 2 1选择 选择允许在窗口内部的某个位置用鼠标进行点击,并确定它所点击的是哪个物体。选择是OpenGL的一种操作模式,选择模式不会改变帧缓存区的内容,退出选择模式时,OperGL返回与视景体相交的图元列表,它列出了位于视景体内或与视景体相交的图元,每个图元产生一个选择命中的记录,对应名称堆栈中的当前内容。 绘制模式进入选择模式前,调用函数gR endeM ode (),其原型为:gRendeMode(GLmum mode)。控制应用程序当前所处的模式,即绘图、选择和反馈模式,相应的mode的取值为 GL—RENDER、GL—SELECT 或 GL—FEEDBACK。 ?创建名称堆栈名称堆栈的内容可以用来确定用户选择的物体,所以它在选择操作中具有非常重要的作用。首先,用 gUnitNaneS()函数初始化名称堆栈,即清除名称堆栈。然后,在发出各模型绘图命令的同时,用gPuthName()函数将物体名称压入堆栈。这名称是整数,OpenGL可以包含64个名称。 操作堆栈的函数有: gIPushName()函数,将名称压入堆栈; gPcpNam e()函数,将名称从堆栈中弹出; gLoadName()函数,用不同的名称替换最顶层堆栈的名称。 /淀义模型数组 //3D模型定义 /第一个模型

OpenGL的简单动画与交互

OpenGL的简单动画与交互 一、实验目的 1、学会OpenGL的简单键盘交互操作。 2、掌握OpenGL鼠标交互功能及其简单应用。 3、掌握OpenGL的闲置函数与简单动画。 4、掌握反走样思想和算法。 二、实验内容与要求 1、在实验一(画矩形)的基础上添加键盘交互,按W键绘制的矩形上移, 按S键矩形下移,按A键矩形左移,按D键矩形右移,如图3-1。参考 步骤如下: (1)在主函数里添加键盘注册回调函数 glutKeyboardFunc(mykeyboard); 此函数可放在 glutDisplayFunc(display);后面。 (2)在display()绘制函数中修改绘制矩形代码,用变量代替数值参数。 例如: glRectf(-0.5,-0.5,0.5,0.5)改为glRectf(x1,y1,x2,y2); (3)在程序中增加mykeyboard键盘子函数,并在如下代码中进行修改,实现键盘控制矩形移动 void mykeyboard(unsigned char key, int x, int y) { switch(key) { case 'W': case 'w':// 矩形对角坐标变量修改使得矩形上移 break; case 'S': case 's'://矩形对角坐标变量修改使得矩形下移 break; case 'A': case 'a'://矩形对角坐标变量修改使得矩形左移 break; case 'D': case 'd'://矩形对角坐标变量修改使得矩形右移 break; } //参数修改后调用重画函数,屏幕图形将发生改变

glutPostRedisplay(); } 2、闲置函数的使用与简单动画。 旋转的六边形,如图3-3所示 阅读OpenGL旋转的六边形样本框架程序rotate-polygon.cpp,分 析程序的实现步骤: //样本程序:旋转的六边形 #include #include #define PI 3.14159 //设置圆周率 int n=6, R=10; //多边形变数,外接圆半径 float theta=0.0; //旋转初始角度值 void Keyboard(unsigned char key, int x, int y); void Display(void); void Reshape(int w, int h); void myidle(); void main(int argc, char** argv) { glutInit(&argc, argv); //初始化GLUT库; glutInitWindowSize(700,700); //设置显示窗口大小 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //设置显示模式;(注意双缓冲)

实验四 OpenGL的简单动画与交互

实验四 OpenGL的简单动画与交互 一、实验目的 1、学会OpenGL的简单键盘交互操作。 2、掌握OpenGL鼠标交互功能及其简单应用。 3、掌握OpenGL的闲置函数与简单动画。 4、掌握反走样思想和算法。 二、实验内容与要求 1、在实验一(画矩形)的基础上添加键盘交互,按W键绘制的矩形上移, 按S键矩形下移,按A键矩形左移,按D键矩形右移,如图3-1。参考 步骤如下: (1)在主函数里添加键盘注册回调函数 glutKeyboardFunc(mykeyboard); 此函数可放在 glutDisplayFunc(display);后面。 (2)在display()绘制函数中修改绘制矩形代码,用变量代替数值参数。 例如: glRectf(-0.5,-0.5,0.5,0.5)改为glRectf(x1,y1,x2,y2); (3)在程序中增加mykeyboard键盘子函数,并在如下代码中进行修改,实现键盘控制矩形移动 void mykeyboard(unsigned char key, int x, int y) { switch(key) { case 'W': case 'w':// 矩形对角坐标变量修改使得矩形上移 break; case 'S': case 's'://矩形对角坐标变量修改使得矩形下移 break; case 'A': case 'a'://矩形对角坐标变量修改使得矩形左移 break; case 'D': case 'd'://矩形对角坐标变量修改使得矩形右移 break; } //参数修改后调用重画函数,屏幕图形将发生改变

glutPostRedisplay(); } 2、闲置函数的使用与简单动画。 旋转的六边形,如图3-3所示 阅读OpenGL旋转的六边形样本框架程序rotate-polygon.cpp,分 析程序的实现步骤: //样本程序:旋转的六边形 #include #include #define PI 3.14159 //设置圆周率 int n=6, R=10; //多边形变数,外接圆半径 float theta=0.0; //旋转初始角度值 void Keyboard(unsigned char key, int x, int y); void Display(void); void Reshape(int w, int h); void myidle(); void main(int argc, char** argv) { glutInit(&argc, argv); //初始化GLUT库; glutInitWindowSize(700,700); //设置显示窗口大小 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //设置显示模式;(注意双缓冲)

实验二 OpenGL的简单动画

实验二 OpenGL的简单动画 Lab2_animation 一、实验目的 1、掌握OpenGL的闲置函数 2、掌握OpenGL的时间函数 3、掌握OpenGL的简单动画功能。 4、掌握OpenGL的闲置函数与简单动画。 5、了解OpengGL裁剪窗口、视区、显示窗口的概念和它们之间的关系。 6、进一步掌握OpenGL的基本图元的绘制。 二、实验环境 硬件要求: PC机,主流配置,最好为独立显卡,显存512M以上。 软件环境: 操作系统:Windows XP。 语言开发工具:Microsoft Visual studio 2008,Visual C++。 三、实验内容与要求 要求:实验课上老师要求的效果截图、及其相应代码拷贝到实验报告文档里。 WORD文档命名方式:学号姓名-实验序号-实验名称。 内容: 1、闲置函数的使用与简单动画。 (1) 旋转的六边形,如图3-1所示 阅读五 ,5.1)中旋转的六边形样本框架程序,分析程序的实现步骤: 运行该程序,观察旋转动画效果。 思考: 如果要调整旋转速度,旋转更快或更慢,应该如何修改程序?

图3-1 (2) 线框六边形 在display 函数中 添加多边形模式设置语句观看效果。 glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); //线框模式 添加线宽语句观看效果 glLineWidth(2.0); //设置线宽 重回多边形填充模式: glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); //填充模式 (3) 在图形中添加字符"Hello",观察结果;然后将"Hello"字符改为自 己名字的拼音或英文名字。如图3-2所示。 提示:在图形中添加如下代码: glColor3f(1,0,0); //设置红色绘制颜色 glRasterPos2i(30,20); //定位当前光标,起始字符位置 glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'H'); //写字符"H" glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'e'); //写字符"e" glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'l'); //写字符"l" glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'l'); //写字符"l" glutBitmapCharacter(GLUT_BITMAP_9_BY_15,'o'); //写字符"o"

OpenGL中创建一个球体动画,使球体在窗口内做自由落体运动.

计算机图形学实验报告 1、实验目的和要求 利用第七章所学的知识,试在OpenGL中创建一个球体动画,使球体在窗口内做自由落体运动,并在撞击地面后能够反弹回来。并用相应的代码表示出来。2、实验内容 利用glutSolidSphere函数等其它函数,在OpenGL中创建一个球体动画,使球体在窗口内做自由落体运动,并在撞击地面后能够反弹回来 3、实验步骤 1)相关算法及原理描述 我们所使用的glut实用工具中,正好就有一个绘制球体的现成函数:glutSolidSphere,这个函数在“原点”绘制出一个球体。由于坐标是可以通过glTranslate*和glRotate*两个函数进行随意变换的,所以我们就可以在任意位置绘制球体了。 2)运行结果 如下图,程序调试成功,并且能正常显示 4、实验总结 通过本次试验,进一步认识,感觉OpenGL的功能很强大,各种各样的物理模拟实验他都不在话下!!不得不说,这软件很好很强大!!由于自己不太擅长编程,所以有些功能还不能完全实现,但我会尽自己最大努力来克服自己的编程不足之

处,多加练习。 5、附录 带注释的源程序 #include "glut.h" #include #include #include #include #define PI 3.1415926 double move=20.0; int i=0; int down=1; int count=1; double timeSpan=0; //下降到底所需时间double movey=0.0; double duration=0.0; //持续时间 double length=0.0; clock_t start,end; void init(void) { GLfloat mat_specular[]={220.220,220.0,220.0,220.0}; GLfloat mat_shininess[]={100.0}; GLfloat light_position[]={0.0, 0.0, 0.0, -2.0}; //r-l u-d f-b GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f }; GLfloat diffuseLight[] = { 0.6f, 0.6f, 0.6f, 1.0f }; GLfloat specular[] = { 1.0f, 1.0f, 1.0f, 1.0f}; glClearColor(0.2,0.2,1.5,2.0); //bgc glColor3ub(100, 100, 215); glShadeModel(GL_SMOOTH); glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular); glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess); glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight); glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight); glLightfv(GL_LIGHT0,GL_SPECULAR,specular); glLightfv(GL_LIGHT0,GL_POSITION,light_position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); }

OpenGL 用三角形模拟生成球面

在看OpenGL红皮书,看到生成球体这节,讲了很多,总感觉不如自己动手写一些代码来的实在,用OpenGL中三角形模拟球形生成.主要要点,模型视图变换,多边形表面环绕一致性,矩阵堆栈.先贴上代码. 虽然是用F#写的,但是处理全是过程式的,很好理解. 1 #r "F:\3D\1.0\Binaries\OpenTK\Debug\OpenTK.dll" 2 #r "F:\3D\1.0\Binaries\OpenTK\Debug\OpenTK.GLControl.dll" 3 4open System 5open System.Collections.Generic 6open System.Windows.Forms 7open System.Threading 8open System.Drawing 9open System.Drawing.Imaging 10open OpenTK 11open OpenTK.Graphics 12open OpenTK.Graphics.OpenGL 13https://www.doczj.com/doc/c310540345.html, 14type loopForm() as form= 15inherit Form() 16let mutable x = 5.f 17let mutable y = 5.f 18let mutable z = 5.f 19let offest = 1.f 20let glControl = new OpenTK.GLControl() 21let textX= new TextBox() 22let textY= new TextBox() 23let textZ= new TextBox() 24let textLR = new TextBox() 25let textUD= new TextBox() 26let textInfo = new TextBox() 27let labelX= new Label() 28let labelY= new Label() 29let labelZ= new Label() 30let labelLR = new Label() 31let labelUD= new Label() 32let mutable first = 0 33let mutable buffer = 0 34let list = 0 35let scale = 3.f 36do 37form.SuspendLayout()

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