OpenGL室内三维环境(北邮计算机图形学作业)
基于OpenGL的三维图形绘制实验

基于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(Open Graphics Library)是一种跨平台的图形编程接口,被广泛应用于计算机图形学、游戏开发和科学可视化等领域。
本实验报告将介绍我对OpenGL的实验研究和学习成果。
一、实验目的本次实验的主要目的是掌握OpenGL的基本概念和使用方法,了解图形渲染的原理和过程,以及学习如何在OpenGL中创建和操作图形对象。
二、实验环境本次实验使用的是OpenGL的最新版本,并在Windows操作系统下进行开发。
使用的开发工具是Visual Studio和OpenGL的开发库。
三、实验过程1. 熟悉OpenGL的基本概念在开始实验之前,我先学习了OpenGL的基本概念,包括OpenGL的坐标系统、图形渲染管线、着色器等。
了解这些概念对于后续的实验非常重要。
2. 创建窗口和上下文在OpenGL中,我们需要先创建一个窗口和一个OpenGL上下文,以便进行图形渲染。
通过调用相关的OpenGL函数,我成功创建了一个窗口,并初始化了OpenGL的上下文。
3. 绘制基本图形接下来,我开始尝试绘制一些基本的图形,比如点、线和三角形。
通过设置顶点坐标和颜色,我成功绘制出了这些基本图形,并在窗口中显示出来。
4. 添加纹理为了使图形更加逼真和丰富,我学习了如何在OpenGL中添加纹理。
通过加载图片并设置纹理坐标,我成功将纹理贴在了绘制的图形上,使其具有了更加真实的效果。
5. 光照和阴影效果为了增加图形的立体感和真实感,我学习了如何在OpenGL中添加光照和阴影效果。
通过设置光源的位置和属性,以及材质的属性,我成功实现了光照和阴影的效果,使图形看起来更加逼真。
6. 动画效果为了使图形具有动态效果,我学习了如何在OpenGL中实现简单的动画效果。
通过每帧更新顶点的位置和纹理坐标,我成功实现了图形的旋转和平移动画,使其具有了动态的效果。
四、实验结果和分析通过以上的实验过程,我成功掌握了OpenGL的基本概念和使用方法,并实现了一些基本的图形渲染效果。
图形学试卷格式样卷(opengl)

2、 要得到如右图示的效果,glBegin()函数的类型参数可取为(
3、要实现屏幕区域的多视口显示,应采用(
A.glOrtho() C.glViewport()
B.gluPerspective() C. OpenGL 有 两 条 平 行 的 流 水 线 , 一 条 是 ,另一条
福州大学
一、选择题
1、 通过( 真实感。 A.模板 A.GL_POLYGON D.GL_LINE_LOOP
《计算机图形学》课程
样卷
)技术,我们可以将 2D 图像数据映射到 3D 图元上,以增强场景的 B.纹理映射 B.GL_LINES C. 光照 D.混合 ) C.GL_LINE_STRIP )函数。
是 。 3、解决纹理映射问题的两步映射法中的第一步是把纹理映射到一个简单的三维中 间表面上,如__________、_________或立方体表面等。
三、判断题
1、齐次坐标(1,2,3,0)表示三维空间的矢量(1,2,3) ( 。
)
2、显示器采用 RGB 颜色模型,它是加性颜色模型。 ( 中就不用排序了。 ( )
L 2 的一侧。
第 2 页 共 2 页
五、程序设计题
右图示的某程序菜单用鼠标右键控制。要求 写出用 glut 库函数实现该菜单功能的 OpenGL 程 序。
六、推导题
设有两直线段 L1 与 L 2 ,其中 L1 的两端点为 p1 (x1 , y1 )、p 2 (x 2 , y 2 ) , L 2 的两 端点为 q1 (x 3 , y3 )、q 2 (x 4 , y 4 ) 。要求设计一算法,该算法可以测试 L1 是否完全在
)
3、消隐算法中,场景里的多边形在 Z-Buffer 算法中是要求排序的,而在画家方法
基于OpenGL的三维动画效果设计与实现

基于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中重要的概念之一,它用来计算光源对物体的影响。
其中,主要包括光源的位置、光线的颜色和强度等因素。
图形学实验报告 OpenGL中的实体模型与层次模型

《计算机图形学基础》实验3OpenGL中的实体模型与层次模型一、实验目的及要求1.掌握GLUT库中的多面体函数的绘制方法;2.掌握GLUT库中的二、三次曲面的绘制方法;3.掌握绘制实体或线框模型的绘制方法;4.掌握显示列表的用法;二、实验环境主要是软件开发环境:VC 6.0三、实验内容1.利用OpenGL绘制简单多面体、二次及三次曲线的例子。
2.利用OpenGL绘制奥运五环标志。
四、实验结果1、利用OpenGL绘制简单多面体、二次及三次曲线的例子。
2、利用OpenGL绘制奥运五环标志五、程序代码1、利用OpenGL绘制简单多面体、二次及三次曲线#include <gl/glut.h>static GLsizei iMode = 1;static GLfloat xRot = 0.0f; //x方向旋转参数static GLfloat yRot = 0.0f; //y方向旋转参数GLUquadricObj *obj; //二次曲面对象void Initial(void){glClearColor(1.0f, 1.0f, 1.0f, 1.0f);glColor3f(0.0f, 0.0f, 0.0f);obj = gluNewQuadric( );gluQuadricDrawStyle(obj, GLU_LINE); //以线框方式绘制二次曲面对象}void ChangeSize(int w, int h){glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D (-1.5f, 1.5f, -1.5f, 1.5f);}void Display(void){glClear(GL_COLOR_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glRotatef(xRot, 1.0f, 0.0f, 0.0f); //旋转图形glRotatef(yRot, 0.0f, 1.0f, 0.0f); //旋转图形//指定需要绘制的图元switch(iMode) {case 1:glutWireTetrahedron(); break;case 2:glutSolidTetrahedron(); break;case 3:glutWireOctahedron(); break;case 4:glutSolidOctahedron(); break;case 5:glutWireSphere(1.0f,15,15); break;case 6:glutSolidSphere(1.0f,15,15); break;case 7:glutWireTeapot(1.0f); break;case 8:glutSolidTeapot(1.0f); break;case 9:gluSphere(obj, 1.0f, 15, 15); break;case 10:gluCylinder(obj,1.0f,0.0f,1.0f,15,15);break;case 11:gluPartialDisk(obj,0.3f,0.8f,15,15,30.0f,260.0f); break;default: break;}glFlush();}void ProcessMenu(int value){iMode = value;glutPostRedisplay();}void SpecialKeys(int key, int x, int y){if(key == GLUT_KEY_UP) xRot-= 5.0f;if(key == GLUT_KEY_DOWN) xRot += 5.0f;if(key == GLUT_KEY_LEFT) yRot -= 5.0f;if(key == GLUT_KEY_RIGHT) yRot += 5.0f;if(xRot > 356.0f) xRot = 0.0f;if(xRot < -1.0f) xRot = 355.0f;if(yRot > 356.0f) yRot = 0.0f;if(yRot < -1.0f) yRot = 355.0f;glutPostRedisplay();}int main(int argc, char* argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(400,400);glutInitWindowPosition(100,100);glutCreateWindow("OpenGL模型绘制函数示例");//创建菜单并定义菜单回调函数int nGlutPolyMenu = glutCreateMenu(ProcessMenu);glutAddMenuEntry("线框正四面体",1); //创建GLUT多面体绘制菜单glutAddMenuEntry("实体正四面体",2);glutAddMenuEntry("线框正八面体",3);glutAddMenuEntry("实体正八面体",4);int nGlutCurveMenu = glutCreateMenu(ProcessMenu); //创建GLUT曲面绘制菜单glutAddMenuEntry("线框球面",5);glutAddMenuEntry("实体球面",6);glutAddMenuEntry("线框茶壶",7);glutAddMenuEntry("实体茶壶",8);int nGluCurveMenu = glutCreateMenu(ProcessMenu); //创建GLU曲面绘制菜单glutAddMenuEntry("线框球面",9);glutAddMenuEntry("线框圆锥面",10);glutAddMenuEntry("线框圆环面",11);int nMainMenu = glutCreateMenu(ProcessMenu); //创建主菜单glutAddSubMenu("GLUT多面体", nGlutPolyMenu);glutAddSubMenu("GLUT曲面", nGlutCurveMenu);glutAddSubMenu("GLU曲面", nGluCurveMenu);glutAttachMenu(GLUT_RIGHT_BUTTON);glutDisplayFunc(Display);glutReshapeFunc(ChangeSize);glutSpecialFunc(SpecialKeys);Initial();glutMainLoop();return 0;}2、利用OpenGL绘制奥运五环标志#include <gl/glut.h>GLuint OlympicRings;void Initial(void){glClearColor(1.0f, 1.0f, 1.0f, 1.0f);OlympicRings = glGenLists(1);glNewList(OlympicRings, GL_COMPILE);glColor3f(1.0, 1.0, 0.0);glTranslatef(-22.0, 0.0, 0.0);glutSolidTorus(0.5, 20.0, 15, 50); //绘制黄色环glColor3f(0.0, 1.0, 0.0);glTranslatef(44.0, 0.0, 0.0);glutSolidTorus(0.5, 20.0, 15, 50); //绘制绿色环glColor3f(0.0, 0.0, 0.0);glTranslatef(-22.0, 30.0, 0.0);glutSolidTorus(0.5, 20.0, 15, 50); //绘制黑色环glColor3f(0.0, 0.0, 1.0);glTranslatef(-42.0, 0.0, 0.0);glutSolidTorus(0.5, 20.0, 15, 50); //绘制蓝色环glColor3f(1.0, 0.0, 0.0);glTranslatef(84.0, 0.0, 0.0);glutSolidTorus(0.5, 20.0, 15, 50); //绘制红色环glEndList();}void ChangeSize(int w, int h){glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D (-70.0f, 70.0f, -70.0f, 70.0f);}void Display(void){glClear(GL_COLOR_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glCallList(OlympicRings); //调用显示列表glFlush();}int main(int argc, char* argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(400,400);glutInitWindowPosition(100,100);glutCreateWindow("OpenGL模型绘制函数示例");glutDisplayFunc(Display);glutReshapeFunc(ChangeSize);Initial();glutMainLoop();return 0;}六、心得体会多面体画出来,如果函数引用缺少一部分,那么会很小。
计算机图形学OpenGL版实验1-4

实验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实验报告一、实验目的本实验旨在通过使用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场景,包括绘制立方体、添加光照效果和材质、实现相机控制以及添加纹理贴图。
这些技术和知识对于今后的图形编程工作将会有很大的帮助。
计算机图形学课程设计-三维真实感图形设计与绘制

计算机图形学课程设计报告一、实验题目三维真实感图形设计与绘制(1)题目内容说明:本题目要求应用OpenGL的光照技术和纹理技术实现一个简单的三维真实感图形的程序设计。
具体要求实现功能:1)通过对话方式实现交互式设计光照模型功能。
2)实现三维模型纹理映射功能3)用鼠标跟踪球方法实现三维模型的空间旋转2)实现鼠标跟踪球方法程序二、需求分析真实感图形的设计与绘制,是计算机图形学中的一个重要研究领域,也是三维实体造型系统和特征造型系统的重要组成部分。
一般地,三维实体在计算机显示屏上有三种表现形式:简单线框图、线框消隐图和真实感图形。
其中,简单线框图能够粗略表达实体的形状,但由于简单线框图的二义性,从而导致表达其的实体形状具有不确定性。
而线框消隐图虽然能反映实体各表面间的相互遮挡关系,从而达到消除简单线框图产生的二义性的目的,但是这两者一样地只能反映实体的几何形状和实体间的相互关系,而不能反映实体表面的特征,如表面的颜色、材质、纹理等。
所以,只有真实感图形才能表现实体的这些特征,因此,在三维实体造型中,生成三维实体的光照模型,进行实体的真实感绘制与显示占有重要的地位,是很有必要的,也是我做此设计的初衷。
在设计中,我主要使用Opengl绘制真实感图形,它作为一种强大的三维图形开发工具,通过便捷的编程接口提供了处理光照和物体材质、颜色属性等通用功能。
真实感图形学是计算机图形的核心内容之一,是最能直接反映图形学魅力的分支。
寻求能准确地描述客观世界中各种现象与景观的数学模型,并逼真地再现这些现象与景观,是图形学的一个重要研究课题。
很多自然景物难以用几何模型描述,如烟雾、植物、水波、火焰等。
本文所讨论的几种建模及绘制技术都超越了几何模型的限制,能够用简单的模型描述复杂的自然景物。
在计算机的图形设备上实现真实感图形必须完成的四个基本任务。
1. 三维场景的描述。
三维造型。
2. 将三维几何描述转换成为二维透视图。
透视变换。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
O p e n G L室内三维环境(北邮计算机图形学作业)-标准化文件发布号:(9456-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII计算机图形学第二次作业姓名:学号:学院:任课教师:一.设计要求试设计一个室内三维环境,并利用OPEN GL展示它的三维效果。
要求:(1)包含基本的实体元素:球,多面体,椎体,柱体,曲面等;(2)有全局光照和纹理功能(3)程序具有交互功能二.交互说明键盘的4个按键:上键:视角上移下键:视角下移左键:视角左移右键:视角右移三.效果展示四.程序代码#include<stdlib.h>#include<stdio.h>#include"glew.h"#include"glut.h"#include<windows.h>#pragma comment (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框架开始运行, 处理交互事件}11。