OpenGL室内三维环境(北邮计算机图形学作业)
- 格式:doc
- 大小:125.50 KB
- 文档页数:8
计算机图形学实验报告姓名:学号:班级:目录实验一OpenGL程序结构练习 (3)实验二基本图形生成 (6)实验三交互式控制 (9)实验四图形基本变换 (12)实验五三维图形生成及显示 (15)实验六三维图形生成及显示 (19)实验一OpenGL程序结构练习【实验目的】1.熟悉C语言环境下OpenGL的使用方法;2.了解OpenGL程序的基本结构。
【实验原理】绝大多数OpenGL程序具有类似的结构,包含下述函数main():定义回调函数,打开一个或多个具有指定属性的窗口,进入事件循环(最后一条可执行语句)init():设置状态变量、视图、属性、回调、显示函数、输入和窗口函数#include <GL/glut.h> // glut.h includes gl.h and glu.hvoid display(){ ……}void init(){ ……}int main( intargc, char **argv){ ……}【实验内容】1.了解程序中各个结构的功能;2.用OpenGL生成三角形。
【实验步骤及结果】1.导入OpenGL的glut32.lib和glut.h文件:将.lib文件存放到C 语言程序文件夹的Library下,.h文件放到Include下;导入应用程序扩展文件glut32.dll,存放到system文件夹下。
2.打开VC 6.0,新建工程,并命名为text1,如图1.图 13.在工程text1下新建源文件,并命名为text1.cpp。
4.编写代码并编译链接,如图2所示。
图 25.运行,结果如图3所示。
图 3实验二基本图形生成【实验目的】1.熟悉OpenGL的程序结构,并了解各部分的功能。
2.学会应用OpenGL语言绘制出点,线,多边形。
【实验原理】1.GLUT函数glutInit使得应用程序可以获取命令行参数并初始化系统。
glutInitDisplayMode设置窗口的属性、RGB颜色、单缓冲区、属性按照逻辑或组合在一起。
基于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)正棱台(底⾯多变形的边数、台⾼、锥⾼可以通过对话框输⼊)注意模型坐标系的选择和顶点坐标的计算,每个图形的绘制单独写成函数。
加⼊菜单绘制三、四、五、六边的情况,其他边数情况从弹出对话框中输⼊参数,然后绘制。
基于OpenGL的三维动画效果设计与实现OpenGL是一种跨平台的图形库,广泛应用于计算机图形学、游戏开发和虚拟现实等领域。
在OpenGL的基础上,可以实现各种精美的三维动画效果,如逼真的光影效果、自然的物理模拟和华丽的特效等。
本文将介绍如何基于OpenGL实现三维动画效果。
一、OpenGL简介OpenGL(Open Graphics Library)是一种跨平台的图形库,可以用于开发高性能的3D图形应用程序。
它提供了一套标准的API,程序员可以使用OpenGL库里的函数来绘制各种图形,包括点、线、三角形等。
OpenGL的主要优点是跨平台,程序可以在不同的操作系统和硬件上运行,并且不需要对程序做太多的修改。
二、OpenGL开发环境在开始OpenGL开发之前,需要配置正确的开发环境。
OpenGL的开发环境包括编程语言、OpenGL库、窗口系统和OpenGL的开发工具等。
编程语言:OpenGL支持多种编程语言,如C/C++、Java、Python等。
其中,C/C++是最常用的开发语言,因为它可以直接调用OpenGL的函数库。
OpenGL库:OpenGL库是开发OpenGL程序时必须的工具,它包含了OpenGL 的所有函数和常量。
窗口系统:OpenGL需要一个可视化的窗口系统,用来显示图形界面。
常用的窗口系统有Windows、Linux和MacOS等。
开发工具:开发OpenGL程序需要使用各种IDE和编辑器,如Visual Studio、CodeBlocks和Eclipse等。
三、实现三维动画效果的基础知识1.三维坐标系OpenGL使用右手坐标系表示三维坐标系,其中x轴向右,y轴向上,z轴向外。
2.矩阵变换OpenGL可以通过矩阵变换来实现图形的移动、旋转、缩放等操作。
常用的变换矩阵包括平移矩阵、旋转矩阵和缩放矩阵。
3.光照模型光照模型是OpenGL中重要的概念之一,它用来计算光源对物体的影响。
其中,主要包括光源的位置、光线的颜色和强度等因素。
实验1 OpenGL初识一、实验目的:熟悉编程环境;了解光栅图形显示器的特点;了解计算机绘图的特点;利用VC+OpenGL作为开发平台设计程序,以能够在屏幕上生成任意一个像素点为本实验的结束。
二、实验内容:(1)了解和使用VC的开发环境,理解简单的OpenGL程序结构。
(2)掌握OpenGL提供的基本图形函数,尤其是生成点的函数。
三、该程序的作用是在一个黑色的窗口中央画一个矩形、三角形和三个点,如图所示。
下面对各行语句进行说明:首先,需要包含头文件#include <GL/glut.h>,这是GLUT的头文件。
然后看main函数。
int main(int argc, char *argv[]),这个是带命令行参数的main函数。
这种以glut开头的函数都是GLUT工具包所提供的函数,下面对用到的几个函数进行介绍;1)glutInit,对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次。
其格式比较固定,一般都是glutInit(&argc, argv)就行;2) glutInitDisplayMode,设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的还有GLUT_INDEX(表示使用索引颜色)。
GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲)。
更多信息,以后的实验教程会有讲解介绍;3) glutInitWindowPosition,设置窗口在屏幕中的位置;4) glutInitWindowSize,设置窗口的大小;5) glutCreateWindow,根据前述设置的信息创建窗口。
参数将被作为窗口的标题。
注意:窗口被创建后,并不立即显示到屏幕上。
需要调用glutMainLoop才能看到窗口;6) glutDisplayFunc,设置一个函数,当需要进行画图时,这个函数就会被调用。
(暂且这样理解);7) glutMainLoop,进行一个消息循环。
关于opengl实验报告OpenGL实验报告一、实验目的本实验旨在通过使用OpenGL图形库,掌握基本的3D图形编程技术,以及了解OpenGL的基本操作和常用函数。
二、实验环境1. 操作系统:Windows 102. 开发环境:Visual Studio 20193. 编程语言:C++4. 图形库:OpenGL三、实验内容1. 创建一个窗口并初始化OpenGL环境2. 绘制一个简单的三维立方体3. 添加光照效果和材质4. 实现简单的相机控制5. 添加纹理贴图四、实验过程1. 创建窗口并初始化OpenGL环境首先,我们使用OpenGL提供的函数来创建一个窗口,并初始化OpenGL环境。
这一步是整个实验的基础,也是我们能够进行后续操作的前提。
2. 绘制一个简单的三维立方体利用OpenGL提供的函数,我们可以很容易地绘制一个简单的三维立方体。
通过设置顶点坐标和法向量,我们可以使用OpenGL提供的函数来绘制出一个立方体。
3. 添加光照效果和材质在绘制立方体的基础上,我们可以通过设置光源的位置和颜色,以及物体的材质属性,来实现光照效果和材质的渲染。
这一步可以让我们的立方体看起来更加真实。
4. 实现简单的相机控制通过控制相机的位置和方向,我们可以实现简单的相机控制。
这样可以让我们在3D场景中自由地移动和观察物体。
5. 添加纹理贴图最后,我们可以通过加载纹理图片,并将其贴到立方体的表面上,来实现纹理贴图。
这样可以让我们的立方体看起来更加生动和具有真实感。
五、实验总结通过本次实验,我们学习了如何使用OpenGL图形库进行3D图形编程,掌握了基本的操作和常用函数。
同时,我们也实现了一个简单的3D场景,包括绘制立方体、添加光照效果和材质、实现相机控制以及添加纹理贴图。
这些技术和知识对于今后的图形编程工作将会有很大的帮助。
计算机图形学大作业计算机图形学是一门融合计算机科学与绘图技术的学科,它已成为当今人工智能发展的重要组成部分。
它的研究主要是围绕具有图形表示形式的计算机屏幕图像的产生及处理以及数字图像的存储、处理等方面展开的。
计算机图形学的研究及应用得到了广泛应用,如动画制作、图像处理、科学可视化、智能识别等等,在电子游戏、电影及动画制作、合成图像等方面都发挥着重要作用。
在计算机图形学的课程学习当中,大作业是一个重要的组成部分。
大作业通常由学生们根据老师的要求,自行挑选或发挥创造力进行编写,根据不同的要求内容,学生有必要进行深入的钻研研究,完成一篇具有深度的以计算机图形学为主题的文章。
在计算机图形学大作业的内容中,首先要确定写作的主题和目标,确定文章的研究方向及内容,定义作业目标和范围。
然后,要细化研究内容,收集资料,分析学术论文和权威文献,如计算机图形学的发展历史、计算机图形学的基础原理、研究方法、应用领域以及未来的发展趋势等。
确定文章的写作形式,如报告、白皮书、论文和演讲等,根据不同的写作形式配置不同的内容结构。
此外,还要将获取的资料进行整理编写,正确组织语言、架构有条理的框架,撰写详尽、有力的文章,将所研究的内容详细梳理,归纳出层次清晰、概念明确、理论严谨的文章,力求说服力及深度。
同时,在完成写作内容后,要加强文章的质量控制,及时修订文章,添加精彩的细节,提高文章的质量,最终形成一篇条理清晰、内容丰富、表达流畅的计算机图形学大作业文章。
总之,完成一篇计算机图形学为主题的大作业文章,要求学生有深入的了解和研究,掌握计算机图形学的原理、范畴和实践,以深刻理解计算机图形学的基本原理和应用,通过完成一篇系统的计算机图形学大作业,扩展学生的学习深度,对计算机图形学的学习有更深的理解和把握。
计算机图形学第二次作业姓名:学号:学院:任课教师:一.设计要求试设计一个室内三维环境,并利用OPEN GL展示它得三维效果。
要求:(1)包含基本得实体元素:球,多面体,椎体,柱体,曲面等;(2)有全局光照与纹理功能(3)程序具有交互功能二.交互说明键盘得4个按键:上键:视角上移下键:视角下移左键:视角左移右键:视角右移三.效果展示四.程序代码#include<stdlib、h>#include<stdio、h>#include"glew、h"#include"glut、h"#include<windows、h>#pragma ment (lib, "glew32、lib")#define checkImageWidth 64#define checkImageHeight 64static GLubyte checkImage[checkImageHeight][checkImageWidth][4];static GLuint texName;static GLfloat xrot=0;static GLfloat yrot=0;//函数功能:绘制地面纹理图案void makeCheckImage(void){int i, j, c;for (i = 0; i < checkImageHeight; i++) {for (j = 0; j < checkImageWidth; j++) {c = ((((i&0x16)==0)^((j&0x16))==0))*255;checkImage[i][j][0] = (GLubyte) c;checkImage[i][j][1] = (GLubyte) c;checkImage[i][j][2] = (GLubyte) c;checkImage[i][j][3] = (GLubyte) 255;}}}//函数功能:初始化void SetupRC(void){glEnable(GL_LIGHTING); //启用灯源glEnable(GL_LIGHT0); //启用0号灯glShadeModel(GL_SMOOTH); //设置光滑着色模式glEnable(GL_DEPTH_TEST); //启用深度测试glEnable(GL_NORMALIZE); //启用法向量glClearColor(1、0f, 1、0f, 1、0f, 0、0f); //为色彩缓冲区指定用于清除得值//设置表面材料得属性GLfloat mat_ambient[] = {0、6f,0、6f,0、6f,1、0f};GLfloat mat_diffuse[] = {0、5f,0、5f,0、5f,1、0f};GLfloat mat_specular[] = {1、0f,1、0f,1、0f,1、0f,};GLfloat mat_shininess[] = {40、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); //镜面反射光得会聚强度//纹理makeCheckImage; //绘制地面纹理图案glPixelStorei(GL_UNPACK_ALIGNMENT, 1); //控制像素存储模式glGenTextures(1, &texName); //用来生成纹理得数量为1glBindTexture(GL_TEXTURE_2D, texName); //绑定纹理//纹理滤波,图象从纹理图象空间映射到帧缓冲图象空间glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth,checkImageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);}//函数功能:绘制墙壁void DrawWall(void){glPushMatrix; //矩阵堆栈压入glTranslated(1、2, 0、01, 1、2); //将变换矩阵与当前矩阵相乘,使原点移动到(参数值坐标) glScaled(2、4, 0、02, 2、4); //将比例矩阵与当前矩阵相乘,将当前图形沿x,y,z轴分别放大为原来得(参数值)倍glutSolidCube(1、0); //size=1、0得实心立方体glPopMatrix; //矩阵堆栈弹出}//函数功能:绘制立方柱体void DrawPillar(void){glPushMatrix;glTranslated(0, 0、15, 0);glScaled(0、02, 0、3, 0、02);glutSolidCube(1、0);glPopMatrix;}//函数功能:绘制桌子void DrawTable(void){glPushMatrix;glTranslated(0、05, 0、3, 0、05);glScaled(0、6, 0、02, 0、6);glutSolidCube(1、0); //绘制桌面glPopMatrix;glPushMatrix;glTranslated(0、275, 0, 0、275);DrawPillar; //绘制桌腿glTranslated(0, 0, 0、45);DrawPillar; //绘制桌腿glTranslated(0、45, 0, 0、45);DrawPillar; //绘制桌腿glTranslated(0, 0, 0、45);DrawPillar; //绘制桌腿glPopMatrix;}//函数功能:绘图void RenderScene(void){GLfloat light_position[]={2、0f, 6、0f, 3、0f, 0、0f};glLightfv(GL_LIGHT0,GL_POSITION,light_position); //指定0号光源得位置glMatrixMode(GL_PROJECTION); //对投影矩阵应用随后得矩阵操作glLoadIdentity; //将当前得用户坐标系得原点移到了屏幕中心GLfloat h = 1、0; //窗口得一半高度glOrtho(h*64/48、0, h*64/48、0, h, h, 0、1, 100、0); //将当前得可视空间设置为正投影空间:左,右,下,上,近,远。
glMatrixMode(GL_MODELVIEW); //对模型视景矩阵堆栈应用随后得矩阵操作glLoadIdentity;gluLookAt(2, 1、6, 2, 0, 0、2, 0, 0, 1, 0); //设置观察坐标系//开始绘制glRotatef(xrot, 1、0f, 0、0f, 0、0f); //旋转轴经过原点,方向为(1,0,0),旋转角度为xrot,方向满足右手定则glRotatef(yrot, 0、0f, 1、0f, 0、0f); //旋转轴经过原点,方向为(0,1,0),旋转角度为yrotglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glPushMatrix;glRotated(90、0, 0、0, 0、0, 1、0);DrawWall; //绘制一面墙壁glPopMatrix;glPushMatrix;glRotated(90、0, 1、0, 0、0, 0、0);DrawWall; //绘制另一面墙壁glPopMatrix;glPushMatrix;glTranslated(0、4, 0, 0、4);DrawTable; //绘制桌子glPopMatrix;glPushMatrix;glTranslated(0、2, 0、1, 0、85);glScaled(0、8, 0、8, 1、0);glutSolidCube(0、2); //绘制箱子glPopMatrix;glPushMatrix;glTranslated(0、6, 0、38, 0、6);glRotated(100, 0, 1, 0);glutSolidTeapot(0、1); //绘制茶壶glPopMatrix;glPushMatrix;glTranslated(0、3, 0、33, 0、5);glRotated(180, 0, 180, 180);glutSolidTorus(0、02f, 0、05, 25, 50);//绘制手镯【丝状花环】glPopMatrix;glPushMatrix;glTranslated(0、45, 0、42, 0、3);glutSolidSphere(0、1, 15, 50); //绘制球体glPopMatrix;glPushMatrix;glTranslated(1、0, 0、35, 0、3);glScaled(0、03, 0、7, 0、03);glutSolidCube(1、0); //绘制灯柱glPopMatrix;glPushMatrix;glTranslated(1、0, 0、7, 0、3);glRotated(190, 180, 200, 270);glutSolidCone(0、15, 0、25f, 30, 25); //绘制圆锥型灯罩glPopMatrix;//绘制纹理glEnable(GL_TEXTURE_2D); //开启纹理glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);//映射方式glBegin(GL_QUADS); //绘制地面//绘制四边形并给出当前顶点所对应得纹理坐标glTexCoord2f(0、0, 0、0); glVertex3f(0、0, 0、0, 0、0);glTexCoord2f(0、0, 1、0); glVertex3f(0、0, 0、0, 2、4);glTexCoord2f(1、0, 1、0); glVertex3f(2、4, 0、0, 2、4);glTexCoord2f(1、0, 0、0); glVertex3f(2、4, 0、0, 0、0);glEnd;glDisable(GL_TEXTURE_2D); //关闭纹理glFlush; //绘图结果显示到屏幕上}//函数功能:处理按键交互信息void SpecialKeys(int key, int x, int y){switch (key) {case GLUT_KEY_UP: //上键xrot += 1、0;break;case GLUT_KEY_DOWN: //下键xrot = 1、0;break;case GLUT_KEY_LEFT: //左键yrot += 1、0;break;case GLUT_KEY_RIGHT: //右键yrot = 1、0;break;default:break;}glutPostRedisplay; //标记当前窗口需要重新绘制glFlush; //绘图结果显示到屏幕上}//函数功能:改变窗口大小void ChangeSize(int w, int h){GLfloat lightPos[] = {50、f, 50、0f, 100、0f, 1、0f};GLfloat nRange = 1、9f;if (h == 0)h = 1;glViewport(0, 0, w, h); //重新设置屏幕上得窗口大小glMatrixMode(GL_PROJECTION);//后继操作都在投影变换范围内glLoadIdentity; //设置当前矩阵为单位矩阵//正交投影if (w <= h)glOrtho (nRange, nRange, nRange*h/w, nRange*h/w, nRange, nRange);elseglOrtho (nRange*w/h, nRange*w/h, nRange, nRange, nRange, nRange);glMatrixMode(GL_MODELVIEW); //选择模型观察矩阵glLoadIdentity; //设置当前矩阵为单位矩阵glLightfv(GL_LIGHT0, GL_POSITION, lightPos);//重新定义光源}void main{glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); //双缓存glutInitWindowSize(600, 400); //窗口大小glutInitWindowPosition(300, 100); //窗口位置glutCreateWindow("xdy room"); //创建窗口,名为xdy roomSetupRC; //自定义得初始化函数glutDisplayFunc(RenderScene); //显示回调函数,用于绘图glutReshapeFunc(ChangeSize); //处理改变窗口大小glutSpecialFunc(SpecialKeys); //处理按键交互信息glutMainLoop; //让GLUT框架开始运行, 处理交互事件}。