计算机图形学报告

合集下载

计算机图形学--全部实验的实验报告

计算机图形学--全部实验的实验报告

一、实验目的根据曲线和曲面的基础知识和常用曲线的数学基础,对其算法进行程序设计,验证算法的正确性,并通过程序结果加深对常用曲线数学模型的理解。

二、实验任务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

计算机图形学实验报告学号:********姓名:班级:计算机 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-透视投影算法

计算机图形学-实验报告3-透视投影算法
七.实验结果及分析:
实验地点
软件实验室
指导教师
李丽亚
在屏幕客户区中心绘制立方体的透视投影线框模型使用工具栏的动画图标按钮或键盘上的方向键旋转视点观察立方体生成立方体的旋转动画
实验报告
课ห้องสมุดไป่ตู้名称
班级
班级学号
姓名
实验日期
成绩
实验题目
透视投影算法
一、实验目的:
观察变换矩阵
透视投影变换矩阵
一点透视
二点透视
三点透视
二、实验内容:
在屏幕客户区中心绘制立方体的透视投影线框模型,使用工具栏的“动画”图标按钮或键盘上的方向键旋转视点观察立方体,生成立方体的旋转动画。选择工具栏的123图标按钮分别绘制立方体线框模型的一点透视图,二点透视图,三点透视图。
三、实验步骤:
(1)读入立方体8个顶点构成的顶点表与6个表面构成的表面表。
(2)使用透视投影矩阵在屏幕坐标系绘制立方体的透视投影。
(3)旋转视点观察立方体的透视投影。
(4)使用鼠标左键增加视径,缩小立方体的透视投影。
(5)使用鼠标左键减小视径,放大立方体的透视投影。
(6)使用双缓冲技术绘制立方体旋转动画。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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且时间有限,所以对于前台的制作难免也诸多的不足,很多东西都要马上学习查资料并进行初步调试即拿出来使用。

相关文档
最新文档