计算机图形学第五次实验报告
- 格式:doc
- 大小:246.00 KB
- 文档页数:9
计算机图形学实验报告姓名:学号:班级:目录实验一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图形软件包绘制图形的基本过程及其程序框架,并在已有的程序框架中添加代码实现直线和圆的生成算法,演示直线和圆的生成过程,从而加深对直线和圆等基本图形生成算法的理解。
b5E2RGbCAP二、实验内容实验操作和步骤:本次实验主要的目的是为了掌握基本画线和画圆算法,对于书上给出的代码,要求通过本次实验来具体的实现。
由于实验已经给出大体的框架,所以只需要按照书上的算法思想来设计具体实现代码,对于直线DDA算法,中点Bresenham算法及其改进算法,以及Bresenham画圆算法都有进一步的体会。
DDA算法是对每一步都要进行增量处理,然后取整,绘制,而Bresenham通过判断误差函数和求取递推公式来实现。
特别是对于整数的选择取舍,以及代码的流程和循环的控制有一个深入的了解。
同时也熟练运用OpenGL基本的绘图函数。
p1EanqFDPw三、体会通过本次实验,我进一步加深了对于基本画图算法的理解。
特别是对于DDA,Bresenham和画圆算法。
其中,DDA算法由于每一步都要处理浮点数的四舍五入,所以在绘图时要进行取整,效率较低,但是代码直观好懂,符合原理。
而对于Bresenham及其改进算法,都是在理论推导的基础上来实现的,然后经过整数化,形成了一个高效率的画图算法,所以需要适当的理解,特别是对于取整操作判断比较巧妙,实现了避免多次判断计算浮点数的目的,所以比较高效。
而绘制圆形的时候,用到的基本思想还是和Bresenham画图算法一样,只不过需要注意的是八分法画圆,这样只需要绘制其中的八分之一就可以利用对称的关系来绘制出整个图形。
而对于是否走下一步,或者是停留,判断的依据还是误差函数,和前面的思想是类似。
另外,通过实验训练了自己的编程能力,同时熟悉了OpenGL绘图的函数和流程,也进一步巩固了相关的知识。
计算机图形学实验报告实验一 3D模型的加载、渲染与三维操作学院:专业班级:指导老师:学号:姓名:完成日期:目录一、实验目的 (3)二、使用的工具软件及环境 (3)三、实验内容 (3)四、实验步骤 (3)五、思考 (12)一、实验目的1、掌握在Microsoft Visual Studio环境中使用OpenGL、GLUT 和GLUI;2、了解计算机图形学固定流水线;3、了解OpenGL编程基础;4、掌握三维观察的数学表达和程序实现;5、掌握多边形网格的绘制;二、使用的工具软件及环境Microsoft Visual Studio 2010、OpenGL、Glut、Glui三、实验内容1、在VS 2010中配置OpenGL环境;2、编译简单的GLUT程序;3、编译GLUI源代码,并在调试模式下执行6个示例程序;4、在给定的工程中添加绘制简单几何体的代码;5、在给定的工程中添加读取、绘制三维模型的代码;6、在给定的工程中添加旋转、平移和缩放的控制代码;四、实验步骤1、安装Microsoft Visual Studio软件版本选择:Microsoft Visual Studio 2010以上版本2、VS2010中配置GLUT1)下载GLUT。
Windows环境下的GLUT下载地址:/resources/libraries/glut/glutdlls37be ta.zip2)将下载的压缩包解开,将得到5个文件:glut.h、glut.lib、glut32.lib、glut.dll、glut32.dll。
3)将glut.h放到"%WinDir%\ProgramFiles(x86)\Microsoft SDKs\Windows\v7.0A\Include\gl\"文件夹中。
4)将glut.lib和glut32.lib放到"%WinDir%\ProgramFiles(x86)\Microsoft Visual Studio 10.0\VC\lib\"文件夹中。
武汉工业学院数学与计算机学院《计算机图形学》实验报告专业:班级:学号:姓名:指导老师:2012年5月25日第二章直线生成算法2.1 实验原理2.1.1 中点Bresenham算法2.2 实验内容请使用中点Bresenham算法来生成直线。
实验环境:Turboc 或Visual C++2.3 程序代码void CTest1View::BresenhamLine(CDC* pDC,int x0,int y0,int x1,int y1) {int color=RGB(250,0,0);//k为直线的斜率float k=(y1-y0)/(x1-x0);//d为中点偏差判别式float d=0.5-k;int x;int y=y0;for (x=x0; x<=x1; x++){pDC->SetPixel(x, y, color);if(d<0){y=y+1;d=d+1-k;}else{d=d-k;}}}2.4运行结果\2.5心得体会通过本次实验我学会了很多东西,例如:熟悉了在VC++环境下开发图形程序的流程,学会了在类的view里面创建新的绘图函数,然后在ondraw函数中调用自己创建的绘图函数来实现绘图算法,本次实验首先运行了DDA算法,再通过Bresenham算法的原理,编写了Bresenham算法的绘图函数,熟悉了直线的两种绘,这次试验是今后图形学试验的基础,所以掌握好了这次知识点,无疑是为今后的试验作铺垫。
第三章圆弧生成算法3.1 实验原理中点算法Bresenham算法3.2 实验内容用上述每一种算法来实现圆弧的生成。
每一种算法的实现用一个函数来表示。
实验环境:Turboc 或Visual C++。
3.3程序代码void CTest2View::myCircle(CDC* pDC,float n,float m,float r) {int color=RGB(250,0,0);int a,b;int f,x,y;a=0;b=0;f=0;x=a;y=b+r;while(y>b){pDC->SetPixel(x+n,-y+m,color);pDC->SetPixel(-x+n,-y+m,color);pDC->SetPixel(-x+n,y+m,color);pDC->SetPixel(x+n,y+m,color);if (f>0){f=f-2*(y-b)+1;y=y-1;}else{f=f+2*(x-a)+1;x++;}}if (y==b){pDC->SetPixel(x+n,y+m,color);pDC->SetPixel(-x+n,y+m,color);pDC->SetPixel(x+n,-y+m,color);pDC->SetPixel(-x+n,-y+m,color);}}3.1.2 Bresenham算法void CTest2View::BersenhamCircle(CDC* pDC,float n,float m,float r) {int color=RGB(250,0,0);float a,b;float f,x,y;a=0;b=0;f=1.25-r;x=a;y=b+r;while(y>x){pDC->SetPixel(x+n,-y+m,color);pDC->SetPixel(-x+n,-y+m,color);pDC->SetPixel(-x+n,y+m,color);pDC->SetPixel(x+n,y+m,color);pDC->SetPixel(y+n,-x+m,color);pDC->SetPixel(-y+n,-x+m,color);pDC->SetPixel(-y+n,x+m,color);pDC->SetPixel(y+n,x+m,color);if (f>0){f=f+2*(x-y)+5;y=y-1;x++;}else{f=f+2*x+3;x++;}}}3.3运行结果3.4 心得体会本次实验是参考老师提供的参考程序和课本中绘制1/8圆的中点Bresenham 算法原理完成的,通过对绘制1/8圆的算法原理进行修改,同时绘制8个1/8圆,能够化整为零,描绘出一个完整的圆形。
计算机图形学实验报告姓名:___ __________学号:_____ ________班级:______ _______时间:_____2016年12月_________实验一OpenGL编程与图形绘制1.实验目的了解OpenGL编程,并熟悉OpenGL的主要功能、绘制流程和基本语法。
学会配置OpenGL环境,并在该环境中编程绘图。
2.实验内容OpenGL的主要功能:模型绘制、模型观察、颜色模式、光照应用、图像效果增强、位图和图像处理、纹理映射、实时动画和交互技术。
OpenGL的绘制流程分为两个方面:一个完整的窗口系统的OpenGL图形处理系统的结构为:最底层为图形硬件,第二层为操作系统,第三层为窗口系统,第四层为OpenGL,最上面的层为应用软件;OpenGL命令将被放在一个命令缓冲区中,这样命令缓冲区中包含了大量的命令、顶点数据和纹理数据。
当缓冲区被清空时,缓冲区中的命令和数据都将传递给流水线的下一个阶段。
OpenGL的基本语法中相关库有:OpenGL核心库:gl、OpenGL实用程序库:glu、OpenG 编程辅助库:aux、OpenGL实用程序工具包(OpenGL utility toolkit,GLUT):glut、Windows 专用库:wgl。
OpenGL的基本语法中命名规则为:OpenGL函数都遵循一个命名约定,即采用以下格式:<库前缀><根命令><可选的参数个数><可选的参数类型>。
了解了上述基础知识后,配置好OpenGL环境,然后在该环境中编程练习图形的绘制,本次实验主要是对点的绘制、直线的绘制和多边形面的绘制。
3.实验代码及结果3.1点的绘制:#include<gl/glut.h>void Initial(void){glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); //指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数}void Display(void){glClear(GL_COLOR_BUFFER_BIT); //用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红// glRectf(50.0f,100.0f,150.0f,50.0f); //绘制一个矩形glPointSize(10); //三个点glBegin(GL_POINTS);glColor3f(1.0f,0.0f,0.0f);glVertex2i(2,148);glVertex2i(100,75);glVertex2i(198,2);glEnd();glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序}int main(int argc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口位置glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示回调函数Initial(); //完成窗口初始化glutMainLoop(); //完成窗口GLUT事件处理循环return 0;}运行结果:3.2直线的绘制:#include<gl/glut.h>void Initial(void){glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); //指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数}void Display(void){glClear(GL_COLOR_BUFFER_BIT); //用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红色// glRectf(50.0f,100.0f,150.0f,50.0f); //绘制一个矩形glBegin(GL_LINE_LOOP); //五角星glVertex2i(10,10);glVertex2i(30,35);glVertex2i(50,10);glVertex2i(5,25);glVertex2i(55,25);glEnd();glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序}int main(int argc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口位置glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示回调函数Initial(); //完成窗口初始化glutMainLoop(); //完成窗口GLUT事件处理循环return 0;}运行结果:3.3多边形面的绘制:#include<gl/glut.h>void Initial(void){glClearColor(1.0f,1.0f,1.0f,1.0f); //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION); //指定设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0); //设置投影参数}void Display(void){glClear(GL_COLOR_BUFFER_BIT); //用当前背景颜色填充窗口glColor3f(1.0f,0.0f,0.0f); //设置当前的绘图颜色为红色// glRectf(50.0f,100.0f,150.0f,50.0f); //绘制一个矩形glBegin(GL_TRIANGLES); //等边三角形glVertex2f(0.0,0.0);glVertex2f(15,25.95);glVertex2f(30,0);glEnd();glFlush(); //清空OpenGL命令缓冲区,执行OpenGL程序}int main(int argc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300); //设置窗口的尺寸glutInitWindowPosition(100,120); //设置窗口位置glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display); //设置当前窗口的显示回调函数Initial(); //完成窗口初始化glutMainLoop(); //完成窗口GLUT事件处理循环return 0;}运行结果:实验二直线绘制实验1.实验目的为了进一步熟悉OpenGL编程,了解基本图形生成算法中的直线绘制,学会直线绘制算法中最常用的三种算法:数值微分法、中点画线算法和Bresenham算法。
《计算机图形学》实验报告学号:0908610211姓名:宋雪英班级:计算机0961项目:1.利用其它两种画直线方法实现放大10陪显示方法,交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。
2.利用方形、线性两种画刷来绘制圆和椭圆。
3.实现交互式二维图形的放缩,旋转和对称变换2012年12月25日基本图形的生成技术一、实验目的在一个图形系统中,基本图形(也称为图元、图素等)的生成技术是最基本的,任何复杂的图形都是由基本图形组成的,基本图形生成的质量直接影响该图形系统绘图的质量。
所以,需要设计出精确的基本图形生成算法,以确保图形系统绘图的精确性。
本次实验的目的就是利用Bresenham 算法和中心画线法两种画直线方法实现放大10陪显示方法,交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。
利用方形、线性两种画刷来绘制圆和椭圆。
实现交互式二维图形的放缩,旋转和对称变换。
二、实验任务1.利用其它两种画直线方法实现放大10陪显示方法,交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。
2.利用方形、线性两种画刷来绘制圆和椭圆。
3.实现交互式二维图形的放缩,旋转和对称变换。
三、画直线的实验内容任务一:利用其它两种画直线方法实现放大10陪显示方法交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。
1、设计思路第一步:建立DDAMouseLine工程文件;第二步:向视图类中添加自定义的成员变量用鼠标右键单击视图类,选择“Add Member Variable…”,添加下面三个成员变量。
proctected :CPoint m_p1; //起点CPoint m_p2; //起点CPoint m_p; //点击鼠标时点的取值第三步:向视图类中添加自定义的成员函数原型:public:V oid DDAMouseLine(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color);Line()函数以当前位置所在的点为直线的起点,另指定一个点为直线的终点,画出一段直线。
计算机图形学实验报告
实验目的:通过本次实验,深入了解并掌握计算机图形学的基本原理和相关技术,培养对图形处理的理解和能力。
实验内容:
1. 图像的基本属性
- 图像的本质及表示方法
- 像素和分辨率的概念
- 灰度图像和彩色图像的区别
2. 图像的处理技术
- 图像的采集和处理
- 图像的变换和增强
- 图像的压缩和存储
3. 计算机图形学的应用
- 图像处理在生活中的应用
- 计算机辅助设计中的图形学应用
- 三维建模和渲染技术
实验步骤和结果:
1. 在计算机图形学实验平台上加载一张测试图像,分析其像素构成
和基本属性。
2. 运用图像处理技术,对测试图像进行模糊、锐化、色彩调整等操作,观察处理后的效果并记录。
3. 学习并掌握计算机图形学中常用的处理算法,如卷积、滤波等,
尝试应用到测试图像上并进行实验验证。
4. 探讨计算机图形学在数字媒体制作、虚拟现实、计算机辅助设计
等领域的应用案例,并总结其在实践中的重要性和价值。
结论:
通过本次实验,我对计算机图形学有了更深入的了解,掌握了图像
处理技术的基本原理和应用方法。
计算机图形学作为一门重要的学科,对多个领域有着广泛的应用前景,有助于提高数字媒体技术、虚拟现
实技术等领域的发展水平。
希望在未来的学习和工作中能进一步深化
对计算机图形学理论和实践的研究,不断提升自己在这一领域的专业
能力和创新意识。
图形学实验报告图形学实验报告概述:在本次图形学实验中,我们将探索和学习计算机图形学的基本概念和技术。
通过实验,我们深入了解了图形学的原理和应用,以及如何使用计算机生成和处理图像。
实验一:像素和颜色在这个实验中,我们学习了图像是由像素组成的,每个像素都有自己的颜色值。
我们使用了Python编程语言和PIL库来创建一个简单的图像,并设置了不同的像素颜色。
通过改变像素的颜色值,我们可以创建出各种各样的图像效果。
实验二:坐标系统和变换在这个实验中,我们学习了坐标系统和图形变换。
我们使用OpenGL库来创建一个简单的二维图形,并通过平移、旋转和缩放等变换操作来改变图形的位置和形状。
这些变换操作使我们能够在屏幕上创建出各种不同的图案和效果。
实验三:线段和多边形在这个实验中,我们学习了如何使用线段和多边形来绘制图形。
我们使用了Bresenham算法来绘制直线,并学习了如何使用多边形填充算法来填充图形。
通过这些技术,我们可以创建出更加复杂和精细的图像。
实验四:光照和阴影在这个实验中,我们学习了光照和阴影的原理和应用。
我们使用了光照模型来模拟光线的传播和反射,以及计算物体的明暗效果。
通过调整光照参数和材质属性,我们可以创建出逼真的光照和阴影效果。
实验五:纹理映射和渲染在这个实验中,我们学习了纹理映射和渲染的概念和技术。
我们使用了纹理映射来将图像贴到三维物体表面,以增加物体的细节和真实感。
通过渲染技术,我们可以模拟光线的折射和反射,以及创建出逼真的材质效果。
实验六:三维建模和动画在这个实验中,我们学习了三维建模和动画的基本原理和方法。
我们使用了三维建模工具来创建三维模型,并学习了如何使用关键帧动画来实现物体的运动和变形。
通过这些技术,我们可以创建出逼真的三维场景和动画效果。
总结:通过这次图形学实验,我们深入了解了计算机图形学的原理和应用。
我们学习了像素和颜色、坐标系统和变换、线段和多边形、光照和阴影、纹理映射和渲染,以及三维建模和动画等技术。
计算机图形学实习报告计算机图形学课程设计实验报告姓名:学号:专业:地理信息系统⼀、课程设计⽬的在掌握图形学的基本原理、算法和实现技术基础上,通过编程实践学会基本的图形软件开发技术。
⼆、课程设计内容仿照Windows的附件程序“画图”, ⽤C++语⾔编制⼀个具有交互式绘制和编辑多种图元功能的程序“Mini-Painter”,实现以下功能对应的设计内容:(1) 能够以交互⽅式在图形绘制区绘制点、直线(折线)、圆(椭圆)、圆弧、多边形、Beizer曲线、封闭区域填充、⽂字等基本图元;(2) 设置线条的颜⾊、线型和线条宽度,对绘制的图元进⾏线条和填充属性的修改;(3) ⽀持图元的点选和基于橡⽪筋技术的圈选;(4) 对选中的图元进⾏平移、缩放、旋转和对称等变换;三、实验步骤1.新建MFC应⽤程序1.1新建⼯程。
运⾏VC++6.0,新建⼀个MFC AppWizard[exe]⼯程,并命名为“0710070118”,选择保存路径,确定。
1.2选择应⽤程序的类型,选择“单⽂档”,则可以通过菜单打开对话框2.建⽴单⽂档应⽤程序,在其中调⽤对话框2.1 查看⼯程资源在单击完成之后,即建⽴了⼀个⼯程,在⼯程的左侧资源视图可以看到MFC向导为该程序提供的⼀些资源。
分别如下所⽰:2.2插⼊对话框资源想在⽂档应⽤程序中,通过单击菜单来打开⼀个对话框,⾸先要建⽴该对话框的资源。
右击“resources ”中的“dialog ”项,在弹出的菜单中选择“插⼊”,打开插⼊菜单对话框,如图所⽰:对话框资源插⼊后,可修改⼀些属性,⽐如标题、字体等等。
在对话框空⽩处右击,选择属性就可打开资源的属性对话框,按照要求设置对话框的属性。
2.3布置对话框界⾯对话框资源插⼊后,即可在该对话框上布置各种需要的控件,并可通过编排菜单的各种命令或“对话”⼯具条调整各控件的⼤⼩,位置,对齐⽅式等,还可以单击对话⼯具条上第⼀个按钮“测试”按钮,看到对话框运⾏时的界⾯。
实验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,进行一个消息循环。
《计算机图形学》实验报告 实验十一 真实感图形 一、实验教学目标与基本要求 初步实现真实感图形,并实践图形的造型与变换等。 二、理论基础 运用几何造型,几何、投影及透视变换、真实感图形效果(消隐、纹理、光照等)有关知识实现。 1. 用给定地形高程数据绘制出地形图; 2. 绘制一(套)房间,参数自定。
三.算法设计与分析 真实感图形绘制过程中,由于投影变换失去了深度信息,往往导致图形的二义性。要消除这类二义性,就必须在绘制时消除被遮挡的不可见的线或面,习惯上称之为消除隐藏线和隐藏面,或简称为消隐,经过消隐得到的投影图称为物体的真实图形。 消隐处理是计算机绘图中一个引人注目的问题,目前已提出多种算法,基本上可以分为两大类: 即物体空间方法和图象空间方法。物体空间方法是通过比较物体和物体的相对关系来决定可见与不可见的; 而图象空间方法则是根据在图象象素点上各投影点之间的关系来确定可见与否的。用这两类方法就可以消除凸型模型、凹形模型和多个模型同时存在时的隐藏面。
1).消隐算法的实现 1.物体空间的消隐算法 物体空间法是在三维坐标系中,通过分析物体模型间的几何关系,如物体的几何位置、与观察点的相对位置等,来进行隐藏面判断的消隐算法。世界坐标系是描述物体的原始坐标系,物体的世界坐标描述了物体的基本形状。为了更好地观察和描述物体,经常需要对其世界坐标进行平移和旋转,而得到物体的观察坐标。物体的观察坐标能得到描述物体的更好视角,所以物体空间法通常都是在观察坐标系中进行的。观察坐标系的原点一般即是观察点。物体空间法消隐包括两个基本步骤,即三维坐标变换和选取适当的隐藏面判断算法。 选择合适的观察坐标系不但可以更好地描述物体,而且可以大大简化和降低消隐算法的运算。因此,利用物体空间法进行消隐的第一步往往是将物体所处的坐标系转换为适当的观察坐标系。这需要对物体进行三维旋转和平移变换。 常用的物体空间消隐算法包括平面公式法、径向预排序法、径向排序法、隔离平面法、深度排序
法、光线投射法和区域子分法。其中前三种算法最常用,它们的基础都是背面消隐原理。所谓背面消隐原理,即是相对观察点来说朝向后面的物体表面是不可见的,应被隐藏。下面只对平面公式法作详细介绍,其他方法可参看有关文献。 根据解析几何原理,通过标准的平面方程可以判断给定点是在平面的正面还是背面。平面公式法利用此原理来判断观察点位于物体表面的哪一面,如位于背面一侧,则表面不可见,应被消隐; 反之则可见。对物体的任意表面,可将其划分为若干个平面,在根据平面上任意三点的坐标可以求得其平面方程。标准的平面方程为: Ax+By+Cz+D=0; 其中A、B、C、D 为决定平面的常数。当把一个平面想象成一个凸型多面体时,设观察点坐标为(x,y,z),如果: ① Ax+By+Cz+D=0,则观察点(x,y,z)是该平面表面上的一个点; ② Ax+By+Cz+D>0,则观察点(x,y,z)在凸型多面体内部(称该表面是不可见的或隐藏的); ③ Ax+By+Cz+D<0,则观察点(x,y,z)在凸型多面体外表面(称该表面是可见的),应被画出。 通过对物体进行适当旋转和平移后,可将物体变换到以观察点为原点的观察坐标系中,如果在观察坐标系中求得了平面的方程Ax+By+Cz+D=0,将观察点坐标代入上面的判断准则,则可得出如下的简单判据: ① D>0,则平面不可见,应被隐藏; ② D<0,则平面是可见面,应被画出。 2 图像空间的消隐算法 图象空间法基于物体三维模型的二维显示图形来确定物体或表面上的每一点与观察点的远近关系,从而判断哪些表面遮挡了其它表面。为了获得三维物体的二维显示图形,在对物体进行旋转和平移变化后,还需对物体进行透视投影变换。图像空间法包括Z缓冲区法、扫面线法、光线投射法和极值检测法等几种。 以下是这几种算法的比较。 ① Z缓冲区消隐算法简单、可靠,而且消隐和表现效果很好。但需要的内存容量大,运算复杂,费时; ② 扫描线法克服了Z缓冲区法需要分配与屏幕上象素点的个数相同单元的巨大内存这一缺点; ③ 光线投射法的思想是: 考察由视点出发穿过观察屏幕的一象素而射入场景的一条射线,则可确定出场景中与该射线相交的物体。在计算出光线与物体表面的交点之后,离象素最近的交点的所在面片的颜色为该象素的颜色; 如果没有交点,说明没有多边形的投影覆盖此象素,用背景色显示它即可。 ④ 极值检测法需与其它消隐算法结合适用,主要用来提高消隐速度。极值检测法通过计算物体表面的显示坐标的极大和极小值来判断这两个表面是否存在重叠。
2)光照模型 计算机图形学中真实感成像包括两部分内容:物体的精确图形表示和场景中光照效果的适当物理描述。光照效果包括光的反射、透明性、表面纹理和阴影。 在下面的讨论中,假定光源为点光源。从某点光源照射到物体表面上一点,再反射出来的光,可以分为三部分:环境光、漫反射光和镜面反射光。 为可见物体的光照效果建立模型是一个非常复杂的过程,计算机图形学中光照模型可以由描述物体表面明暗度的物理公式推导出来。为了减少明暗度计算量,通常采用简化的光照计算经验模型。下面介绍一些基本的光照模型。 1 环境光 一个物体表面即使不直接暴露在光源下,只要其周围的物体被照亮,它也可能看得见,称为环境光。环境光没有空间或方向上的特征,在所有方向上和所有物体表面上投射的环境光数量都恒定不变。 eaaeaa
IIKIIK环境光反射强度环境光的强度物体表面对环境光的反射系数
由于环境光只能为每个面产生一个平淡的明暗效果,因而在绘制场景时很少仅考虑环境光作用。 2 漫反射 设物体表面在P点的法矢为N; 从P点指向光源的矢量为L;N与L的夹角为θ;若N与L的夹角小于0或大 于90度,则光线被物体自身遮挡而照射不到P点。由 Lambert余弦定理可得点P处漫反射光的强度为:
cos,[0,]2dpdpdIIKIK入射光的强度漫反射系数光线的入射角 如有多个点光源:,1cosndpidiiIIK 3 镜面反射 镜面反射情况由Phong模型给出:
scos InspspIIKIVRnn镜面反射光在观察方向上的光强点光源的强度与之间的夹角与物体表面光滑度有关的一个常数,表面越光滑,越大。
cos nspsIIK 考虑到受距离影响的衰减,上式重写为: 200cos /(dd)nspsIIKdd为点光源到物体表面参考点的距离为一参考值 4 简单光照模型 从视点观察到物体上任一点P处的光强度I应为环境光反射光强度Ie、漫反射光强度Id以及镜面反射光的光强度Is的总和。
2020coscos/()()()/()edsnaapdps
naapdps
IIIIIKIKIKddIKIKLNIKRVdd 在RGB颜色模型中,把入射光强I设为三个分量,分别代表RGB三基色的光强,通过这些分量的值来调整光源的颜色。同样的,Ka、Ks、Kd也有三个分量。于是,RGB颜色模型形式:
()()()()()()nrararprdrprsrngagagpgdgpgsgnbababpbdbpbsbIIKIKLNIKRVIIKIKLNIKRVIIKIKLNIKRV
3)绘制真实感图形 下面我们采OpenGL实现地球绕太阳的公转和月球绕地球的公转并自身带有一定速率的自转。 在DrawScene函数中先画太阳椭圆线(DrawSunEllipse),在画太阳(DrawSun()),其次地球(DrawEarth()),在画地球椭圆线(DrawEarthEllipse()),最后画月亮(DrawMoon())。下面分别介绍各个图形是怎样表现出来的。
1 DrawSunEllipse(): 画椭圆线是根据方程x*x/a*a+y*y/b*b=1;转换为三角表达形式:x=a*cos(angle),y=b*sin(angle);使angle角度在[0,2*PI]中变化是绘点便可得到一个以点组成的椭圆。 2 DrawSun(): 画太阳比较简单,直接绑定纹理(glBindTexture()),,在绘球(gluSphere())即可。
3 DrawEarth(): 想要在绘出地球的运行轨迹,即地球不论怎样转都在太阳的椭圆上,即须将进行模型平移(glTranslatef()),将当前的坐标系移到太阳椭圆的位置上来。考虑到绘制太阳和其椭圆时是在当前坐标系上进行绘制的,现在平移至太阳椭圆上,即只需在x,z轴上分别平移x=a*cos(angle),z=b*sin(angle),即glTranslatef(x,0,z);在到这个坐标系上来进行绘制;但此时地球并未随地球而转动,想实现这个效果可将模型平移中的x,z值变化,这里采用程序的多线程性,这里在Revolution()中while(TRUE)循环所有的angle角度值。注意因为系统处理速度较快,若不在x,z中设置相应的暂停函数,则很难看出效果,这里用Sleep(20)来暂停。
4 DrawEarthEllipse(): 绘制地球椭圆时,注意此时的坐标系已在地球的位置上了,除非调用glLoadIdentity()重置坐标系函数。同绘制太阳椭圆原理一样,采用椭圆方程,只不过这里的椭圆大小是太阳椭圆的7倍,即x=(a/7.0)*cos(angle),z=(b/7.0)*sin(angle) DrawMoon():绘制月球,同样月球是在地球的轨道上运行,同理,亦要平移模型坐标系,使x=(a/7.0)*cos(angle),z=(b/7.0)*sin(angle),同地球公转一样设置在多线程函数中Revolution(),调用glTransferf(x,0,z)定位到地球轨迹上,并实现月亮的公转。
5 视角的变换和视点的平移 此程序可通过上、下键来进行视点位置的前移或后移;通过左右实现视线方