实验一 OpenGL初识

实验一 OpenGL初识
实验一 OpenGL初识

计算机图形学基础实验报告

实验1 OpenGL初识

一、实验目的

熟悉编程环境;了解光栅图形学显示器的特点,了解计算机绘图的特点;利用VC++OpenGL作为开发平台设计程序,已能够在屏幕上生成任意一个像素点作为本实验的目标。

二、实验内容

(1)了解和使用VC的开发环境,理解简单的OpenGL程序结构

(2)掌握OpenGL提供的基本图形函数,尤其是生成点函数。

三、实验原理

(1)基本语法

常用的程序设计语言,如C、C++、Pascal、Fortran和Java 等,都支持OpenGL 的开发。这里只讨论C版本下OpenGL的语法。

OpenGL基本函数均使用g1作为函数名的前缀,如glClearColor();实用函数则使用glu 作为函数名的前缀, 如gluSphere()。OpenGL基本常量的名字以GL_开头,如GL_LINE_LOOP;实用常量的名字以GLU_开头,如GLU_FILL。一些函数如glColor*().(定义颜色值), 函数名后可以接不同的后缀以支持不同的数据类型和格式。如glColor3(…)、glColor3d(…)、glColor3f(…)和glCo1or3bv(…)等,这几个函数在功能上是相似的,只是适用于不同的数据类型和格式,其中3表示该函数带有三个参数, b、d、f 分别表示参数的类型是字节型、双精度浮点型和单精度浮点型, v 则表示这些参数是以向量形式出现的。

为便于移植, OpenGL定义了一些自己的数据类型,如GLf1oat、GLvoid,它们其实就是C语言中的float和void。在gl.h文件中可以看到以下定义:

typedef float GLfloat;

typedef void GLvoid;

一些基本的数据类型都有类似的定义项。

(2)程序的基本结构

OpenGL程序的基本结构可分为三个部分:

第一部分是初始化部分。主要是设置一些OpenGL的状态开关,如颜色模式(RGBA 或Alpha)的选择、.是否作光照处理(若有的话,还需设置光源的特性)、深度检测、.裁剪等。这些状态一般都用函数glEnable(_), glDisable(,..)来设置, “_”表示特定的状态。

第二部分设置观察坐标系下的取景模式和取景框位置大小。主要利用了三个函数。

函数void glViewport(1eft,to p,right,bottom):设置在屏幕上的窗口大小. 四个参数描述屏幕窗口四个角上的坐标(以像素表示) 。

函数voidg10rtho(1efi,right,bottom,top,near,far):设置投影方式为正交投影(平行投影) ,其取景体积是一个各面均为矩形的六面体。

函数void gluPerspective(fovy,aspect,zNear,zFar):设置投影方式为透视投影, 其取景体积是一个截头锥体。.

第三部分是OpenGL的主要部分,使用OpenGL的库函数构造几何物体对象的数学描述,包括点线面的位置和拓扑关系、几何变換、光照处理等。

以上三个部分是OpenGL程序的基本框架,即使移植到使用MFC的Windows程序中, 也是如此。只是由于Windows 自身有一套显示方式, 需要进行一些必要的改动以协调这两种不同显不方式。

(3)状态机制

OpenGL的工作方式是一种状态机制,它可以进行各种状态或模式设置,这些状态或模式在重新改变它们之前一直有效。例如,当前颜色就是一个状态变量,在这个状态改变之前, 绘制的每个像素都将使用该颜色, 直到当前颜色被设置为其他颜色为止。OpenGL 中大量使用了这种状态机制,如颜色模式、投影模式、单双显不1缓存区的设置、背景色的设置、光源的位置和特性等。许多状态变量可以通过glEnable0、glDisable0这两个函数来设置成有效或无效状态, 如是否设置光照、是否进行深度检测等; 在被设置成有效状态之后,绝大部分状态变量都有一个默认值。通常情况下,可以用下列四个函数来获取某个状态变量的值: glGetBooleanv、glGetDouble.、. glGetF1oatv 和glGetIntegerv。究竟选择哪个函数应该根据所要获得的返回值的数据类型来决定。还有些状态变量有特殊的査询函数, 如glGetLight*、glGetError和glPolygonStipple 等。另外,使用glPushAttrib和glPopAttrib函数,可以存储和恢复最近的状态变量的值。只要有可能,都应该使用这些函数,因为它们比其他査询函数的效率更局。

四、实验代码

#include//头文件所在目录

void myDisplay(void){

glClearColor(0.0,0.0,0.0,0.0);//颜色清空

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0f,1.0f,1.0f);

glRectf(-0.5f,-0.5f,0.5f,0.5f);//矩形

glBegin(GL_TRIANGLES);//三角形

glColor3f(1.0f,0.0f,0.0f);glVertex2f(0.0f,1.0f);

glColor3f(0.0f,1.0f,0.0f);glVertex2f(0.8f,-0.5f);

glColor3f(0.0f,0.0f,1.0f);glVertex2f(-0.8f,-0.5f);

glEnd();

glPointSize(3);//设置点大小

glBegin(GL_POINTS);

glColor3f(1.0f,0.0f,0.0f);glVertex2f(-0.4f,-0.4f);

glColor3f(0.0f,1.0f,0.0f);glVertex2f(0.0f,0.0f);

glColor3f(0.0f,0.0f,1.0f);glVertex2f(0.4f,0.4f);

glEnd();

glBegin(GL_LINES);//线条

glColor3f(0.0f,1.0f,0.0f);glVertex2f(-1.0f,0.8f);

glColor3f(0.0f,1.0f,0.0f);glVertex2f(1.0f,0.8f);

glEnd();

glBegin(GL_LINES);

glColor3f(0.0f,1.0f,0.0f);glVertex2f(-1.0f,0.8f);

glColor3f(0.0f,1.0f,0.0f);glVertex2f(0.0f,-0.8f);

glEnd();

glBegin(GL_LINES);

glColor3f(0.0f,1.0f,0.0f);glVertex2f(1.0f,0.8f);

glColor3f(0.0f,1.0f,0.0f);glVertex2f(0.0f,-0.8f);

glEnd();

glFlush();

}

int main(int argc,char *argv[]){

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

glutInitWindowPosition(100,100);

glutInitWindowSize(400,400);

glutCreateWindow("Hello World!");

glutDisplayFunc(&myDisplay);

glutMainLoop();

return 0;

}

五、实验结果

以下是实验结果截图:

六、实验分析

1.文件存放目录不同,头文件中格式也不同

2.在坐标设定中,以窗口中心为坐标原点进行计算设置,以原点到边线的距离为一个单位长度

计算机图形学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--实验报告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/c48623312.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图形软件包绘制图形的基本过程及其程序框架,并在已有的程序框架中添加代码实现直线和圆的生成算法,演示直线和圆的生成过程,从而加深对直线和圆等基本图形生成算法的理解。 二、实验内容 实验要求:(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实现图形的平移、旋转、缩放

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实验报告及源代码实验七 模型加载

实验报告 学生姓名:学号:专业班级: 实验类型:□验证□综合□设计□创新实验日期: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基础

计算机图形学实验指导(一) –OpenGL基础 1.综述 这次试验的目的主要是使大家初步熟悉OpenGL这一图形系统的用法,编程平台是Visual C++,它对OpenGL提供了完备的支持。 尽管OpenGL包括渲染命令,但却独立于任何窗口系统和操作系统。因此,OpenGL并不包括用来打开窗口以及从键盘或鼠标读取事件的命令。在这里,我们应用GLUT库简化Windows窗口操作。 2.准备GLUT库 下载glut压缩包后,解压,把glut32.dll放在Windows的system32目录下,将glut32.lib 放在C:\program files\Microsoft Visual Studio\VC98\Lib目录中,将glut.h放在C:\program files\Microsoft Visual Studio\VC98\Include\GL目录中 2.在VC中新建项目 新建一个项目。 选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32 Console Application项,然后填入你自己的Project name,回车即可。VC为你创建一个工作区(WorkSpace),你的项目就放在这个工作区里。 为项目添加文件 为了使用OpenGL,我们需要在项目中加入相关的Lib文件:glut32.lib 选中菜单Project->Settings项,在link选项卡中的Object/Library modules栏中加入glut32.lib。 选择菜单File中的New选项,弹出一个分页的对话框,选中页Files中的C++sourcefile,填入文件名,钩选添加到刚才建的那个工程里,然后就可以开始编程了。 3.一个OpenGL的例子 #include //初始化OpenGL void init(void) { glClearColor(0.0f, 0.0f, 0.0f, 0.0f);//设置背景颜色 glShadeModel(GL_FLAT);//设置明暗处理 } //主要的绘制过程 void display(void) { glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓存 glBegin(GL_LINES);//开始画直线 glColor3f(1.0f, 1.0f, 1.0f);//设置颜色为白色 glVertex2f(30.0f, 30.0f);//第一根线的两个端点 glVertex2f(200.0f, 400.0f);

实验 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)),换句话说,实际上是先进行移动,然后进行旋转。即:实际变换的顺序与代码中写的

计算机图形学 opengl 文字显示

#include #include #include #pragma comment(linker, "/subsystem:console") using namespace std; void myReshape(GLsizei w,GLsizei h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w<=h) glOrtho(-20.0,20.0,-20.0*(GLfloat)h/(GLfloat)w, 20.0*(GLfloat)h/(GLfloat)w,-50.0,50.0); else glOrtho(-20.0*(GLfloat)h/(GLfloat)w, 20.0*(GLfloat)h/(GLfloat)w,-20.0,20.0,-50.0,50.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void drawCNString(const char* str) { int len=0, i; wchar_t* wstring; HDC hDC = wglGetCurrentDC(); GLuint list = glGenLists(1); for(i=0; str[i]!='\0'; ++i) { if( IsDBCSLeadByte(str[i]) ) ++i; ++len; } wstring = (wchar_t*)malloc((len+1) * sizeof(wchar_t)); MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, wstring, len); wstring[len] = L'\0'; for(i=0; i

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、基本图形绘制。

计算机图形学-绘制太阳系

实验名称:绘制太阳系(实验八) 班级:信09-1 学号:2108190911211 姓名:王杰 【实验目的】 1. 掌握GLUT实用包中创建多面体以及二次曲面的函数 2. 掌握OpenGL中的基本光照函数 3. 对几何变换、投影变换等内容进行复习 【实验内容】 1.在窗口绘制三个球体,分别代表太阳、地球和月球 2.为每个球体设置恰当的几何变换,要求: (1)太阳在场景中间 (2)地球在自转的同时绕太阳旋转 (3)月球在自转的同时绕地球旋转 3.为场景添加适当的光照渲染 4.源程序 #include static int day = 365; // 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, 2, 400000000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0, -20000000, 200000000, 0, 0, 0, 0, 0, 1); // 黄色的"太阳" glColor3f(1.0f, 2.0f, 0.0f); glRotatef(day/360.0*360.0, 0.0f, 0.0f, -1.0f); glutSolidSphere(69600000, 100, 100); // 蓝色的"地球" glColor3f(0.0f, 2.0f, 1.0f); glRotatef(day/360.0*360.0, 0.0f, 0.0f, -1.0f); glTranslatef(150000000, 0.0f, 0.0f); glutSolidSphere(15945000, 100, 100);

计算机图形学OpenGL(键盘控制三维汽车)

计算机图形学OpenGL ——键盘控制三维汽车 源程序: #include"stdafx.h" #include #include #include #include #include static GLfloat xRot = 0.0f; static GLfloat yRot = 0.0f;

void Display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glRotatef(xRot, 1.0f, 0.0f, 0.0f); //绕x轴旋转 glRotatef(yRot, 0.0f, 1.0f, 0.0f); //绕y轴旋转 //车下半部 glBegin(GL_POLYGON); glColor3f(0.1, 0.1, 0.8); glVertex3f(-40.0f,0.0f,15.0f); glVertex3f(40.0f,0.0f,15.0f); glColor3f(1, 0.5, 0.8); glVertex3f(40.0f,-15.0f,15.0f); glVertex3f(-40.0f,-15.0f,15.0f); glEnd(); glBegin(GL_POLYGON); glColor3f(0.3, 0.2, 0.5); glVertex3f(40.0f,0.0f,-15.0f); glVertex3f(40.0f,0.0f,15.0f); glVertex3f(40.0f,-15.0f,15.0f); glVertex3f(40.0f,-15.0f,-15.0f); glEnd(); glBegin(GL_POLYGON); glColor3f(0.3, 0.1, 0.3); glVertex3f(-40.0f,0.0f,-15.0f); glVertex3f(-40.0f,0.0f,15.0f); glVertex3f(-40.0f,-15.0f,15.0f); glVertex3f(-40.0f,-15.0f,-15.0f); glEnd(); glBegin(GL_POLYGON); glColor3f(0.1, 0.1, 0.8); glVertex3f(-40.0f,0.0f,-15.0f); glVertex3f(40.0f,0.0f,-15.0f); glColor3f(1, 0.5, 0.8); glVertex3f(40.0f,-15.0f,-15.0f); glVertex3f(-40.0f,-15.0f,-15.0f); glEnd(); glBegin(GL_POLYGON); glColor3f(0, 0, 1); glVertex3f(-40.0f,0.0f,15.0f); glVertex3f(-40.0f,0.0f,-15.0f); glVertex3f(40.0f,0.0f,-15.0f); glVertex3f(40.0f,0.0f,15.0f); glEnd(); glBegin(GL_POLYGON);

相关文档
最新文档