OpenGL上机实验全

OpenGL上机实验全
OpenGL上机实验全

目录

1 OpenGL的基本框架

1.1 OpenGL简介 (1)

1.2 OpenGL的工作方式 (2)

1.3 OpenGL的操作步骤 (3)

1.4 OpenGL的组成 (3)

1.5 OpenGL的数据类型 (4)

1.6 OpenGL函数命名约定 (4)

1.7 用OpenGL绘制图形 (4)

1.8 用OpenGL制作动画 (9)

2 图形的绘制

2.1 空间点的绘制 (13)

2.2 直线的绘制 (14)

2.3多边形面的绘制 (18)

2.4平面多面体的绘制 (24)

3 图形变换

3.1OpenGL中的变换 (30)

3.2模型视图矩阵 (31)

3.3 矩阵堆栈 (35)

4 OpenGL中的颜色、光照和材质

4.1 颜色 (42)

4.2 光照模型 (42)

4.3 材质属性 (43)

4.4 使用光照 (43)

4.5 使用光源 (48)

附录:参考函数

1.1 颜色使用 (58)

1.2 绘制几何图元 (59)

1.3 坐标转换 (63)

1.4 堆栈操作 (66)

1.5 使用光照和材质 (68)

1.6 帧缓存操作 (72)

1.7 查询函数 (72)

1.8 窗口初始化和启动事件处理 (75)

1.9 窗口管理 (77)

1.10 菜单管理 (80)

1.11 注册回调函数 (82)

1.12 几何图形绘制 (84)

1OpenGL的基本框架

1.1OpenGL简介

在计算机发展初期,人们就开始从事计算机图形的开发,但直到20世纪80年代末90年代初,三维图形才开始迅速发展。于是各种三维图形工具软件包相继推出,如GL,RenderMan等,但没有一种软件包能够在三维图形建模能力和编程方便程度上与OpenGL相比拟。

OpenGL(Open Graphics Library,开放图形库),是一个三维的计算机图形和模型库,它源于SGI公司为其图形工作站开发的IRIS GL,在跨平台移植过程中发展成为OpenGL。SGI公司在1992年6月发布1.0版,后成为工业标准。目前,OpenGL标准由1992年成立的独立财团OpenGL Architecture Review Board(ARB)以投票方式产生,并制成规范文档公布,各软硬件厂商据此开发自己系统上的实现。目前最新版规范是1999年5月通过的1.2.1。

OpenGL作为一个性能优越的图形应用程序设计界面(API),它独立于硬件和窗口系统,在运行各种操作系统的各种计算机上都可用,并能在网络环境下以客户/服务器模式工作,是专业图形处理、科学计算等高端应用领域的标准图形库。

OpenGL在军事、广播电视、CAD/CAM/CAE、娱乐、艺术造型、医疗影像、虚拟世界等领域都有着广泛的应用。它具有以下功能。

1. 模型绘制

OpenGL能够绘制点、线和多边形。应用这些基本的形体,可以构造出几乎所有的三维模型。OpenGL通常用模型的多边形的顶点来描述三维模型。

2. 模型观察

在建立了三维景物模型后,就需要用OpenGL描述如何观察所建立的三维模型。观察三维模型是通过一系列的坐标变换进行的。模型的坐标变换在使观察者能够在视点位置观察与视点相适应的三维模型景观。在整个三维模型的观察过程中,投影变换的类型决定观察三维模型的观察方式,不同的投影变换得到的三维模型的景象也是不同的。最后的视窗变换则对模型的景象进行裁剪缩放,即决定整个三维模型在屏幕上的图象。

3. 颜色模式的指定

OpenGL应用了一些专门的函数来指定三维模型的颜色。程序开发者可以选择二个颜色模式,即RGBA模式和颜色表模式。在RGBA模式中,颜色直接由RGB值来指定;在颜色表模式中,颜色值则由颜色表中的一个颜色索引值来指定。开发者还可以选择平面着色和光滑着色二种着色方式对整个三维景观进行着色。

4. 光照应用

用OpenGL绘制的三维模型必须加上光照才能更加与客观物体相似。OpenGL提供了管理四种光(辐射光、环境光、镜面光和漫射光)的方法,另外还可以指定模型表面的反射特性。

5. 图象效果增强

OpenGL提供了一系列的增强三维景观的图象效果的函数,这些函数通过反走样、混合和雾化来增强图象的效果。反走样用于改善图象中线段图形的锯齿而更平滑,混合用于处理模型的半透明效果,雾使得影像从视点到远处逐渐褪色,更接近于真实。

6. 位图和图象处理

OpenGL还提供了专门对位图和图象进行操作的函数。

7. 纹理映射

三维景物因缺少景物的具体细节而显得不够真实,为了更加逼真地表现三维景物,OpenGL提供了纹理映射的功能。OpenGL提供的一系列纹理映射函数使得开发者可以十分方便地把真实图象贴到景物的多边形上,从而可以在视窗内绘制逼真的三维景观。

8. 实时动画

为了获得平滑的动画效果,需要先在内存中生成下一幅图象,然后把已经生成的图象从内存拷贝到屏幕上,这就是OpenGL的双缓存技术(double buffer)。OpenGL提供了双缓存技术的一系列函数。

9. 交互技术

目前有许多图形应用需要人机交互,OpenGL提供了方便的三维图形人机交互接口,用户可以选择修改三维景观中的物体。

1.2OpenGL的工作方式

1.2.1 OpenGL的体系结构

OpenGL是一套图形标准,它严格按照计算机图形学原理设计而成,符合光学和视觉原理,非常适合可视化仿真系统。

由于OpenGL是一种API,其中不包含任何窗口管理、用户交互或文件I/O函数。每个主机环境(如Microsoft Windows)在这些方面都有自己的函数,由这些函数负责实现某些方法,以便把窗口或位图的绘制控制权移交给OpenGL。通常,一个完整的窗口系统的OpenGL图形处理系统的结构如图1.1所示:最底层为图形硬件,第二层为操作系统,第三层为窗口系统,第四层为OpenGL,最上面的层为应用软件。

应用软件

OpenGL

窗口系统

操作系统

图形硬件

图1.1 OpenGL图形处理系统的层次结构

OpenGL在Windows NT上的实现是基于客户机/服务器模式的,应用程序发出OpenGL 命令,由动态链接库OpenGL32.DLL接受和打包后,发送到服务器端的WINSRV.DLL,然后由它通过DDI(Device Driver Interface,设备驱动程序接口)层发往视频显示驱动程序。如果系统安装了硬件加速器,则由硬件相关的DDI来处理。OpenGL/NT的体系结构图如图1.2所示。

图1.2 OpenGL/NT体系结构

1.2.2 OpenGL的流水线

计 算 机 图 形 学 实 验 报 告

实验一:基本图形生成算法演示 一、实验目的与要求 了解OpenGL图形软件包绘制图形的基本过程及其程序框架,并在已有的程序框架中添加代码实现直线和圆的生成算法,演示直线和圆的生成过程,从而加深对直线和圆等基本图形生成算法的理解。 二、实验内容 实验要求:(1)理解glut程序框架 (2)理解窗口到视区的变换 (3)理解OpenGL实现动画的原理 (4)添加代码实现中点Bresenham算法画直线 (5)添加代码实现改进Bresenham算法画直线 (6)添加代码实现圆的绘制(可以适当对框架坐标系进行修改) 实验操作和步骤:本次实验主要的目的是为了掌握基本画线和画圆算法,对于书上给出的代码,要求通过本次试验来具体的实现。由于实验已经给出大体的框架,所以只需要按照书上的算法思想来设计具体实现代码,对于直线DDA算法,中点Bresenham算法及其改进算法,以及Bresenham画圆算法都有进一步的体会。DDA算法是对每一步都要进行增量处理,然后取整,绘制,而Bresenham通过判断误差函数和求取递推公式来实现。特别是对于整数的选择取舍,以及代码的流程和循环的控制有一个深入的了解。同时也熟练运用OpenGL基本的绘图函数。 三、实验结果 1-1. DDA算法画直线。 图1-1-1 ,显示每次DDA算法画线的坐标结果(如上)。

图1-1-2.显示DDA算法画圆过程及截图 1-2. 中点Bresenham算法画直线 1-2-1利用中点Bresenham算法画直线的各点坐标如上: 1-2-2.中点Bresenham画线算法画线过程截图

1-3. 利用改进的Bresenham画线算法来画图 1-3-1.利用改进的Bresenham算法来画图各点坐标如上: 1-3-2.利用改进的Bresenham算法画直线图形如上 1-4.利用Bresenham画圆算法来作图

研究生计算机图形学课程室内场景OpenGL--实验报告Word版

《高级计算机图形学》实验报告 姓名:学号:班级: 【实验报告要求】 实验名称:高级计算机图形学室内场景 实验目的:掌握使用OpenGL生成真实感复杂对象的方法,进一步熟练掌握构造实体几何表示法、扫描表示法、八叉树法、BSP树法等建模方法。 实验要求:要求利用OpenGL生成一个真实感的复杂对象及其周围场景,并显示观测点变化时的几何变换,要具备在一个纹理复杂的场景中漫游功能。要求使用到光线跟踪算法、 纹理映射技术以及实时绘制技术。 一、实验效果图 图1:正面效果图

图2:背面效果图 图4:背面效果图

图4:室内场景细节效果图 图5:场景角度转换效果图

二、源文件数据代码: 共6个文件,其实现代码如下: 1、DlgAbout.cpp #include "StdAfx.h" #include "DlgAbout.h" CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() 2、FormCommandView.cpp #include "stdafx.h" #include "Tool.h" #include "MainFrm.h" #include "FormCommandView.h" #include "ToolDoc.h" #include "RenderView.h" // Download by https://www.360docs.net/doc/2a2211519.html, #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // CFormCommandView IMPLEMENT_DYNCREATE(CFormCommandView, CFormView) CFormCommandView::CFormCommandView() : CFormView(CFormCommandView::IDD) { //{{AFX_DATA_INIT(CFormCommandView)

Opengl实验报告及源代码实验七 模型加载

实验报告 学生姓名:学号:专业班级: 实验类型:□验证□综合□设计□创新实验日期:2018.11 实验成绩:一、实验名称 实验七模型加载 二、实验内容 1.设计并实现Mesh类,利用该类实现模型网格的解析、加载、管理与渲染。 2.设计并实现Model类,利用该类实现几何模型的解析、加载、管理与渲染。 3.基于Mesh类和Model类,利用Assimp模型加载库,加载并渲染三维几何模型。 三、实验目的 1.掌握3D模型网格数据的组织与渲染方法。 2.掌握3D模型数据的结构与组织,以及模型数据的解析与渲染方法。 3.了解Assimp库中管理3D模型的数据结构,掌握Assimp库的使用方法。 四、实验步骤 1.定义网格类结构,并初始化 class Mesh { Public: vector vertices; vector indices; vector textures; Mesh(vector vertices, vector indices, vector texture); Void Draw(Shader shader); private: GLuint VAO, VBO, EBO; void setupMesh(); } void setupMesh() { glGenVertexArrays(1, &this->VAO); glGenBuffers(1, &this->VBO); glGenBuffers(1, &this->EBO); glBindVertexArray(this->VAO); glBindBuffer(GL_ARRAY_BUFFER, this->VBO);

计算机图形学 实验 利用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.实验目的: 理解掌握一个OpenGL程序平移、旋转、缩放变换的方法。 2.实验内容: (1)阅读实验原理,运行示范实验代码,掌握OpenGL程序平移、旋转、缩放变换的方法; (2)根据示范代码,尝试完成实验作业; 3.实验原理: (1)OpenGL下的几何变换 在OpenGL的核心库中,每一种几何变换都有一个独立的函数,所有变换都在三维空间中定义。 平移矩阵构造函数为glTranslate(tx, ty, tz),作用是把当前矩阵和一个表示移动物体的矩阵相乘。tx, ty,tz指定这个移动物体的矩阵,它们可以是任意的实数值,后缀为f(单精度浮点float)或d(双精度浮点double),对于二维应用来说,tz=0.0。 旋转矩阵构造函数为glRotate(theta, vx, vy, vz),作用是把当前矩阵和一个表示旋转物体的矩阵相乘。theta, vx, vy, vz指定这个旋转物体的矩阵,物体将绕着(0,0,0)到(x,y,z)的直线以逆时针旋转,参数theta表示旋转的角度。向量v=(vx, vy,vz)的分量可以是任意的实数值,该向量用于定义通过坐标原点的旋转轴的方向,后缀为f(单精度浮点float)或d(双精度浮点double),对于二维旋转来说,vx=0.0,vy=0.0,vz=1.0。 缩放矩阵构造函数为glScale(sx, sy, sz),作用是把当前矩阵和一个表示缩放物体的矩阵相乘。sx, sy,sz指定这个缩放物体的矩阵,分别表示在x,y,z方向上的缩放比例,它们可以是任意的实数值,当缩放参数为负值时,该函数为反射矩阵,缩放相对于原点进行,后缀为f(单精度浮点float)或d(双精度浮点double)。 注意这里都是说“把当前矩阵和一个表示移动<旋转, 缩放>物体的矩阵相乘”,而不是直接说“这个函数就是旋转”或者“这个函数就是移动”,这是有原因的,马上就会讲到。

OpenGL上机实验全

目录 1 OpenGL的基本框架 1.1 OpenGL简介 (1) 1.2 OpenGL的工作方式 (2) 1.3 OpenGL的操作步骤 (3) 1.4 OpenGL的组成 (3) 1.5 OpenGL的数据类型 (4) 1.6 OpenGL函数命名约定 (4) 1.7 用OpenGL绘制图形 (4) 1.8 用OpenGL制作动画 (9) 2 图形的绘制 2.1 空间点的绘制 (13) 2.2 直线的绘制 (14) 2.3多边形面的绘制 (18) 2.4平面多面体的绘制 (24) 3 图形变换 3.1OpenGL中的变换 (30) 3.2模型视图矩阵 (31) 3.3 矩阵堆栈 (35) 4 OpenGL中的颜色、光照和材质 4.1 颜色 (42) 4.2 光照模型 (42) 4.3 材质属性 (43) 4.4 使用光照 (43) 4.5 使用光源 (48) 附录:参考函数 1.1 颜色使用 (58) 1.2 绘制几何图元 (59) 1.3 坐标转换 (63) 1.4 堆栈操作 (66) 1.5 使用光照和材质 (68) 1.6 帧缓存操作 (72) 1.7 查询函数 (72) 1.8 窗口初始化和启动事件处理 (75) 1.9 窗口管理 (77) 1.10 菜单管理 (80) 1.11 注册回调函数 (82) 1.12 几何图形绘制 (84)

1OpenGL的基本框架 1.1OpenGL简介 在计算机发展初期,人们就开始从事计算机图形的开发,但直到20世纪80年代末90年代初,三维图形才开始迅速发展。于是各种三维图形工具软件包相继推出,如GL,RenderMan等,但没有一种软件包能够在三维图形建模能力和编程方便程度上与OpenGL相比拟。 OpenGL(Open Graphics Library,开放图形库),是一个三维的计算机图形和模型库,它源于SGI公司为其图形工作站开发的IRIS GL,在跨平台移植过程中发展成为OpenGL。SGI公司在1992年6月发布1.0版,后成为工业标准。目前,OpenGL标准由1992年成立的独立财团OpenGL Architecture Review Board(ARB)以投票方式产生,并制成规范文档公布,各软硬件厂商据此开发自己系统上的实现。目前最新版规范是1999年5月通过的1.2.1。 OpenGL作为一个性能优越的图形应用程序设计界面(API),它独立于硬件和窗口系统,在运行各种操作系统的各种计算机上都可用,并能在网络环境下以客户/服务器模式工作,是专业图形处理、科学计算等高端应用领域的标准图形库。 OpenGL在军事、广播电视、CAD/CAM/CAE、娱乐、艺术造型、医疗影像、虚拟世界等领域都有着广泛的应用。它具有以下功能。 1. 模型绘制 OpenGL能够绘制点、线和多边形。应用这些基本的形体,可以构造出几乎所有的三维模型。OpenGL通常用模型的多边形的顶点来描述三维模型。 2. 模型观察 在建立了三维景物模型后,就需要用OpenGL描述如何观察所建立的三维模型。观察三维模型是通过一系列的坐标变换进行的。模型的坐标变换在使观察者能够在视点位置观察与视点相适应的三维模型景观。在整个三维模型的观察过程中,投影变换的类型决定观察三维模型的观察方式,不同的投影变换得到的三维模型的景象也是不同的。最后的视窗变换则对模型的景象进行裁剪缩放,即决定整个三维模型在屏幕上的图象。 3. 颜色模式的指定 OpenGL应用了一些专门的函数来指定三维模型的颜色。程序开发者可以选择二个颜色模式,即RGBA模式和颜色表模式。在RGBA模式中,颜色直接由RGB值来指定;在颜色表模式中,颜色值则由颜色表中的一个颜色索引值来指定。开发者还可以选择平面着色和光滑着色二种着色方式对整个三维景观进行着色。 4. 光照应用 用OpenGL绘制的三维模型必须加上光照才能更加与客观物体相似。OpenGL提供了管理四种光(辐射光、环境光、镜面光和漫射光)的方法,另外还可以指定模型表面的反射特性。 5. 图象效果增强 OpenGL提供了一系列的增强三维景观的图象效果的函数,这些函数通过反走样、混合和雾化来增强图象的效果。反走样用于改善图象中线段图形的锯齿而更平滑,混合用于处理模型的半透明效果,雾使得影像从视点到远处逐渐褪色,更接近于真实。 6. 位图和图象处理 OpenGL还提供了专门对位图和图象进行操作的函数。 7. 纹理映射 三维景物因缺少景物的具体细节而显得不够真实,为了更加逼真地表现三维景物,OpenGL提供了纹理映射的功能。OpenGL提供的一系列纹理映射函数使得开发者可以十分方便地把真实图象贴到景物的多边形上,从而可以在视窗内绘制逼真的三维景观。 8. 实时动画

实验二OpenGL颜色填充

实验二、OpenGL颜色填充 1、实验目的 1)了解OpenGL 图形库的功能和结构; 2)学习了解OpenGL 程序的基本结构,及常用函数; 3)学习使用OpenGL 颜色填充算法; 2、实验内容 1)使用OpenGL 编写一个简单的C++程序,使该程序能够填充多边形和圆等图形。 2 )使用OpenGL 编写一个简单的C++程序,使该程序能够填充已填充过的图形。 3、实验过程 1)在系统上配置好OpenGL的环境(头文件,库文件,和链接库文件); 2)使用Visual V++6.0 新建一个C++文档,并创建相应的工程; 3)在文档中引入OpenGL的头文件,编辑代码实现:对不同图形的不同颜色填充。 4、实验结果 可单击鼠标左键,填充选中的图形; 可单击鼠标右键,调出菜单,可改变填充颜色,可恢复为填充状态。 结果截图:

1.初始状态: 2.填充多边形: 3.调出菜单,选择颜色: 4.填充圆形: 5.填充已填充的图形:

5、实验代码 1.#include "stdio.h" 2.#include 3.#include 4.#include "windows.h" 5. 6.////////////程序还有问题,不知如何解决 7.////////圆周率 8.const GLfloat Pi = 3.1415926536f; 9.///////////窗口长宽 10.GLfloat WinWidth=600.0, WinHeight=600.0; 11.//////////种子点 12.GLint fillx,filly; 13.////////填充色

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.实验目的: 理解掌握一个OpenGL程序平移、旋转、缩放变换的法。 2.实验容: (1)阅读实验原理,运行示实验代码,掌握OpenGL程序平移、旋转、缩放变换的法; (2)根据示代码,尝试完成实验作业; 3.实验原理: (1)OpenGL下的几变换 在OpenGL的核心库中,每一种几变换都有一个独立的函数,所有变换都在三维空间中定义。 平移矩阵构造函数为glTranslate(tx, ty, tz),作用是把当前矩阵和一个表示移动物体的矩阵相乘。tx, ty,tz指定这个移动物体的矩阵,它们可以是任意的实数值,后缀为f(单精度浮点float)或d(双精度浮点double),对于二维应用来说,tz=0.0。 旋转矩阵构造函数为glRotate(theta, vx, vy, vz),作用是把当前矩阵和一个表示旋转物体的矩阵相乘。theta, vx, vy, vz指定这个旋转物体的矩阵,物体将绕着(0,0,0)到(x,y,z)的直线以逆时针旋转,参数theta表示旋转的角度。向量v=(vx, vy,vz)的分量可以是任意的实数值,该向量用于定义通过坐标原点的旋转轴的向,后缀为f(单精度浮点float)或d(双精度浮点double),对于二维旋转来说,vx=0.0,vy=0.0,vz=1.0。缩放矩阵构造函数为glScale(sx, sy, sz),作用是把当前矩阵和一个表示缩放物体的矩阵相乘。sx, sy,sz指定这个缩放物体的矩阵,分别表示在x,y,z向上的缩放比例,它们可以是任意的实数值,当缩放参数为负值时,该函数为反射矩阵,缩放相对于原点进行,后缀为f(单精度浮点float)或d(双精度浮点double)。注意这里都是说“把当前矩阵和一个表示移动<旋转, 缩放>物体的矩阵相乘”,而不是直接说“这个函数就是旋转”或者“这个函数就是移动”,这是有原因的,马上就会讲到。 假设当前矩阵为单位矩阵,然后先乘以一个表示旋转的矩阵R,再乘以一个表示移动的矩阵T,最后得到的矩阵再乘上每一个顶点的坐标矩阵v。那么,经过变换得到的顶点坐标就是((RT)v)。由于矩阵乘法满足结合率,((RT)v) = R(Tv)),换句话说,实际上是先进行移动,然后进行旋转。即:实际变换的顺序与代码中写的

X-opengl立方体的简单三维交互式几何变换实验报告代码

立方体的简单三维交互式几何变换 立方体的简单三维交互式几何变换。 功能:键盘的方向键实现立方体的上下左右平移;A键,S键分别实现向前,向后旋转;J键,K键分别实现放大,缩小;C键退出。 程序模块: 1.重绘回调函数,在窗口首次创建或用户改变窗口尺寸时被调用。void reshape(int w, int h) { glViewport(0, 0, w, h);// 指定视口的位置和大小 glMatrixMode(GL_PROJECTION); glLoadIdentity(); //glFrustum(-1.0, 1.0, -1.0, 1.0, 3.1, 10.0); //gluPerspective(45,1,0.1,10.0); glOrtho(-2.0, 2.0, -2.0, 2.0, 2.0, 10.0); } 2.绘制一个立方体。 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); // 四边形的左下

实验1 OpenGL中的二维编程

实验1 OpenGL中的二维编程 【实验目的】 1.掌握基本的openGL编程方法。 2.掌握二维图形的显示方法。 【实验题目】 1. 练习基本的openGL编程方法。 (1)配置openGL,能在VC下通过编译。 (2)阅读并运行simple.c,熟悉最简单的openGL程序结构。 (3)阅读并运行改进的simple2.c,掌握openGL程序的通用结构。给simple2.c 中的函数加注释。 可尝试做如下修改: (a)改变窗口的位置,尺寸,标题; (b)改变窗口背景色和矩形颜色; (c)改变矩形的尺寸和其在窗口中的位置,还可以只显示矩形的一部分(通过设置正投影参数(glOrtho函数的参数)和矩形四个顶点的坐标来完成); 2. 发挥想象,编程实现在窗口中绘制若干图形及设置它们的属性,并回答问题:(1)绘制若干个点,分别设置每个点的颜色和大小。 思考题1:glPointSize()可以放在glBegin()和glEnd()函数对之间吗? (2)绘制若干条直线段。设置线段的颜色,线型和线宽。 思考题1:以下命令会显示什么样的线段? glEnable(GL_LINE_STIPPLE); glColor3f(0.0, 1.0, 0.0); glLineWidth(2.0); glLineStipple(3, 0xcccc); glDisable(GL_LINE_STIPPLE); 思考题2:以下命令会显示什么样的线段? glShadeModel(GL_SMOOTH); glBegin(GL_LINES); glColor3f(1.0, 0.0, 0.0); glVertex2f(0.0, 0.5); glColor3f(0.0, 0.0, 1.0); glVertex2f(0.5, -0.5); glEnd(); 将glShadeModel(GL_SMOOTH)改为glShadeModel(GL_FLAT),其余命令不变,结果又会如何? (3)绘制若干个多边形。设置多边形的颜色,显示模式,隐藏某些边。 思考题1:以下命令会显示什么样的多边形?

计算机图形学实验报告实验七

贵州大学实验报告 学院:计算机科学与信息学院专业:计科班级:计科101 姓名徐艳学号1008060042 实验序号实验七 实验时间2011-5-19 指导教 师 吴云成绩 实验项目名称真实感图形生成 实验目的1、学习OpenGL 基本程序结构 2、学习VC++ OpenGL应用程序开发技术; 3、学习真实感图形的生成算法。 实验要求在openGL库下,通过实现一些简单的图形绘制,学习并掌握OpenGL 基本程序结构,了解真实感图形的生成算法。 实验原理通过在vc++工具里面添加openGL库的三个文件dll,lib,glut到相应的地方,在通过设置,就可以在VC环境下进行OpenGL 基本程序编写,实现一些真实感的图形的绘制。 实 验 环 境 微型计算机、VC++、OpenGL 实验步骤一,编写程序代码,并上机调试。二,生成界面,制作实验报告。主要代码: #include void display()

{glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON); glVertex2f(-0.5,-0.5); glVertex2f(-0.5,0.5); glVertex2f(0.5,0.5); glVertex2f(0.5,-0.5); glEnd(); glFlush(); } int main(int argc, char **argv) {glutInit(& argc,argv); glutCreateWindow("simple"); glutDisplayFunc(display); glutMainLoop(); } 实 验内容 在VC++ OpenGL环境下,用已学过的真实感图形生成算法设计并生成一真实感图形。 实 验 结 果 矩形:

实验一OpenGL图形编程入门

实验一 OpenGL图形编程入门 三、实验内容 1、建立一个工程文件,并运行样本程序my first program.cpp,观看结果。 (6)在工程文件中输入样本程序,单击启动调试按钮,观察运行结果。 样本程序:my first program.cpp #include void display(void) { glClear(GL_COLOR_BUFFER_BIT); //刷新颜色缓冲区 glFlush(); //用于刷新命令队列和缓冲区,使所有尚未被执行的 OpenGL命令得到执行 } void main(int argc, char** argv) { glutInit(&argc, argv); //初始化GLUT库 glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //设置显示模式 glutCreateWindow("hello"); //创建窗口,标题为“hello” glutDisplayFunc(display); //用于绘制当前窗口 glutMainLoop(); //表示开始运行程序,用于程序的结尾 } 运行结果: 创建一个名称是“hello”的窗口。如图1-7所示。 2、认真阅读样本程序,理解每个函数的作用,并修改窗口标题,显示为“我的 第一个OpenGL程序”。 3、窗口的设置。 在默认情况下,窗口的位置出现在屏幕的左上角,默认大小为300*300。 要求: 修改窗口大小为其他尺寸。 参考函数: glutInitWindowPosition(int x, int y);//为窗口指定初始位置,窗口左 上角在屏幕上的位置为(x,y) glutInitWindowSize(int width, int height); //设置窗口大小 4、背景色的设置。 在默认情况下背景色是黑色。 要求: (1)将窗口背景设置为白色(2)将窗口背景设置为其他颜色 参考函数: glClearColor(r,g,b,alpha);//设置背景颜色,此函数放在display()中, 并且放在glClear(GL_COLOR_BUFFER_BIT); 语句的前面。 其中r,g,b取值范围是[0,1],可以是浮点数。 例如glColor3f(0,0,0)为黑色,glColor3f(1,1,1)为白色,其他颜色应该如何设置? 5、基本图形绘制。

图形学实验报告 OpenGL实现橡皮筋技术教材

《计算机图形学基础》 实验2OpenGL实现橡皮筋技术

一、实验目的及要求 1.掌握橡皮筋技术的实现原理和方法; 2.掌握OpenGL的双缓存技术; 3.掌握OpenGL中鼠标的使用方法; 4.掌握OpenGL中键盘的使用方法; 二、实验环境 主要是软件开发环境:VC 6.0 三、实验内容 1、OpenGL中利用鼠标实现橡皮筋技术的例子。 2、OpenGL中利用键盘实现橡皮筋技术的例子。 3、OpenGL实现拾取操作的例子,演示拾取操作的过程,其中拾取窗口的宽度和高度都设置为10。 四、实验结果 1、利用鼠标实现橡皮筋技术的结果:

2、利于键盘实现橡皮筋技术的结果: 3、实现拾取操作的例子结果:

五、程序代码 1、利用鼠标实现橡皮筋技术 #include int iPointNum = 0; //已确定点的数目int x1=0,x2=0,y1=0,y2=0; //确定的点坐标 int winWidth = 400, winHeight = 300; //窗口的宽度和高度void Initial(void) { glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

void ChangeSize(int w, int h) { winWidth = w; winHeight = h; glViewport(0, 0, w, h); //指定窗口显示区域glMatrixMode(GL_PROJECTION); //设置投影参数 glLoadIdentity(); gluOrtho2D(0.0,winWidth,0.0,winHeight); } void Display(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0f, 0.0f, 0.0f); if(iPointNum >= 1) { glBegin(GL_LINES); //绘制直线段 glVertex2i(x1,y1); glVertex2i(x2,y2); glEnd(); } glutSwapBuffers(); //交换缓冲区

实验三 基于OpenGL的圆柱绘制 OpenGL纹理光照

实验三基于OpenGL的圆柱绘制 1. 实验目的 通过圆柱的绘制,掌握OpenGL编程环境的设置,基本图元的使用,光照的设置以及纹理的设置,理解曲面绘制的基本原理。 2. 实验内容 (1)设置OpenGL编程环境; (2)利用三角形和四边形等基本图元绘制底面圆圆心在坐标原点,半径为r,高为h,方向沿z轴方向的圆柱; (3)设置光照 (4)设置纹理:在圆柱的侧面上显示一张图片 3.主要问题&结果截图 ①如何绘制圆柱? 一种方法是调用gluc中的函数gluCylinder 但本实验要求利用三角形和四边形等基本图元绘制 所以这里主要采用类似微积分的方式绘制,就是将椭圆的侧面用多个四边形,底面用多个三角形来表示 关键代码 void Circle()底面的圆形void Cylinder()圆柱的侧面 glBegin(GL_TRIANGLE_FAN);//扇形连续填充三角形串 glVertex3f(0.0f, 0.0f, 0.0f);//圆心:这是三角形作为圆心的顶点 int i = 0; for (i = 0; i <= 360; i += 15) glBegin(GL_QUAD_STRIP);//连续填充四边形串int i = 0; for (i = 0; i <= 360; i += 15) { float p = i * 3.14 / 180; glTexCoord2f(p/10,0.1f);

{ float p = i * 3.14 / 180; glVertex3f(sin(p), cos(p), 0.0f);//圆周:这是三角形作为扇形弧端点的顶点(p的值取0-2PI)就能画出一个类似圆形 } glEnd(); glVertex3f(sin(p), cos(p), 1.0f);//这个1.0f 指定的是高度 glTexCoord2f(p/10,0.0f); glVertex3f(sin(p), cos(p), 0.0f); } glEnd(); 效果: 再调用画圆形的函数画上两个底面 Circle(); glTranslatef(0, 0, 1);//设定高度为1,画 上底面 Circle(); 效果: ②如何纹理贴图? 关键代码:

《计算机图形学》 课程实验指导(1)资料

《计算机图形学》课程实验指导 一.实验总体方案 1.教学目标与基本要求 (1)掌握教材所介绍的图形算法的原理; (2)掌握通过具体的平台实现图形算法的方法,培养相应能力; (3)通过实验培养具有开发一个基本图形软件包的能力。 2. 实验平台与考核 实验主要结合OpenGL设计程序实现各种课堂教学中讲过的图形算法为主。程序设计语言主要以C/C++语言为主,开发平台为Visual C++。 每次实验前完成实验报告的实验目的、实验内容、实验原理、实验代码四部分并接受抽查,实验完成后完成实验结果、实验体会两部分,本次实验课结束前提交。 3. 实验步骤 (1) 预习教材与实验指导相关的算法理论及原理; (2) 仿照教材与实验指导提供的算法,利用VC+OpenGL进行实现; (3) 调试、编译、运行程序,运行通过后,可考虑对程序进行修改或改进。 二. 实验具体方案 实验预备知识 OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。 1)与C语言紧密结合: OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL 作图甚至比TC更加简单; 2)强大的可移植性: 微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统。而OpenGL 不仅用于 Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL 的基本命令都做到了硬件无关,甚至是平台无关; 3) 高性能的图形渲染: OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。 总之,OpenGL是一个非常优秀的图形软件接口。OpenGL官方网站(英文)https://www.360docs.net/doc/2a2211519.html, 下面将对Windows下的OpenGL编程进行简单介绍。如下是学习OpenGL前的准备工作:1.选择一个编译环境 现在Windows系统的主流编译环境有Visual C++,C++ Builder,Dev-C++等,它们都是支持OpenGL的。但这里我们选择Visual C++ 作为学习OpenGL的实验环境。 2.安装GLUT工具包 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。Windows环境下的GLUT下载地址:(大小约为150k) https://www.360docs.net/doc/2a2211519.html,/resources/libraries/glut/glutdlls37beta.zip Windows环境下安装GLUT的步骤: 1)将下载的压缩包解开,将得到5个文件 2)在“我的电脑”中搜索“gl.h”,并找到其所在文件夹(如果是VisualStudio2005,则

OPENGL实验五

学院专业班学号 姓名:教师评定: 功能说明: 1.按W 键缩小视图 2.按S 键放大视图 3.按鼠标右键调出菜单(可选“线条”或“填充”,和开启转动) 4.按定鼠标左键可以任意角度调节视角 5.按+ 键风车加速 6.按- 键风车减速 主程序: #include #include #include #include #pragma comment(lib,"glaux.lib") //将glaux.lib连接到工程 GLuint g_TexturesArray[2];//纹理指针 enum //枚举鼠标变量 { BUTTON_LEFT ,//鼠标左键 }; int mButton = -1; int mOldY, mOldX; float eye[3] = {0.0f, 0.0f, 10.0f}; //观察视角 float rot[3] = {45.0f, 45.0f, 0.0f}; //旋转变量 float c,z,a=0.05; int n; int iMode=1; void ProcessMenu(int value)//弹出处理函数 { iMode=value; glutPostRedisplay();//强制刷新显示 } void CreatePopMenu()//生成弹出式菜单函数 { int nMainMenu;//主菜单变量 int SubMenu1,SubMenu2,SubMenu3;//子菜单变量 //创建子菜单1 SubMenu1=glutCreateMenu(ProcessMenu);//生成一个子菜单并指定菜单处理函数

基于OpenGL的三维图形绘制实验

基于OpenGL的三维图形绘制实验

目录 实验题目:交互图形程序设计基础实验 (3) 1.实验目的 (3) 2.实验内容 (3) 2.1 实验内容 (3) 2.2 实验任务 (3) 3.实验过程 (4) 3.1 预处理 (4) 3.3 主要函数说明 (5) 3.4 过程描述 (6) 3.5 运行截图 (7) 4.实验结果 (7) 5.实验体会 (7)

实验题目:交互图形程序设计基础实验1.实验目的 1)理解并掌握三维基本图形数据结构表示方法。 2)掌握编写OpenGL图形程序的基本方法. 3)掌握OpenGL基本图形表示及绘制。 2.实验内容 2.1 实验内容 基于OpenGL的三维图形绘制实验目的是掌握图形信息的表示、数据的组织,在此基础上基于OpenGL绘制出三维图形。实验内容包括OpenGL编程环境搭建、OpenGL程序结构、基本数据类型、核心函数等的使用;基本图形的绘制(点、线段、折线、闭合折线、多边形、三角形、三角扇、三角条带、四边形、四边形条带等)及图形属性控制(线宽、颜色、线型、填充样式等);对指定的若干三维模型进行建模、绘制,在一个程序框架下实现,提交1次程序,1份实验报告。 2.2 实验任务 1、使用Visual C++建立一个单文档(SDI)程序,完成OpenGL绘制框架程序的设计。在此基础上参照提供的资料,定义绘制函数,基于自定义的若干点坐标与颜色,分别绘制绘制点、线段、不闭合折线、闭合折线、多边形、三角形、四边形、三角扇、三角条带、四边形条带。 2、使用1中建立的程序框架,完成如下任务: (1)绘制正棱柱(底面多变形的边数及高度可以通过对话框输入) (2)正棱锥(底面多变形的边数及高度可以通过对话框输入) (3)正棱台(底面多变形的边数、台高、锥高可以通过对话框输入) 注意模型坐标系的选择和顶点坐标的计算,每个图形的绘制单独写成函数。加入菜单绘制三、四、五、六边的情况,其他边数情况从弹出对话框中输入参数,然后绘制。实际绘制要绘制成表面着色图,如下线框图仅供参考。 图 1

opengl实验报告

总评成绩:_________________________实验类型: 交互 实验名称: 实验2.3草拟 姓名: __肖祥炜____________ 学号: ____201158501103______ 班级: ___计111-1_______ 电子文档提交: 按时提交____延时提交____未提交____ 格式正确____基本正确____ 不正确____ 实验报告: 完整____合格____不合格____ 实验成绩:____________________ 验收记录:时间________________ 顺序________________ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

一、原创性声明 程序参考了drawFreeCurve.c程序自由画线部分,其余的都是自己原创的 二、实验要求 1.单击左键移动鼠标开始自由绘图。 2.单击鼠标右键绘制随机曲线: (1)单击键盘a放大图形 (2)单击键盘b缩小图形 三、完成情况 ●功能1 : 基本内容 ?功能描述: ?完成情况: 基本完成实验要求,但是在绘制随机线条时,图案总是显示在左下角,如果图 案调到中间左键自由绘制的时候点不在鼠标点上,不知道怎么改!! ?Bug:暂时没有找到 ?备注:图形放大会放大到窗口外面。 四、实现方案 1.用鼠标响应函数控制左右键,在左键条件下用一个参数记录鼠标单击几次,只有当参数为1 时才响应鼠标移动函数绘制点,所以只要鼠标移动速度比较慢就能自由绘制图形。 2.自由绘制随机曲线:绘制bezier曲线,把他的四个点用随机数代替就行,设置八个随机数分别控制4个点,单击右键,响应一次随机函数给4个点赋值。 3.放大缩小:放大与减少随机函数。 五、创新和亮点 六、运行结果 给出尽可能完备的测试用例及测试结果(截图) -合法的测试用例至少两个 -1:左键单击移动鼠标形成的图案

相关文档
最新文档