计算机图形学报告
计算机图形学--全部实验的实验报告
一、实验目的根据曲线和曲面的基础知识和常用曲线的数学基础,对其算法进行程序设计,验证算法的正确性,并通过程序结果加深对常用曲线数学模型的理解。
二、实验任务1.抛物线程序设计;2.Hermite 曲线程序设计;3.Bezier曲线的算法实现;4.B样条曲线的程序设计三、实验内容和实验步骤任务一:抛物线程序设计实现抛物线算法的C语言程序段如下:(工程名:parabola)Par(int xs,int ys,int xm,int ym,int xe,int ye) //已知起点、中点和终点三个控制点的坐标{double t,dt,ax,ay,bx,by,cx,cy;int n,i;ax=xe-2*xm+xs;ay=ye-2*ym+ys;bx=2.0*(xm-xs);by=2.0*(ym-ys);cx=xs; cy=ys;n=sqrt(ax*ax+ay*ay);n=sqrt(n*100.0);moveto(xs,ys);dt=1.0/n; t=0;for (i=0;i<=n; i++){lineto((int)(ax*t*t+bx*t+cx),(int)( ay*t*t+by*t+cy));t=t+dt;}lineto(xe,ye);}读者可以根据上述抛物线程序设计,写出抛物线参数样条曲线的程序。
任务二:Hermite 曲线程序设计P(t)=FB=TMB=[ t3 t2 t 1 ]程序设计时只考虑二维图形的显示,其代数形式为:x(t)=TMBx , Bx =[ P0x P1x R0x R1x]Ty(t)= TMBy , By =[ P0y P1y R0y R1y]T所以,只要给出Hermite曲线的起点坐标(P0x,P0y),终点坐标(P1x,P1y),以及起点处的切矢量(R0x,R0y)和终点处的切矢量(R1x,R1y),参数变量t在[0,1]的范围内分别取0.01,0.02,…,1,步长为0.01,取100个点,分别求出P(t)=[ x(t),y(t)],在计算机屏幕上显示出每个坐标点,即可绘出Hermite曲线。
《计算机图形学》实验报告
《计算机图形学》实验报告目录1实验2:直线的生成 (1)1.1实验要求和目的 (1)1.2实验课时 (1)1.3实验环境 (1)1.4实验内容 (1)1.5核心代码 (3)1.6实验结果 (7)1.6.1DDA算法 (10)1.6.2Mid-Bresenham算法 (11)1.7心得与体会 (12)2实验4:BSpline曲线绘制 (13)2.1实验要求和目的 (13)2.2实验课时 (13)2.3实验环境 (13)2.4实验内容 (13)2.5核心代码 (16)2.6实验结果 (18)2.6.1B-样条算法 (19)2.6.2Bezeir算法 (22)2.7心得与体会 (24)附录 (25)BSpline曲线控制点的测试数据 (25)数据1 (25)数据2 (27)数据3 (29)数据4 (30)数据5 (31)数据6 (33)数据7 (36)数据8 (38)1实验2:直线的生成1.1实验要求和目的理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力;编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的直线,分别调用DDA算法和Bresenham中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel 等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。
1.2实验课时3学时1.3实验环境本试验提供自带实验平台·开发环境:Visual C++ 6.0·实验平台:Free_Curve(自制平台)1.4实验内容本实验提供名为 Experiment_Frame_One的平台,该平台提供基本绘制、设置、输入功能,学生在此基础上实现·平台界面:如图1.4.1所示·设置:通过view->setting菜单进入,如图1.4.2所示·输入:通过view->input…菜单进入,如图1.4.3所示·实现算法:▪DDA算法:void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1)▪Mid_Bresenham算法:voidCExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1)图 1.4.1 总界面图 1.4.2 设置界面图 1.4.3 输入界面1.5核心代码本次实验的核心代码如下所示。
计算机图形学第五次实验报告
《计算机图形学》实验报告实验十一真实感图形一、实验教学目标与基本要求初步实现真实感图形, 并实践图形的造型与变换等。
二、理论基础运用几何造型, 几何、投影及透视变换、真实感图形效果(消隐、纹理、光照等)有关知识实现。
1.用给定地形高程数据绘制出地形图;2.绘制一(套)房间,参数自定。
三. 算法设计与分析真实感图形绘制过程中, 由于投影变换失去了深度信息, 往往导致图形的二义性。
要消除这类二义性, 就必须在绘制时消除被遮挡的不可见的线或面, 习惯上称之为消除隐藏线和隐藏面, 或简称为消隐, 经过消隐得到的投影图称为物体的真实图形。
消隐处理是计算机绘图中一个引人注目的问题, 目前已提出多种算法, 基本上可以分为两大类:即物体空间方法和图象空间方法。
物体空间方法是通过比较物体和物体的相对关系来决定可见与不可见的;而图象空间方法则是根据在图象象素点上各投影点之间的关系来确定可见与否的。
用这两类方法就可以消除凸型模型、凹形模型和多个模型同时存在时的隐藏面。
1).消隐算法的实现1.物体空间的消隐算法物体空间法是在三维坐标系中, 通过分析物体模型间的几何关系, 如物体的几何位置、与观察点的相对位置等, 来进行隐藏面判断的消隐算法。
世界坐标系是描述物体的原始坐标系, 物体的世界坐标描述了物体的基本形状。
为了更好地观察和描述物体, 经常需要对其世界坐标进行平移和旋转, 而得到物体的观察坐标。
物体的观察坐标能得到描述物体的更好视角, 所以物体空间法通常都是在观察坐标系中进行的。
观察坐标系的原点一般即是观察点。
物体空间法消隐包括两个基本步骤, 即三维坐标变换和选取适当的隐藏面判断算法。
选择合适的观察坐标系不但可以更好地描述物体, 而且可以大大简化和降低消隐算法的运算。
因此, 利用物体空间法进行消隐的第一步往往是将物体所处的坐标系转换为适当的观察坐标系。
这需要对物体进行三维旋转和平移变换。
常用的物体空间消隐算法包括平面公式法、径向预排序法、径向排序法、隔离平面法、深度排序法、光线投射法和区域子分法。
计算机图形学实验报告_2
计算机图形学实验报告学号:********姓名:班级:计算机 2班指导老师:***2010.6.19实验一、Windows 图形程序设计基础1、实验目的1)学习理解Win32 应用程序设计的基本知识(SDK 编程);2)掌握Win32 应用程序的基本结构(消息循环与消息处理等); 3)学习使用VC++编写Win32 Application 的方法。
4)学习MFC 类库的概念与结构;5)学习使用VC++编写Win32 应用的方法(单文档、多文档、对话框);6)学习使用MFC 的图形编程。
2、实验内容1)使用WindowsAPI 编写一个简单的Win32 程序,调用绘图API 函数绘制若干图形。
(可选任务)2 )使用MFC AppWizard 建立一个SDI 程序,窗口内显示"Hello,Thisis my first SDI Application"。
(必选任务)3)利用MFC AppWizard(exe)建立一个SDI 程序,在文档视口内绘制基本图形(直线、圆、椭圆、矩形、多边形、曲线、圆弧、椭圆弧、填充、文字等),练习图形属性的编程(修改线型、线宽、颜色、填充样式、文字样式等)。
定义图形数据结构Point\Line\Circle 等保存一些简单图形数据(在文档类中),并在视图类OnDraw 中绘制。
3、实验过程1)使用MFC AppWizard(exe)建立一个SDI 程序,选择单文档;2)在View类的OnDraw()函数中添加图形绘制代码,说出字符串“Hello,Thisis my first SDI Application”,另外实现各种颜色、各种边框的线、圆、方形、多边形以及圆弧的绘制;3)在类视图中添加图形数据point_pp,pp_circle的类,保存简单图形数据,通过在OnDraw()函数中调用,实现线、圆的绘制。
4、实验结果正确地在指定位置显示了"Hello,This is my first SDI Application"字符串,成功绘制了圆,椭圆,方形,多边形以及曲线圆弧、椭圆弧,同时按指定属性改绘了圆、方形和直线。
计算机图形学实验报告
计算机图形学实验二维填充图的生成1. 图元填充利用多种图元填充的方法绘制一面五星红旗。
方法有: 扫描转换多边形的逐点判断法(编码算法), 扫描线算法, 区域填充的扫描线算法, 自创的向内复制边法。
1.1说明:1.1.1 宏定义和类型定义:#define max 400#define pi 3.14159265#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define false 0#define true 1#define ok 1#define error 0#define infeasible -1#define overflow -2typedef int Status;typedef int bool;typedef struct {int y,xLeft,xRight;}SElemType;typedef struct{SElemType *base;SElemType *top;int stacksize;}SqStack;typedef struct Edge{int ymax;float x,deltax;struct Edge *nextEdge;}Edge;Edge *EL[max];typedef struct{float x,y;}point;Status SetStackEmpty(SqStack *s){s->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));if(!s->base) return overflow;s->top=s->base;s->stacksize=STACK_INIT_SIZE;return ok;}Status PushStack(SqStack *s,SElemType e){if(s->top-s->base>=s->stacksize){s->base=(SElemType*)(s->base,(s->stacksize+STACKINCREMENT)*sizeof(SElemType));if(!s->base) return error;s->top=s->base+s->stacksize;s->stacksize+=STACKINCREMENT;}*s->top++=e;return ok;}Status PopStack(SqStack *s,SElemType *e){ if(s->top==s->base) return error;*e=*(--s->top);return ok;}Status IsStackEmpty(SqStack *s){if(s->base==s->top) return true;else return false;}1.1.2其他由于要填充五角星, 我们就要得到五角星的十个顶点。
计算机图形学研究报告
计算机图形学研究报告计算机图形学是计算机科学的一个重要分支,它将复杂的数学原理应用于计算机系统,以创建有效的图形表现形式。
这项研究一直是计算机科学领域最重要的研究之一。
在过去的几十年里,计算机图形学在众多领域都发挥着重要作用,例如,它在多媒体、游戏开发和数据可视化领域均有所体现。
计算机图形学的研究主要集中在几个不同的方面,包括3D模型及其视觉表示、渲染算法、曲面建模、图形输入和交互设计等技术。
这些技术的目的在于更有效地将复杂的3D世界表示为可视化的图形表示形式。
渲染算法将3D图形转换为更加真实的2D图像,而图形输入将对象控制方式转化为可用于识别对象的模拟控制方式。
此外,计算机图形学还在电影制作、机器视觉及图像分析等领域中发挥重要作用。
电影制作中的建模和渲染技术可以帮助制作人员快速制作出高质量的电影。
机器视觉可以通过模拟视觉系统来识别和分析图像,从而实现机器自动控制。
在图像分析中,计算机图形学技术可以自动检测出图像中的特征,从而帮助进行精准的图像分割和物体识别。
随着计算机图形学技术的进一步发展,越来越多的新技术出现在日常生活中。
增强现实(AR)和虚拟现实(VR)技术的出现,尤其是新型AR / VR应用程序的开发,将会加速计算机图形学技术的发展。
此外,智能图像和视频分析技术也在蓬勃发展,其中大量利用计算机图形学技术。
这些可以应用于软件开发、医学成像、安全监控、无人机技术等多个行业,从而改善技术的效率,提高人类生活的质量。
综上所述,计算机图形学的发展不断推动着计算机科学的发展,它在多个领域均发挥着重要作用。
它是计算机及其相关科学领域的一个基本理论,并在诸多领域中不断发展壮大。
随着计算机技术的不断进步,计算机图形学技术也将得到进一步的发展,继续促进计算机科学的发展,并为人们带来更多的方便。
计算机图形学实验报告
计算机图形学实验报告
实验目的:通过本次实验,深入了解并掌握计算机图形学的基本原理和相关技术,培养对图形处理的理解和能力。
实验内容:
1. 图像的基本属性
- 图像的本质及表示方法
- 像素和分辨率的概念
- 灰度图像和彩色图像的区别
2. 图像的处理技术
- 图像的采集和处理
- 图像的变换和增强
- 图像的压缩和存储
3. 计算机图形学的应用
- 图像处理在生活中的应用
- 计算机辅助设计中的图形学应用
- 三维建模和渲染技术
实验步骤和结果:
1. 在计算机图形学实验平台上加载一张测试图像,分析其像素构成
和基本属性。
2. 运用图像处理技术,对测试图像进行模糊、锐化、色彩调整等操作,观察处理后的效果并记录。
3. 学习并掌握计算机图形学中常用的处理算法,如卷积、滤波等,
尝试应用到测试图像上并进行实验验证。
4. 探讨计算机图形学在数字媒体制作、虚拟现实、计算机辅助设计
等领域的应用案例,并总结其在实践中的重要性和价值。
结论:
通过本次实验,我对计算机图形学有了更深入的了解,掌握了图像
处理技术的基本原理和应用方法。
计算机图形学作为一门重要的学科,对多个领域有着广泛的应用前景,有助于提高数字媒体技术、虚拟现
实技术等领域的发展水平。
希望在未来的学习和工作中能进一步深化
对计算机图形学理论和实践的研究,不断提升自己在这一领域的专业
能力和创新意识。
计算机图形学-实验报告3-透视投影算法
实验地点
软件实验室
指导教师
李丽亚
在屏幕客户区中心绘制立方体的透视投影线框模型使用工具栏的动画图标按钮或键盘上的方向键旋转视点观察立方体生成立方体的旋转动画
实验报告
课ห้องสมุดไป่ตู้名称
班级
班级学号
姓名
实验日期
成绩
实验题目
透视投影算法
一、实验目的:
观察变换矩阵
透视投影变换矩阵
一点透视
二点透视
三点透视
二、实验内容:
在屏幕客户区中心绘制立方体的透视投影线框模型,使用工具栏的“动画”图标按钮或键盘上的方向键旋转视点观察立方体,生成立方体的旋转动画。选择工具栏的123图标按钮分别绘制立方体线框模型的一点透视图,二点透视图,三点透视图。
三、实验步骤:
(1)读入立方体8个顶点构成的顶点表与6个表面构成的表面表。
(2)使用透视投影矩阵在屏幕坐标系绘制立方体的透视投影。
(3)旋转视点观察立方体的透视投影。
(4)使用鼠标左键增加视径,缩小立方体的透视投影。
(5)使用鼠标左键减小视径,放大立方体的透视投影。
(6)使用双缓冲技术绘制立方体旋转动画。
《计算机图形学》实验报告
《计算机图形学》实验报告一、实验目的计算机图形学是一门研究如何利用计算机生成、处理和显示图形的学科。
通过本次实验,旨在深入理解计算机图形学的基本原理和算法,掌握图形的生成、变换、渲染等技术,并能够运用所学知识解决实际问题,提高对图形学的应用能力和编程实践能力。
二、实验环境本次实验使用的编程语言为 Python,使用的图形库为 Pygame。
开发环境为 PyCharm。
三、实验内容1、直线的生成算法DDA 算法(Digital Differential Analyzer)Bresenham 算法DDA 算法是通过计算直线的斜率来确定每个像素点的位置。
它的基本思想是根据直线的斜率和起始点的坐标,逐步计算出直线上的每个像素点的坐标。
Bresenham 算法则是一种基于误差的直线生成算法。
它通过比较误差值来决定下一个像素点的位置,从而减少了计算量,提高了效率。
在实验中,我们分别实现了这两种算法,并比较了它们的性能和效果。
2、圆的生成算法中点画圆算法中点画圆算法的核心思想是通过判断中点的位置来确定圆上的像素点。
通过不断迭代计算中点的位置,逐步生成整个圆。
在实现过程中,需要注意边界条件的处理和误差的计算。
3、图形的变换平移变换旋转变换缩放变换平移变换是将图形在平面上沿着指定的方向移动一定的距离。
旋转变换是围绕一个中心点将图形旋转一定的角度。
缩放变换则是改变图形的大小。
通过矩阵运算来实现这些变换,可以方便地对图形进行各种操作。
4、图形的填充种子填充算法扫描线填充算法种子填充算法是从指定的种子点开始,将相邻的具有相同颜色或属性的像素点填充为指定的颜色。
扫描线填充算法则是通过扫描图形的每一行,确定需要填充的区间,然后进行填充。
在实验中,我们对不同形状的图形进行了填充,并比较了两种算法的适用情况。
四、实验步骤1、直线生成算法的实现定义直线的起点和终点坐标。
根据所选的算法(DDA 或Bresenham)计算直线上的像素点坐标。
计算机图形学实验报告
实验结果与结论
• 在本次实验中,我们成功地实现了复杂场景的渲染,得到了具有较高真实感和视觉效果的图像。通过对比 实验前后的效果,我们发现光线追踪和着色器的运用对于提高渲染质量和效率具有重要作用。同时,我们 也发现场景图的构建和渲染脚本的编写对于实现复杂场景的渲染至关重要。此次实验不仅提高了我们对计 算机图形学原理的理解和实践能力,也为我们后续深入研究渲染引擎的实现提供了宝贵经验。
2. 通过属性设置和变换操作,实现了对图形的定 制和调整,加深了对图形属性的理解。
4. 实验的不足之处:由于时间限制,实验只涉及 了基本图形的绘制和变换,未涉及更复杂的图形 处理算法和技术,如光照、纹理映射等。需要在 后续实验中进一步学习和探索。
02
实验二:实现动画效果
实验目的
掌握动画的基本原 理和实现方法
04
实验四:渲染复杂场景
实验目的
掌握渲染复杂场景的基本流程和方法 理解光线追踪和着色器在渲染过程中的作用
熟悉渲染引擎的实现原理和技巧 提高解决实际问题的能力
实验步骤
• 准备场景文件 • 使用3D建模软件(如Blender)创建或导入场景模型,导出为常用的3D格式(如.obj或.fbx)。 • 导入场景文件 • 在渲染引擎(如Unity或Unreal Engine)中导入准备好的场景文件。 • 构建场景图 • 根据场景的层次结构和光照需求,构建场景图(Scene Graph)。 • 设置光照和材质属性 • 为场景中的物体设置光照和材质属性(如漫反射、镜面反射、透明度等)。 • 编写渲染脚本 • 使用编程语言(如C或JavaScript)编写渲染脚本,控制场景中物体的渲染顺序和逻辑。 • 运行渲染程序 • 运行渲染程序,观察渲染结果。根据效果调整光照、材质和渲染逻辑。 • 导出渲染图像 • 将渲染结果导出为图像文件(如JPEG或PNG),进行后续分析和展示。
图形学 实验报告
图形学实验报告一、实验介绍图形学是计算机科学中的一个重要领域,主要研究计算机图形的生成、显示和处理。
本次实验旨在通过学习图形学的基本概念和算法,深入理解计算机图形的原理与应用。
二、实验内容本次实验主要包含以下内容:1. 图形学的基本概念和历史发展2. 图形学中常用的几何变换和投影算法3. 光栅化算法及其在图形渲染中的应用4. 着色和光照模型的原理及实现方法5. 三维场景建模与渲染技术三、实验步骤和结果1. 图形学的基本概念和历史发展首先我们了解了图形学的基本概念和历史发展。
图形学起源于20世纪60年代,当时主要用于计算机辅助设计(CAD)和计算机辅助制造(CAM)领域。
随着计算机技术的不断发展,图形学逐渐应用于计算机图形的显示和处理领域。
2. 几何变换和投影算法接下来我们学习了图形学中常用的几何变换和投影算法。
几何变换包括平移、旋转和缩放等操作,通过改变图形的位置、角度和尺寸,实现对图形的变换和组合。
投影算法主要用于将三维空间中的图形投影到二维屏幕上,实现透视效果。
3. 光栅化算法及其应用在图形渲染中,光栅化算法是非常常用的技术。
光栅化算法将连续的几何图形转化为离散的像素,实现图形在屏幕上的显示。
常见的光栅化算法包括扫描线算法和边界填充算法。
4. 着色和光照模型的原理与实现为了实现真实感的图形渲染,着色和光照模型是不可或缺的。
着色模型描述了在光照条件下物体表面的颜色,常见的着色模型包括平面着色模型和高洛德着色模型。
光照模型则描述了光线在物体表面的反射和折射过程,常见的光照模型包括冯氏光照模型和布林-菲菲尔德模型。
5. 三维场景建模与渲染技术最后我们学习了三维场景建模与渲染技术。
三维场景建模主要包括建立三维模型和场景的几何结构信息。
三维渲染技术则是将建模得到的三维场景转换为可显示的二维图像。
四、实验总结通过本次实验的学习,我们深入了解了图形学的基本概念和算法。
图形学在计算机图形的生成、显示和处理中具有重要应用,对于计算机科学专业学生来说,学习图形学是必不可少的。
《计算机图形学》课内实验报告(实验一)
PFNGLUNIFORM1FARBPROC glUniform1fARB;
PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
#ifndef __APPLE__
PFNGLSECONDARYCOLOR3FPROC glSecondaryColor3f;
{
GLbyte infoLog[MAX_INFO_LOG_SIZE];
glGetInfoLogARB(progObj, MAX_INFO_LOG_SIZE, NULL, infoLog);
fprintf(stderr, "Error in program linkage!\n");
fprintf(stderr, "Info log: %s\n", infoLog);
// Demonstrates high-level shaders
// Program by Benjamin Lipchak
#include "../../Common/OpenGLSB.h" // System and OpenGL Stuff
#include "../../Common/GLTools.h" // System and OpenGL Stuff
// Initially set the blink parameter to 1 (no flicker)
if (flickerLocation != -1)
glUniform1fARB(flickerLocation,1.0f);
// Program object has changed, so we should revalidate
计算机图形学实验报告
计算机图形学实验报告引言计算机图形学是计算机科学中一个重要的研究领域,它涉及了计算机图像的生成、处理和显示等方面的技术。
本次实验旨在通过实际操作学习计算机图形学的相关知识,并利用图形学算法实现一些有趣的效果。
实验目的1. 了解计算机图形学的基本概念和发展历程;2. 掌握图形学中的基本几何变换,如平移、旋转和缩放等;3. 实现一些常见的图形学算法,如光照模型、三角形剪裁和绘制等。
实验准备在开始实验之前,我们需要准备一些实验所需的工具和环境。
首先,确保计算机上安装了图形学相关的软件,如OpenGL或DirectX等。
其次,为了编写和运行图形学程序,我们需要掌握基本的编程技巧,如C++或Python语言,并了解相关的图形库和API。
实验过程1. 实现平移、旋转和缩放首先,我们需要掌握图形学中的基本几何变换,如平移、旋转和缩放。
通过矩阵运算,我们可以很方便地实现这些变换。
例如,对于一个二维点P(x, y),我们可以通过以下公式实现平移:P' = T * P其中,P'是平移后的点,T是平移矩阵。
类似地,我们可以用旋转矩阵和缩放矩阵来实现旋转和缩放效果。
2. 实现光照模型光照模型是指在计算机图形学中模拟现实光照效果的一种方法。
它可以提供更真实的视觉效果,让计算机生成的图像更加逼真。
其中,常用的光照模型有环境光照、漫反射光照和镜面光照等。
通过计算每个像素的光照强度,我们可以实现阴影效果和光源反射等功能。
3. 实现三角形剪裁三角形剪裁是计算机图形学中一种常用的几何算法,用于确定哪些像素需要绘制,哪些像素需要剔除。
通过对三角形的边界和视口进行比较,我们可以快速计算出剪裁后的三角形顶点,以提高图形渲染的效率。
4. 实现图形绘制图形绘制是计算机图形学中的核心内容,它包括了点、线和面的绘制等。
通过设定顶点坐标和属性(如颜色、纹理等),我们可以使用算法绘制出各种形状的图像。
其中,常用的绘制算法有Bresenham算法和扫描线算法等。
计算机图形学实验报告(一).doc
实验一OpenGL开发环境及扫描转换算法1、实验目的与要求1.通过实验掌握OpenGL中编程环境的设置,了解相关函数用途及设置步骤;2.通过实验掌握基本图形元素的生成,给出相关代码和运行结果;3.用WINDOWS GDI函数编写生成直线或区域填充的程序(选DDA或Bresenham直线算法,活性边表算法填充多边形),演示算法过程。
4.画矩形,调用一个函数画一个矩形。
画椭圆,调用一个函数画一个椭圆。
画Bezier 曲线。
2、实验方案请描述为达到实验的需要完成哪些方面的实验,列举出实验的基本要点和重点。
在工程WinAPIEX加入void createLine(HDC tmpDC)和void Polyline (tmpDC)在void createLine(HDC tmpDC)用DDA直线算法或Bresenham直线算法生成直线在void Polyline (tmpDC)添加活泩边表填充算法,生成填充四边形和八边形加入Rectangle(tmpDC,x0,y0,x1,y1);加入Ellipse (tmpDC, x0,y0,a,b) ;加入PolyBezier(tmpDC,arr_vertex,4) ;3、实验结果和数据处理1)生成直线的DDA直线算法在createLine(tmpDC)中加入以下代码int x0,y0,x1,y1,color; //自定义直线的起点(x0,y0)和终点(x1,y1),及颜色colorfloat dx,dy,x,y;int length,i;x0=50;y0=160;x1=900;y1=200;//此处修改了color=1000; color=1;if(abs(x1-x0)>=abs(y1-y0))length=abs(x1-x0);elselength=abs(y1-y0);dx=(x1-x0)/(float)length;dy=(y1-y0)/(float)length;i=1;x=(float)x0;y=(float)y0;while(i<=length){SetPixel(tmpDC,int(x+0.5),int(y+0.5),color);x+=dx;y+=dy;i++;}2)区域填充的程序在void Polyline (tmpDC) 添加活性边表填充void Polyline (HDC tmpDC) //多边形边数.{const int POINTNUM=4;//或者是八边形8/******定义结构体用于活性边表AET和新边表NET***************************** ******/typedef struct XET{float x;float dx,ymax;XET* next;}AET,NET;/******定义点结构体point**************************** **************************/struct point{float x;float y;}polypoint[POINTNUM]={100,10 0,400,100,400,400,100,400};//正方形//polypoint[POINTNUM]={600,10 0,700,100,800,200,800,300,700,400,600, 400,500,300,500,200};//八边形顶点/******计算最高点的y坐标(扫描到此结束)****************************** **********/int MaxY=0;int i;for(i=0;i<POINTNUM;i++)if(polypoint[i].y>MaxY) MaxY=(int)polypoint[i].y;/*******初始化AET表********************************* **************************/AET *pAET=new AET;pAET->next=NULL;/******初始化NET表********************************* ***************************/NET *pNET[1024];for(i=0;i<=MaxY;i++){pNET[i]=new NET;pNET[i]->next=NULL;}/******扫描并建立NET表********************************* ************************/for(i=0;i<=MaxY;i++){for(intj=0;j<POINTNUM;j++)if(polypoint[j].y==i){if(polypoint[(j-1+POINTNUM)%POINT NUM].y>polypoint[j].y){NET*p=new NET;p->x=polypoint[j].x;p->ymax=polypoint[(j-1+POINTNUM) %POINTNUM].y;p->dx=(polypoint[(j-1+POINTNUM)%P OINTNUM].x-polypoint[j].x)/(polypoint [(j-1+POINTNUM)%POINTNUM].y-po lypoint[j].y);p->next=pNET[i]->next;pNET[i]->next=p;}if(polypoint[(j+1+POINTNUM)%POIN TNUM].y>polypoint[j].y){NET*p=new NET;p->x=polypoint[j].x;p->ymax=polypoint[(j+1+POINTNUM) %POINTNUM].y;p->dx=(polypoint[(j+1+POINTNUM)% POINTNUM].x-polypoint[j].x)/(polypoint[(j+1+POINTNUM)%POINTNUM].y-polypoint[j].y);p->next=pNET[i]->next;pNET[i]->next=p;}}}/******建立并更新活性边表AET***************************** ************************/for(i=0;i<=MaxY;i++){//计算新的交点x,更新AET***************************** ***************************/NET *p=pAET->next;while(p){p->x=p->x + p->dx;p=p->next;}//更新后新AET先排序********************************* ****************************///断表排序,不再开辟空间AET *tq=pAET;p=pAET->next;tq->next=NULL;while(p){while(tq->next && p->x >= tq->next->x)tq=tq->next;NET *s=p->next;p->next=tq->next;tq->next=p;p=s;tq=pAET;}//(改进算法)先从AET表中删除ymax==i的结点********************************* *******/AET *q=pAET;p=q->next;while(p){if(p->ymax==i){q->next=p->next;delete p;p=q->next;}else{q=q->next;p=q->next;}}//将NET中的新点加入AET,并用插入法按X值递增排序********************************* */p=pNET[i]->next;q=pAET;while(p){while(q->next && p->x >= q->next->x)q=q->next;NET *s=p->next;p->next=q->next;q->next=p;p=s;q=pAET;}/******配对填充颜色********************************* ******************************/p=pAET->next;while(p && p->next){for(floatj=p->x;j<=p->next->x;j++){SetPixel(tmpDC,static_cast<int>(j),i,RG B(255,200,0));//此处我改变了颜色,八边形的为黄色//SetPixel(tmpDC,static_cast<int>(j),i,RG B(255,0,0));//还有四边形的红色}p=p->next->next;//考虑端点情况}} }//画矩形Rectangle(tmpDC,20,20,80,80); //左上顶点,右下顶点//画椭圆Ellipse (tmpDC, 20,20,160,360) ;//画Bezier 曲线,利用已有的顶点数据PolyBezier(tmpDC,arr_vertex,4) ;实验截图:1.DDA算法的直线2.四边形和八边形3.正方形4.椭行5.Bezier 曲线实习总结:通过本次实验,我掌握了opengl绘图的一些基本知识,会在vc里面加入opengl的基本库。
计算机图形学实验报告
计算机图形学实验报告计算机图形学实验报告引言计算机图形学是研究计算机生成和处理图像的学科,它在现代科技和娱乐产业中扮演着重要的角色。
本实验报告旨在总结和分享我在计算机图形学实验中的经验和收获。
一、实验背景计算机图形学实验是计算机科学与技术专业的一门重要课程,通过实践操作和编程,学生可以深入了解图形学的基本原理和算法。
本次实验主要涉及三维图形的建模、渲染和动画。
二、实验内容1. 三维图形建模在实验中,我们学习了三维图形的表示和建模方法。
通过使用OpenGL或其他图形库,我们可以创建基本的几何体,如立方体、球体和圆柱体,并进行变换操作,如平移、旋转和缩放。
这些基本操作为后续的图形处理和渲染打下了基础。
2. 光照和着色光照和着色是图形学中重要的概念。
我们学习了不同的光照模型,如环境光、漫反射和镜面反射,并了解了如何在三维场景中模拟光照效果。
通过设置材质属性和光源参数,我们可以实现逼真的光照效果,使物体看起来更加真实。
3. 纹理映射纹理映射是一种将二维图像映射到三维物体表面的技术。
通过将纹理图像与物体的顶点坐标相对应,我们可以实现更加细致的渲染效果。
在实验中,我们学习了纹理坐标的计算和纹理映射的应用,使物体表面呈现出具有纹理和细节的效果。
4. 动画和交互动画和交互是计算机图形学的重要应用领域。
在实验中,我们学习了基本的动画原理和算法,如关键帧动画和插值技术。
通过设置动画参数和交互控制,我们可以实现物体的平滑移动和变形效果,提升用户体验。
三、实验过程在实验过程中,我们首先熟悉了图形库的使用和基本的编程技巧。
然后,我们按照实验指导书的要求,逐步完成了三维图形建模、光照和着色、纹理映射以及动画和交互等任务。
在实验过程中,我们遇到了许多挑战和问题,但通过不断的尝试和调试,最终成功实现了预期的效果。
四、实验结果通过实验,我们成功实现了三维图形的建模、渲染和动画效果。
我们可以通过键盘和鼠标控制物体的移动和变形,同时观察到真实的光照效果和纹理映射效果。
计算机图形学划线实验报告
计算机图形学划线实验报告《计算机图形学》实验报告实验⼀直线、圆(弧)⽣成算法⼀、实验⽬的及要求1. 了解光栅图形显⽰器的⼯作原理和特点;2. 学习C/VC环境下的基本绘图⽅法;3. 实践与巩固直线的基本⽣成算法。
4. 掌握直线扫描转换算法的原理及实现;5. 学习圆(弧)的基本⽣成算法;6. 实践圆(弧)的基本⽣成算法;7. 掌握圆弧扫描转换算法的原理及实现;⼆、理论基础1、有关直线⽣成算法有DDA(数值微分)、中点画线线算法、Bresenham⽣成算法数值微分法先算出直线的斜率,然后从起点开始,确定最佳逼近于直线的y坐标。
假设起点的坐标为整数。
让x递增1,y相应递增k。
中点划线算法中若直线在x⽅向增加⼀个单位,y的增量只能在0、1之间。
假设当前像素点已经确定,下⼀像素点就只可能有两种情况,将这两点的中点带⼊直线⽅程中,通过中点在直线的上、下⽅来判断下⼀点的坐标。
Bresenham算法是通过各⾏、各列像素中⼼构造⼀组虚拟⽹络格线,按直线从起点到中点的顺序计算直线与各垂直⽹格线的交点,然后确定该列像素中与此交点最近的像素。
2、有关画圆的算法圆的扫描转换(中点画圆法)、Bresenham画圆算法圆的扫描转换算法同中点画线类似,将圆分为8份,先讨论圆的第⼀象限上半部分,从(0,R)点顺时针确定最佳逼近于该圆弧的像素序列。
之后通过对称画出全部圆。
Bresenham画圆算法考虑圆在第⼀象限上的点,每确定⼀像素,则下⼀像素有三种可能,通过判断右下⽅的像素与圆的位置关系再分为三种情况,之后通过这三个点与圆的距离远近确定最佳逼近像素。
三、算法设计与分析1、数值微分法int x0=0,y0=0,x1=800,y1=400; //数值微分法,|k|<=1float dx,dy,k,x,y;dx=x1-x0;dy=y1-y0;k=dy/dx;y=y0;for(x=x0;x<=x1;x++){pDC->SetPixel(x,int(y+0.5),color);y=y+k;}该程序中每⼀步的x、y值是⽤前⼀步的值加上⼀个增量来获得的。
计算机图形学研究报告
计算机图形学研究报告计算机图形学是一门新兴的计算机科学,它以复杂而多变的运算和图形技术为基础,应用于电影制作、游戏开发、科学计算和虚拟环境等几乎所有领域。
如今,计算机图形学技术在计算机领域中发挥着越来越重要的作用,成为计算机科学研究的重要领域。
本文将简要介绍计算机图形学研究的现状,分析其最新研究成果,并提出未来可能的研究方向。
一、计算机图形学的研究进展计算机图形学是一门以图形处理为中心的计算机科学,它应用于各类现代计算机系统,包括虚拟现实系统、图形用户界面、图形编辑器等等,也是计算机视觉和人工智能研究中重要的一个组成部分。
在过去的几十年里,计算机图形学的研究取得了巨大的成就,主要表现在三方面:(1)图形系统的构建。
对图形技术的研究,取得了令人瞩目的成果,计算机技术得以不断拓展,形成了一种复杂而全面的图形系统,这使得计算机图形学的应用变得更加广泛。
(2)图形处理技术取得重大突破。
近些年来,研究开发出了一系列新的图形处理技术,其中包括三维重建、图像识别和实时渲染等,这些技术已经广泛应用于计算机图形学的应用开发中。
(3)虚拟现实技术的发展。
近年来,随着虚拟现实系统的发展,计算机图形学在虚拟现实领域也发挥了重要作用,如虚拟现实中的三维场景和动画制作等等。
二、计算机图形学的最新研究成果近年来,计算机图形学取得了许多有益的研究成果,其中包括:(1)图形建模技术的发展。
图形建模技术可以将真实世界中的物体和现象精确的仿真,进而进行分析和计算,从而获得精确的结果。
(2)图形处理器的研究。
图形处理器的研究已经取得了一定的成果,它们可以提高图形处理的速度和效率,有助于提升图形技术的性能。
(3)计算机视觉的发展。
计算机视觉技术的发展,使得计算机可以分析和处理图像信息,从而实现计算机自动化。
三、未来计算机图形学可能研究方向计算机图形学是一门年轻而发展迅速的研究领域,未来可能的研究方向有:(1)计算机虚拟环境技术的进一步发展。
计算机图形学实验报告
计算机图形学实验报告一、实验目的本次计算机图形学实验旨在深入了解和掌握计算机图形学的基本原理、算法和技术,通过实际操作和编程实现,提高对图形生成、处理和显示的能力,培养解决实际图形问题的思维和实践能力。
二、实验环境本次实验使用的编程语言为 Python,借助了相关的图形库如Pygame 或 matplotlib 等。
开发环境为 PyCharm 或 Jupyter Notebook。
三、实验内容(一)二维图形的绘制1、直线的绘制使用 DDA(Digital Differential Analyzer)算法或 Bresenham 算法实现直线的绘制。
通过给定直线的起点和终点坐标,在屏幕或图像上绘制出直线。
比较两种算法的效率和准确性,分析其优缺点。
2、圆的绘制采用中点画圆算法或 Bresenham 画圆算法绘制圆。
给定圆心坐标和半径,生成圆的图形。
研究不同半径大小对绘制效果和计算复杂度的影响。
(二)图形的填充1、多边形填充实现扫描线填充算法,对任意多边形进行填充。
处理多边形的顶点排序、交点计算和填充颜色的设置。
测试不同形状和复杂度的多边形填充效果。
2、图案填充设计自定义的填充图案,如纹理、条纹等,并将其应用于图形填充。
探索如何通过改变填充图案的参数来实现不同的视觉效果。
(三)图形的变换1、平移、旋转和缩放对已绘制的图形(如矩形、三角形等)进行平移、旋转和缩放操作。
通过矩阵运算实现这些变换。
观察变换前后图形的位置、形状和方向的变化。
2、组合变换将多个变换组合应用于图形,如先旋转再平移,或先缩放再旋转等。
分析组合变换的顺序对最终图形效果的影响。
(四)三维图形的表示与绘制1、三维坐标变换学习三维空间中的平移、旋转和缩放变换矩阵,并将其应用于三维点的坐标变换。
理解如何将三维坐标映射到二维屏幕上显示。
2、简单三维图形绘制尝试绘制简单的三维图形,如立方体、球体等,使用线框模型或表面模型。
探讨不同的绘制方法和视角对三维图形显示的影响。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字媒体技术专业计算机图形学课程设计报告院系:印包学院专业班级:媒体121学生学号: 3120342001学生姓名:孔祥倩指导教师:吴学毅2014年秋季学期目录一.课程设计的目的 (2)二.课程系统描述实现及步骤 (2)三.设计内容 (3)四.源程序代码 (4)五.总结 (19)六.参考文献 (20)七.附录 (20)一、课程设计的目的OpenGL即开放性图形库,它是一种高性能的开放式且功能强大的3D图形库,具有几百个指令和函数。
本文讨论了两种将常见三维模型转入OpenGL 中实现交互的方法,首先对文件进行分析,然后给出转化的思路。
从而将三维建模软件产生的三维模型移植到三维场景中,实现仿真.本课程主要内容包括计算机图形学的研究内容、发展与应用,图形输入输出设备,图形显示原理,图形软件标准,基本图形生成算法,图形几何变换与裁剪,自由曲线和曲面三维实体造型,分形几何造型,分形艺术,隐藏面消除,光照模型,颜色模型,光线跟踪,纹理细节模拟,常用的计算机动画技术和软件等。
在学期期末时按课程要求进行运动,提高学生对计算机图形学知识的了解与运用技巧同时通过此次课程设计提高动手实践能力与学习分析能力这就是本次的课OpenGL的英文全称是“Open Graphics Library”即“开放的图形程序接口”,因为其良好的可移植性和跨平台性,已逐渐成为高性能图形开发和交互式视景仿真的国际图形标准。
它是一种高性能的开放式且功能强大的3D图形库,具有几百个指令和函数。
使用这些指令和函数可以构造出高质量的静止物体模型和动态图像,并且可以实现对模型的实时交互操作过程。
但是OpenGL中并没有提供建模的高级命令,其实现过程也是通过基本的几何图元点、线和多边形来建立三维立体模型的,过程比较繁琐,编程量较大。
二.课程系统描述实现及步骤此次课程设计的课题为利用VC++6.0和插件OPENGL制作三维模型。
本设计主要通过建立MFC工程,在工程里建立一个三维模型,来建立一个动态的三维模型。
设计一个小院子,其中有房子,树木,桌凳,月亮的一系列景物。
运行程序,实现在这个小院子中的漫游。
主要步骤如下: 1:工程的建立2:三维模型的建立和映射 3:三维模型的运动一:工程的建立 1:系统配置。
先对机子安装VC++6.0.在建立工程前,本实验需要添加OPENGL插件,故需要在Windows环境下安装GLUT步骤如下:1、将下载的压缩包解开,将得到5个文件2、在“我的电脑”中搜索“gl.h”,并找到其所在文件夹(如果是VisualStudio2005,则应该是其安装目录下面的“VC\PlatformSDK\include\gl文件夹”)。
把解压得到的glut.h放到这个文件夹。
3、把解压得到的glut.lib和glut32.lib放到静态函数库所在文件夹(如果是VisualStudio2005,则应该是其安装目录下面的“VC\lib”文件夹)。
4、把解压得到的glut.dll和glut32.dll放到操作系统目录下面的system32文件夹内。
(典型的位置为:C:\Windows\System32)然后建立一个OpenGL工程测试这里以VisualStudio2005为例。
选择File->New->Project,然后选择Win32 Console Application,选择一个名字,然后按OK。
在谈出的对话框左边点Application Settings,找到Empty project 并勾上,选择Finish。
然后向该工程添加一个代码文件,取名为“OpenGL.c”,注意用.c来作为文件结尾。
2:建立工程。
新建一个MFC文件。
命名为plmy2.而其中的三维建模画图主要程序在程序三.设计内容设计思路1. 大多有显示列表如:树木,桌凳。
void stool(){stoollist=glGenLists(1);glNewList(stoollist,GL_COMPILE);glPushMatrix();glScalef(0.8,1,0.8);glutSolidSphere (4.0 ,10,10);glPopMatrix();glTranslatef(0,4,0);glScalef(1,0.1,1);glutSolidCube(5.0);glEndList();}其中,可以对做好的一个进行缩放,以达到以一个得到多个不同大小的物品。
而树和桌凳底座可以有简单椭圆代替。
这个可有对于圆的不规则缩放完成。
房子主题可以由正方体绘制,房顶由圆锥体绘制。
房子的门,窗户,可有正方体绘制出,将其摆在该放置的位置,利用缩放函数,将其缩放,使得门窗更加立体。
2.关于场景内纹理贴图由大量的浮点数组成,这些浮点数包含了模型面、材质、顶点、法线和纹理等的全部信息,并按照这些属性分类。
然后我们在OpenGL程序中专门定义一个读取模型参数的类,在此类中实现读取相应的浮点数的函数的所有功能,再在主程序中调用。
这段代码运行后,这些变量中就会存入对应表示相应属性的数据。
最后再编程遍历所有的顶点,法线,纹理,从而生成模型。
关于月亮的贴图,利用二次曲面贴图实现。
4.源程序代码#include <GL/glut.h>#include<math.h>#include<windows.h>#include<stdlib.h>#include <stdio.h>#include<Windows.h>#include<mmsystem.h>#pragma comment(lib."winmm.lib")//--------------------------------------------------------------------float flag=1.0;GLfloat theta=3.1415*0.2,fai=3.1415*0.7;GLfloat P0X=120.0*sin(theta)*sin(fai),P0Y=120*cos(fai),P0Z=120.0*cos(theta)*sin(fai);int windoww,windowh; //窗口的宽和高static GLuint texName; //纹理组的名称//依序为月亮、侧面、地面GLuint drawwalllist,moonlist,rooflist,treelist,stoollist,startList; //贴环境纹理的显示列表GLUquadricObj *qobj;//------------------------------------------------------------GLfloat ctrlpoints[4][4][3];GLfloat texpts[2][2][2] = {{{0.7, 0.7}, {0.7, 1}},{{1, 0.7}, {1, 1}}};//-------------------------------------------------------------void readimage(char* filename,BYTE* imagedata)//所读图片均为24位bmp,且宽度补齐至四字节边界{BITMAPFILEHEADER bf; //文件头BITMAPINFOHEADER bi; //信息头int m_ImageWidth; //图象宽度int m_ImageHeight; //图象高度FILE *fp1; //文件指针,fp1为源文件//打开文件,到文件指针if((fp1=fopen(filename,"rb"))==NULL){MessageBox(NULL,"文件打开错误","warning",MB_OK);}fread((LPSTR)&bf,sizeof(BITMAPFILEHEADER),1,fp1); //读取文件头,读取以后文件指针在文件头末尾(即信息头)fread((LPSTR)&bi,sizeof(BITMAPINFOHEADER),1,fp1); //读取信息头m_ImageWidth=bi.biWidth; //给图象宽度赋值m_ImageHeight=bi.biHeight; //给图象高度赋值fread(imagedata,m_ImageHeight*m_ImageWidth*3,1,fp1); //读取图象数据fclose(fp1);}//----------------由于读进来的图记录顺序为BGR---------------------------void adjustimage(BYTE* imagedata,int w,int h){BYTE temp;for(int i=0;i<w*h;i++){temp=imagedata[i*3];imagedata[i*3]=imagedata[i*3+2];imagedata[i*3+2]=temp;}}//------------------------设置纹理----------------------------------void loadtexture(){ //侧面的纹理glGenTextures(5, &texName);glBindTexture(GL_TEXTURE_2D, texName);{BYTE imagemoon[256][256][3]; //月亮的纹理readimage("moon.bmp",&imagemoon[0][0][0]);adjustimage(&imagemoon[0][0][0],256,256);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_RGB, 256,256, 0, GL_RGB, GL_UNSIGNED_BYTE, imagemoon);}{BYTE imagesky[256][64][3];readimage("starlow.bmp",&imagesky[0][0][0]);adjustimage(&imagesky[0][0][0],256,64);glBindTexture(GL_TEXTURE_2D, texName+1);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_RGB, 256,64, 0, GL_RGB, GL_UNSIGNED_BYTE, imagesky);}{BYTE imagefloor[256][256][3]; //地面的纹绠readimage("floor.bmp",&imagefloor[0][0][0]);adjustimage(&imagefloor[0][0][0],256,256);glBindTexture(GL_TEXTURE_2D, texName+2);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_RGB, 256,256, 0, GL_RGB, GL_UNSIGNED_BYTE, imagefloor);}{BYTE imagedoor[256][256][3]; //栅栏面的纹理readimage("door.bmp",&imagedoor[0][0][0]);adjustimage(&imagedoor[0][0][0],256,256);glBindTexture(GL_TEXTURE_2D, texName+3);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_RGB, 256,256, 0, GL_RGB, GL_UNSIGNED_BYTE, imagedoor);}{BYTE imageroof[128][128][3]; //屋顶的纹理readimage("roof.bmp",&imageroof[0][0][0]);adjustimage(&imageroof[0][0][0],128,128);glBindTexture(GL_TEXTURE_2D, texName+4);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_RGB, 128,128, 0, GL_RGB, GL_UNSIGNED_BYTE, imageroof);}}//---------------------光照---------------------------------void loadlight(){GLfloat light_ambient[]={0.8,0.8,0.8,1.0};GLfloat light_diffuse[]={0.6,0.6,0.6,1.0};GLfloat light_specular[]={0.6,0.6,0.6,1.0};GLfloat light_position[]={30.0,60.0,50.0,0.0};glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);glLightfv(GL_LIGHT0,GL_POSITION,light_position);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);}void material(GLfloat ambR,GLfloat ambG,GLfloat ambB,GLfloat difR,GLfloat difG,GLfloat difB,GLfloat speR,GLfloat speG,GLfloat speB){GLfloat mat_ambient[]={ambR,ambG,ambB,1.0};GLfloat mat_diffuse[]={difR,difG,difB,1.0};GLfloat mat_specular[]={speR,speG,speB,1.0};glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);}//--------------------贴环境纹理-------------------------------void drawWalls(){/*static GLint WallsVertices[] = {-10, -10, -10, 010,-10,-10, 110,10,-10,2-10,10,-10,3-10,-10,10,410,-10,10,510,10,10,6-10,10,10};7GLubyte frontIndices[] = {6,5,4,7};GLubyte rightIndices[] = {2,1,5,6};GLubyte bottomIndices[] = {0, 4, 5, 1};GLubyte backIndices[] = {3,0,1,2};GLubyte leftIndices[] = {7,4,0,3};GLubyte topIndices[] = {3,2,6,7};*/drawwalllist=glGenLists (1);glNewList (drawwalllist, GL_COMPILE);glDisable(GL_LIGHTING);glEnable(GL_TEXTURE_2D);glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);glBindTexture(GL_TEXTURE_2D, texName+3);glBegin(GL_QUADS);glTexCoord2f(0.0, 0.0); glVertex3f(-150, -100, -150);glTexCoord2f(1.0, 0.0); glVertex3f(150,-100,-150);glTexCoord2f(1.0, 1); glV ertex3f(150,100,-150);glTexCoord2f(0.0, 1); glV ertex3f(-150,100,-150);glTexCoord2f(0.35, 0.35); glVertex3f(-150,100,-150);glTexCoord2f(0.35, 1.0); glV ertex3f(150,100,-150);glTexCoord2f(1.0, 1.0); glVertex3f(150,100,150);glTexCoord2f(1.0, 0.35); glV ertex3f(-150,100,150);glEnd();glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glBindTexture(GL_TEXTURE_2D, texName+1);glBegin(GL_QUADS);glTexCoord2f(0.0, 1.0); glVertex3f(150,100,-150);glTexCoord2f(0.0, 0.0); glVertex3f(150,-100,-150);glTexCoord2f(1.0, 0.0); glVertex3f(150,-100,150);glTexCoord2f(1.0, 1.0); glVertex3f(150,100,150);glTexCoord2f(0.0, 1.0); glVertex3f(150,100,150);glTexCoord2f(0.0, 0.0); glVertex3f(150,-100,150);glTexCoord2f(1.0, 0.0); glVertex3f(-150,-100,150);glTexCoord2f(1.0, 1.0); glVertex3f(-150,100,150);glTexCoord2f(1.0, 1.0); glVertex3f(-150,100,-150);glTexCoord2f(0.0, 1.0); glVertex3f(-150,100,150);glTexCoord2f(0.0, 0.0); glVertex3f(-150,-100,150);glTexCoord2f(1.0, 0.0); glVertex3f(-150,-100,-150);glEnd();glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glBindTexture(GL_TEXTURE_2D, texName+2);glBegin(GL_QUADS);glTexCoord2f(0.0, 0.0); glVertex3f(150, -100, -150);glTexCoord2f(1.0, 0.0); glVertex3f(-150,-100,-150);glTexCoord2f(1.0, 1.0); glVertex3f(-150,-100,150);glTexCoord2f(0.0, 1.0); glVertex3f(150,-100,150);glEnd();glDisable(GL_TEXTURE_2D);glEnable(GL_LIGHTING);glEndList();}//--------------------------------------------------------void Moon(){moonlist=glGenLists(1);glNewList(moonlist,GL_COMPILE);glDisable(GL_LIGHTING);glEnable(GL_TEXTURE_GEN_S);glEnable(GL_TEXTURE_GEN_T);glEnable(GL_TEXTURE_2D);glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);glEnable(GL_TEXTURE_2D);glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);glBindTexture(GL_TEXTURE_2D, texName);gluSphere(qobj, 25, 20, 20);glDisable(GL_TEXTURE_GEN_S);glDisable(GL_TEXTURE_GEN_T);glDisable(GL_TEXTURE_2D);glEnable(GL_LIGHTING);glEndList();}//---------------------------------------------------------void roof(){rooflist=glGenLists(1);glNewList(rooflist,GL_COMPILE);glEnable(GL_TEXTURE_GEN_S);glEnable(GL_TEXTURE_GEN_T);glEnable(GL_TEXTURE_2D);glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);glEnable(GL_TEXTURE_2D);glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);glBindTexture(GL_TEXTURE_2D, texName+4);glutSolidCone(50,50,10,10);glTranslatef(-50,0,30);glutSolidCone(50,50,10,10);glDisable(GL_TEXTURE_GEN_S);glDisable(GL_TEXTURE_GEN_T);glDisable(GL_TEXTURE_2D);glEndList();}//-------------------treelist----------------------void tree(){treelist=glGenLists(1);glNewList(treelist,GL_COMPILE);glPopMatrix();glPushMatrix();material(0.2,0.1,0.1,0.2,0.1,0.1,0.0,0.0,0.0);glTranslatef(0,10,0);glRotatef(-90,1,0,0);gluCylinder(qobj,6,2,40,20,10);glPopMatrix();glPushMatrix();glTranslatef(0,75,0);material(0.1,0.3,0.1,0.1,0.3,0.1,0.0,0.0,0.0);glScalef(0.7,1,0.7);gluSphere(qobj,30,20,20);//---------slope--------------------glPopMatrix();glPushMatrix();glScalef(0.6,1,0.6);glRotatef(-90,1,0,0);glEnable(GL_TEXTURE_2D);glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);glBindTexture(GL_TEXTURE_2D, texName+2);glEvalMesh2(GL_FILL, 0, 20, 0, 20);glDisable(GL_TEXTURE_2D);glEndList();}//------------stool-----------------------------------------void stool(){stoollist=glGenLists(1);glNewList(stoollist,GL_COMPILE);glPushMatrix();glScalef(0.8,1,0.8);glutSolidSphere (4.0 ,10,10);glPopMatrix();glTranslatef(0,4,0);glScalef(1,0.1,1);glutSolidCube(5.0);glEndList();}//---------------------创建显示列表------------------------void loadlist(){drawWalls(); //贴环境纹理Moon();roof();tree();stool();}//-----------------pond--------------------------------------void pondcaculate(){{int u, v;for (u = 0; u < 4; u++){for (v = 0; v < 4; v++){ctrlpoints[u][v][0]= 40.0*((GLfloat)u - 1.5);ctrlpoints[u][v][1]=40.0*((GLfloat)v - 1.5);if ( (u == 1 || u == 2) && (v == 1 || v == 2)){ctrlpoints[u][v][2]=30;}else{ctrlpoints[u][v][2] =0;}}}}glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4,0, 1, 12, 4, &ctrlpoints[0][0][0]);glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2,0, 1, 4, 2, &texpts[0][0][0]);glEnable(GL_MAP2_TEXTURE_COORD_2);glEnable(GL_MAP2_VERTEX_3);glMapGrid2f(20, 0.0, 1.0, 20, 0.0, 1.0);}//---------------------初始化-----------------------------------void init (void){glClearColor (0.1, 0.4, 0.8, 0.0);glViewport (0, 0, 500, 500);glMatrixMode (GL_MODELVIEW);glLoadIdentity();glPushMatrix();glEnable(GL_AUTO_NORMAL);glEnable(GL_NORMALIZE);glDepthFunc(GL_LESS); //深度测试glEnable(GL_DEPTH_TEST);qobj = gluNewQuadric();loadlight();pondcaculate();glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glPixelStorei(GL_UNPACK_ALIGNMENT, 1);loadtexture();loadlist();}//------------------------------------------------------------------void display (void){glClear (GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // Clear display window.glMatrixMode (GL_MODELVIEW);glLoadIdentity();gluLookAt ( 0.0, 0.0, 0.0, P0X, P0Y, P0Z, 0.0, 1.0, 0.0);glPushMatrix();glMatrixMode (GL_PROJECTION);glLoadIdentity();if (windoww <= windowh)glOrtho (-100, 100, -100*(GLfloat)windowh/(GLfloat)windoww, 100*(GLfloat)windowh/(GLfloat)windoww, 0.001, 290.0);elseglOrtho (-100*(GLfloat)windoww/(GLfloat)windowh,100*(GLfloat)windoww/(GLfloat)windowh, -100, 100, 0.001, 290.0);glMatrixMode (GL_MODELVIEW);glPopMatrix();glPushMatrix();//----------环境-------------------glCallList(drawwalllist);//----------月亮---------------------glTranslatef(100,70,50);glCallList(moonlist);//----------小屋--------------------glPopMatrix();glPushMatrix();glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);material(0.2,0.3,0.4,0.2,0.3,0.4,0.0,0.0,0.0);glTranslatef(0,-70,100);glutSolidCube(60.0);glTranslatef(-50,0,0);glScalef(1,2.2,1);glutSolidCube(60.0);glPopMatrix();glPushMatrix();glTranslatef(0,-40,100);glRotatef(-90,1,0,0);glCallList(rooflist);glPushMatrix();material(0.1,0.2,0.3,0.2,0.3,0.4,0.0,0.0,0.0); glTranslatef(0,-80,70);glScalef(0.5,1,0.1);glutSolidCube(40.0);glPopMatrix();glPushMatrix();material(0.1,0.2,0.3,0.2,0.3,0.4,0.0,0.0,0.0); glTranslatef(18,-70,100); glutSolidCube(30.0);glTranslatef(-70,24,-15);glutSolidCube(35.0);//-------tree-----------glPopMatrix();glPushMatrix();glTranslatef(110,-110,110); glPushMatrix();glCallList(treelist);glPopMatrix();glPopMatrix();glPushMatrix();glTranslatef(80,-105,70);glPushMatrix();glCallList(treelist);glPopMatrix();glPopMatrix();glPushMatrix();glTranslatef(-110,-105,-110); glPushMatrix();glCallList(treelist);glPopMatrix();glPopMatrix();glPushMatrix();glTranslatef(110,-115,-110);glCallList(treelist);glPopMatrix();//---------table&stool--------------- glPopMatrix();glPushMatrix();material(0.1,0.1,0.1,0.1,0.1,0.1,0.0,0.0,0.0);glTranslatef(-80,-100,-60);glRotatef(-90,1,0,0);gluCylinder(qobj,3,1.4,15,20,10); glPopMatrix();glPushMatrix();glTranslatef(-80,-85,-60);glScalef(1,0.1,1);glutSolidCube(25);glPopMatrix();glPushMatrix();glTranslatef(-75,-95,-80);glCallList(stoollist);glPopMatrix();glPushMatrix();glTranslatef(-75,-95,-40);glCallList(stoollist);glPopMatrix();glPushMatrix();glTranslatef(-55,-95,-60);glCallList(stoollist);glPopMatrix();glPushMatrix();glTranslatef(-105,-95,-60);glCallList(stoollist);glPopMatrix();//维持平衡glutSwapBuffers ( );}void reshape(int w, int h){glViewport (0, 0, (GLsizei) w, (GLsizei) h);windoww=w;windowh=h;}static void special(int k, int x, int y){switch (k){case GLUT_KEY_UP:fai-=0.02;if(fai<=0) fai+=0.05;P0Y=120*cos(fai);P0X=120.0*sin(theta)*sin(fai);P0Z=120.0*cos(theta)*sin(fai);break;case GLUT_KEY_DOWN:fai+=0.02;if(fai>=3.1415) fai-=0.05;P0Y=120*cos(fai);P0X=120.0*sin(theta)*sin(fai);P0Z=120.0*cos(theta)*sin(fai);break;case GLUT_KEY_LEFT:theta+=0.05;P0X=120.0*sin(theta)*sin(fai);P0Z=120.0*cos(theta)*sin(fai);break;case GLUT_KEY_RIGHT:theta-=0.05;P0X=120.0*sin(theta)*sin(fai);P0Z=120.0*cos(theta)*sin(fai);break;default:return;}// glutReshapeFunc(reshape);glutPostRedisplay();}void main (int argc, char** argv){glutInit (&argc, argv);glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);glutInitWindowPosition (30, 30);glutInitWindowSize (800, 600);glutCreateWindow ("月色");PlaySound("yinyue.wav",NULL,SND_FILENAME | SND_ASYNC);init ( );glutDisplayFunc (display);glutSpecialFunc(special);glutReshapeFunc(reshape);glutMainLoop ( );}5.总结由于属于初学VC且时间有限,所以对于前台的制作难免也诸多的不足,很多东西都要马上学习查资料并进行初步调试即拿出来使用。