计算机图形学课程设计ZBuffer隐面算法的实现.docx

上传人:b****3 文档编号:12872301 上传时间:2023-04-22 格式:DOCX 页数:19 大小:60.02KB
下载 相关 举报
计算机图形学课程设计ZBuffer隐面算法的实现.docx_第1页
第1页 / 共19页
计算机图形学课程设计ZBuffer隐面算法的实现.docx_第2页
第2页 / 共19页
计算机图形学课程设计ZBuffer隐面算法的实现.docx_第3页
第3页 / 共19页
计算机图形学课程设计ZBuffer隐面算法的实现.docx_第4页
第4页 / 共19页
计算机图形学课程设计ZBuffer隐面算法的实现.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

计算机图形学课程设计ZBuffer隐面算法的实现.docx

《计算机图形学课程设计ZBuffer隐面算法的实现.docx》由会员分享,可在线阅读,更多相关《计算机图形学课程设计ZBuffer隐面算法的实现.docx(19页珍藏版)》请在冰豆网上搜索。

计算机图形学课程设计ZBuffer隐面算法的实现.docx

计算机图形学课程设计ZBuffer隐面算法的实现

枣庄学院

信息科学与工程学院课程设计任务书

 

题目:

Z-Buffer隐面算法的实现

 

姓名:

秦云

学号:

201012110128

专业班级:

计算机科学与技术、2010级本1班

课程:

计算机图形学

指导教师:

燕孝飞职称:

讲师

完成时间:

2012年12月----2013年1月

枣庄学院信息科学与工程学院制

2012年12月30日

课程设计任务书及成绩评定

课程设计的任务和具体要求

本次课程设计共分为2个部分。

第一部分,通过本学期计算机图形学的学习,对计算机图形学的历史、发展、研究方向、以及涉及的知识原理进行概括性论述;

第二部分,选取一个研究点,通过所学的计算机图形学知识来设计一个系统,该系统可以体现计算机图形学的思想和原理即可。

 

指导教师签字:

_______日期:

指导教师评语

 

成绩:

____________指导教师签字:

日期:

课程设计所需软件、硬件等

⏹硬件环境:

Iterl(R)Core(TM)2DuoCPU,主频2.31GHz;内存3G;

硬盘320G以上;1024×768显示分辨率

⏹软件环境:

VisualC++6.0

 

课程设计进度计划

起至日期

工作内容

备注

2012.12.4-2012.12.15

2012.12.16-2012.12.30

2012.12.31-2013.1.5

选取课题

系统设计

撰写报告

参考文献、资料索引

序号

文献、资料名称

编著者

出版单位

[1]孙家广.计算机辅助几何造型技术[M].北京:

中国铁道出版社,2007.86-132

[2]唐泽圣等.三维数据场可视化[M].北京:

清华大学出版社,2005.106-158

[3]吴建华.人机交互和多通道用户界面[M].北京:

科学出版社,2009,123-145

 

目录

第1章引言1

第2章计算机图形学的发展历史2

2.1智能CAD2

2.2计算机美术与设计2

2.2.1计算机美术的发展2

2.3计算机动画艺术3

2.3.1历史的回顾3

2.4科学计算可视化4

2.5虚拟现实4

第3章计算机图形学的研究方向6

第4章Z-Buffer隐面算法的相关原理7

4.1Z-Buffer隐面算法简介7

4.2Z-Buffer隐面算法程序7

第5章系统设计的相关代码8

5.1坐标设置函数的相应代码8

5.2旋转角度函数相应代码8

5.3多边形填充9

第6章系统的运行效果12

6.1运行主界面12

6.2不同方向键的运行效果13

第7章总结16

第1章引言

计算机图形学一个主要的目的就是要利用计算机产生令人赏心悦目的真实感图形。

为此,必须建立图形所描述的场景的几何表示,再用某种光照模型,计算在假想的光源、纹理、材质属性下的光照明效果。

所以计算机图形学与另一门学科计算机辅助设计有着密切的关系。

事实上,图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其主要的研究内容。

同时,真实感图形计算的结果是以数字图像的方式提供的,计算机图形学也就和图像处理有着密切的关系。

真实感图形绘制过程中,由于投影变换失去了深度信息,往往导致图形的二义性。

要消除这类二义性,就必须在绘制时消除被遮挡的不可见的线或面,习惯上称之为消除隐藏线和隐藏面,或简称为消隐,经过消隐得到的投影图称为物体的真实图形。

计算机图形学狭义上是一种研究基于物理定律、经验方法以及认知原理,使用各种数学算法处理二维或三维图形数据,生成可视数据表现的科学。

它是计算机科学的一个分支领域与应用方向,主要关注数字合成与操作视觉的图形内容。

广义上来看,计算机图形学不仅包含了从三维图形建模、绘制到动画的过程,同时也包括了对二维矢量图形以及图像视频融合处理的研究。

计算机图形学经过将近40年的发展,已进入了较为成熟的发展期。

目前,其主要应用领域包括计算机辅助设计与加工,影视动漫,军事仿真,医学图像处理,气象、地质、财经和电磁等的科学可视化等。

由于计算机图形学在这些领域的成功运用,特别是在迅猛发展的动漫产业中,带来了可观的经济效益。

动漫产业是目前各国优先发展的绿色产业,具有高科技、高投入与高产出等特点。

据统计,截至2009年3月,美国动画梦工厂所拍摄的三维动画片《怪物史莱克II》在预算为1.5亿美元的情况下,获得了超过9.2亿的全球累计票房。

而我国在2008年度共制作完成的国产电视动画片249部,计131042分钟,与2007年度相比增加了近28%。

另一方面,由于这些领域应用的推动,也给计算机图形学的发展提供了新的发展机遇与挑战。

 

第2章计算机图形学的发展历史

2.1智能CAD

CAD的发展也显现出智能化的趋势,就目前流行的大多数CAD软件来看,主要功能是支持产品的后续阶段一一工程图的绘制和输出,产品设计功能相对薄弱,利用AutoCAD最常用的功能还是交互式绘图,如果要想进行产品设计,最基本的是要其中的AutoLis语言编写程序,有时还要用其他高级语言协助编写,很不方便。

而新一代的智能CAD系统可以实现从概念设计到结构设计的全过程。

例如,德国西门子公司开发的SigraphDesign软件可以实现如下功能:

①从一开始就可以用计算机设计草图,不必耗时费力的输入精确的坐标点,能随心所欲的修改,一旦结构确定,给出正确的尺寸即得到满意的图纸;②这个软件中具有关系数据结构,当你改变图纸的局部,相关部分自动变化,在一个视图上的修改,其他视图自动修改,甚至改变一个零件图,相关的其它零件图以及装配图的相关部分自动修改:

③在各个专业领域中,有一些常用件和标准件,因此,希望有一个参数化图库。

而Sigraph不用编程只需画一遍图就能建成自己的图库;④Sigraph还可以实现产品设计的动态模拟用于观察设计的装置在实际运行中是否合理等等。

智能CAD的另一个领域是工程图纸的自动输入与智能识别,随着CAD技术的迅速推广应用,各个工厂、设计院都需将成千上万张长期积累下来的设计图纸快速而准确输入计算机,作为新产品开发的技术资料。

多年来,CAD中普遍采用的图形输入方法是图形数字化仪交互输入和鼠标加键盘的交互输入方法.很难适应工程界大量图纸输入的迫切需要。

因此,基于光电扫描仪的图纸自动输入方法已成为国内外CAD工作者的努力探索的新课题。

但由于工程图的智能识别涉及到计算机的硬件、计算机图形学、模式识别及人工智能等高新技术内容,使得研究工作的难点较大。

工程图的自动输入与智能识别是两个密不可分的过程,用扫描仪将手绘图纸输入到计算机后,形成的是点阵图象。

2.2计算机美术与设计

2.2.1计算机美术的发展  

1952年.美国的Ben.Laposke用模拟计算机做的波型图《电子抽象画》预示着电脑美术的开始(比计算机图形学的正式确立还要早)。

计算机美术的发展可分为三个阶段:

  

(1)早期探索阶段(19521968年)主创人员大部分为科学家和工程师,作品以平面几何图形为主。

1963年美国《计算机与自动化》杂志开始举办年度“计算机美术比赛”。

  代表作品:

1960年WiuiamFerrter为波音公司制作的人体工程学实验动态模拟.模拟飞行员在飞机中各种情况;1963年KennethKnowIton的打印机作品《裸体》。

1967年日本GTG小组的《回到方块》。

(2)中期应用阶段(1968年~1983年)以1968年伦敦第一次世界计算机美术大展一“控制论珍宝(CybernehicSerendipity1为标志,进入世界性研究与应用阶段;计算机与计算机图形技术逐步成熟,一些大学开始设置相关课题,出现了一些CAD应用系统和成果,三维造型系统产生并逐渐完善。

代表作品:

1983年美国IBM研究所RicherdVoss设计出分形山。

(3)应用与普及阶段(1984年~现在)以微机和工作站为平台的个人计算机图形系统逐渐走向成熟,大批商业性美术(设计)软件面市;以苹果公司的MAC机和图形化系统软件为代表的桌面创意系统被广泛接受,CAD成为美术设计领域的重要组成部分。

代表作品:

1990年JefreyShaw的交互图形作品“易读的城市fThelegiblecity”。

2.3计算机动画艺术

2.3.1历史的回顾

  计算机动画技术的发展是和许多其它学科的发展密切相关的。

计算机图形学、计算机绘画、计算机音乐、计算机辅助设计、电影技术、电视技术、计算机软件和硬件技术等众多学科的最新成果都对计算机动画技术的研究和发展起着十分重要的推动作用50年代到60年代之间,大部分的计算机绘画艺术作品都是在打印机和绘图仪上产生的。

一直到60年代后期,才出现利用计算机显示点阵的特性,通过精心地设计图案来进行计算机艺术创造的活动。

  70年代开始.计算机艺术走向繁荣和成熟1973年,在东京索尼公司举办了“首届国际计算机艺术展览会”80年代至今,计算机艺术的发展速度远远超出了人们的想象在代表计算机图形研究最高水平的历届SIGGRAPH年会上,精彩的计算机艺术作品层出不穷。

另外,在此期间的奥斯卡奖的获奖名单中,采用计算机特技制作电影频频上榜,大有舍我其谁的感觉。

在中国,首届计算机艺术研讨会和作品展示活动于1995年在北京举行。

它总结了近年来计算机艺术在中国的发展,对未来的工作起到了重要的推动作用。

2.3.2在电影特技中的应用

计算机动画的一个重要应用就是制作电影特技可以说电影特技的发展和计算机动画的发展是相互促进的。

1987年由著名的计算机动画专家塔尔曼夫妇领导的MIRA实验室制作了一部七分钟的计算机动画片《相会在蒙特利尔》再现了国际影星玛丽莲·梦露的风采。

1988年,美国电影《谁陷害了兔子罗杰》(WhoFramedRogerRabbit?

)中二维动画人物和真实演员的完美结合,令人瞠目结舌、叹为观止其中用了不少计算机动画处理。

1991年美国电影《终结者II:

世界末日》展现了奇妙的计算机技术。

此外,还有《侏罗纪公园》(JurassicPark)、《狮子王》、《玩具总动员》(ToyStory)等。

2.4科学计算可视化

  科学计算的可视化是发达国家八十年代后期提出并发展起来的一门新兴技术,它将科学计算过程中及计算结果的数据转换为几何图形及图象信息在屏幕上显示出来并进行交互处理,成为发现和理解科学计算过程中各种现象的有力工具。

1987年2月英国国家科学基金会在华盛顿召开了有关科学计算可视化的首次会议。

会议一致认为“将图形和图象技术应用于科学计算是一个全新的领域”科学家们不仅需要分析由计算机得出的计算数据,而且需要了解在计算机过程中数据的变化。

会议将这一技术定名为“科学计算可视化(VisualizationinScientificComputing)”。

科学计算可视化将图形生成技术图象理解技术结合在一起,它即可理解送入计算机的图象数据.也可以从复杂的多维数据中产生图形。

它涉及到下列相互独立的几个领域:

计算机图形学、图象处理、计算机视觉、计算机辅助设计及交互技术等。

科学计算可视按其实现的功能来分,可以分为三个档次:

(1)结果数据的后处理;

(2)结果数据的实时跟踪处理及显示;(3)结果数据的实时显示及交互处理。

2.5虚拟现实

“虚拟现实”(VirtualReality)-词是由美国喷气推动实验室(VPL)的创始人拉尼尔(JaronLanier)首先提出的在克鲁格(MyrenKruege)70年代中早期实验里.被称为人工现实”(Artificialreality);而在吉布森(WilliamGibson)l984年出版的科幻小说Neuremanccr里,又被称为“可控空间”(Cyberspaee)。

虚拟现实,也育人称之为虚拟环境(VirtualEnvironment)是美国国家航空和航天局及军事部门为模拟而开发的一门高新技术它利用计算机图形产生器,位置跟踪器,多功能传感器和控制器等有效地模拟实际场景和情形,从而能够使观察者产生一种真实的身临其境的感觉虚拟环境由硬件和软件组成,硬件部分主要包括:

传感器(Sensors)、印象器(Efeeter)和连接侍感器与印象器产生模拟物理环境的特殊硬件。

利用虚拟现实技术产生虚拟现实环境的软件需完成以下三个功能:

建立作用器(Actors)以及物体的外形和动力学模型:

建立物体之间以及周围环境之间接照牛顿运动定律所决定的相互作用;描述周围环境的内容特性。

虚拟现实技术主要研究用计算机模拟(构造)三维图形空间,并使用户能够自然地与该空间进行交互。

它涉及很多科学的知识,对三维图形处理技术的要求特别高。

简单的虚拟现实系统早在70年代便被应用于军事领域,训练驾驶员。

80年代后随着计算机软硬件技术的提高,它也得到重视并迅速发展。

目前它已在航空航天、医学、教育、艺术、建筑等领域得到初步的应用。

例如,1997年7月,美国航天局的旅居者号火星车着陆距地球约1.9亿公里的火星。

这辆在火星表面缓慢爬行的小车中并没有驾驶员,它是由地球上的工程师通过虚拟现实系统操纵的。

 

第3章计算机图形学的研究方向

计算机图形学经过将近40年的发展,已进入了较为成熟的发展期。

目前,其主要应用领域包括计算机辅助设计与加工,影视动漫,军事仿真,医学图像处理,气象、地质、财经和电磁等的科学可视化等。

由于计算机图形学在这些领域的成功运用,特别是在迅猛发展的动漫产业中,带来了可观的经济效益。

动漫产业是目前各国优先发展的绿色产业,具有高科技、高投入与高产出等特点。

从计算机图形学目前学科发展来看,有以下几个发展趋势:

(1)与图形硬件的发展紧密结合,突破实时高真实感、高分辨率渲染的技术难点。

(2)研究和谐自然的三维模型建模方法。

(3)利用日益增长的计算性能,实现具有高度物理真实的动态仿真。

(4)研究多种高精度数据获取与处理技术,增强图形技术的表现。

(5)计算机图形学与图像视频处理技术的结合。

(6)从追求绝对的真实感向追求与强调图形的表意性转变

 

第4章Z-Buffer隐面算法的相关原理

4.1Z-Buffer隐面算法简介

在这个算法里,不仅需要有帧缓存来存放每个像素的颜色值,还需要有一个深度缓存来存放每一个像素的深度值。

Z缓冲器中每个单元的值是对应像素点所反映对象的z坐标值,初值取z的极小值;帧缓冲器每个单元的初值可放对应背景颜色的值。

图形消隐的过程就是给帧缓冲器和Z缓冲器中相应过程填值得过程。

在把显示对象的每个面上每一点的属性(颜色或灰度)值填入帧缓冲器相应单元前,要把这点的z坐标值和Z缓冲器中相应单元的值进行比较,只有前者大于后者时才改变帧缓冲器的该单元的值,同时Z缓冲器中相应单元的值也要改成这点的z坐标值。

如果这点的z坐标值小于Z缓冲器中的值,则说明对应像素已经显示了对象上一个点的属性,改点要比考虑的点更接近观察点。

对显示对象的每个面上的每个点都进行上述处理后,便可得到消隐了隐藏面的图。

4.2Z-Buffer隐面算法程序

Z-Buffer()

{帧缓存全置为背景色;

深度缓存全置为最小Z值;

for(每一个多边形)

{扫描转换该多边形;

for(该多边形所覆盖的每个像素(x,y))

{计算该多边形在该像素的深度值Z(x,y);

if(Z(x,y)大于Z缓存在(x,y)的值)

{把Z(x,y)存入Z缓存中的(x,y);

把多边形在(x,y)处的颜色值存入帧缓存的(x,y)处;

}

}

}

}

Z-Buffer算法在像素级上以近物取代远物,形体在屏幕上的出现顺序是无关紧要的,这种取代算法有利于硬件实现。

第5章系统设计的相关代码

5.1坐标设置函数的相应代码

该函数代码如下:

voidCTestView:

:

ZBuffer({

CRectRect;

GetClientRect(&Rect);

CClientDCdc(this);

dc.SetMapMode(MM_ANISOTROPIC);//自定义坐标系

dc.SetWindowExt(Rect.Width(),Rect.Height());

dc.SetViewportExt(Rect.right,-Rect.bottom);//x轴垂直向右,y轴垂直向上

dc.SetViewportOrg(Rect.right/2,Rect.bottom/2);//屏幕中心为圆心

CDCMemDC;

MemDC.CreateCompatibleDC(GetDC());

MemDC.SetMapMode(MM_ANISOTROPIC);

MemDC.SetWindowExt(Rect.Width(),Rect.Height());

MemDC.SetViewportExt(Rect.right,-Rect.bottom);

MemDC.SetViewportOrg(Rect.right/2,Rect.bottom/2);

CBitmapBitmap,*OldBitmap;

Bitmap.LoadBitmap(IDB_BITMAP2);

OldBitmap=MemDC.SelectObject(&Bitmap);

MemDC.BitBlt(-Rect.right/2,-Rect.bottom/2,Rect.Width(),Rect.Height(),&Picture,-Rect.right/2,-Rect.bottom/2,SRCCOPY);

m_Paint(&MemDC);

dc.BitBlt(-Rect.right/2,-Rect.bottom/2,Rect.right,Rect.bottom,&MemDC,-Rect.right/2,-Rect.bottom/2,SRCCOPY);

MemDC.SelectObject(OldBitmap);

}

5.2旋转角度函数相应代码

该函数代码如下:

voidCTestView:

:

Angle()

{//将Boxx方向旋转m_AngleX度,y方向旋转m_AngleY度

for(inti=0;i<8;i++)//Box有8个顶点

{

MyPointTmpPoint;

TmpPoint.x=m_OldBox.m_Point[i].x;

TmpPoint.y=ROUND(m_OldBox.m_Point[i].y*cos(m_AngleX*PI/180)+m_OldBox.m_Point[i].z*sin(m_AngleX*PI/180));

TmpPoint.z=ROUND(-m_OldBox.m_Point[i].y*sin(m_AngleX*PI/180)+m_OldBox.m_Point[i].z*cos(m_AngleX*PI/180));

m_Box.m_Point[i].x=ROUND(-TmpPoint.z*sin(m_AngleY*PI/180)+TmpPoint.x*cos(m_AngleY*PI/180));

m_Box.m_Point[i].y=TmpPoint.y;

m_Box.m_Point[i].z=TmpPoint.z*cos(m_AngleY*PI/180)+TmpPoint.x*sin(m_AngleY*PI/180);

}

5.3多边形填充

代码如下:

voidCTestView:

:

PolygonFill(CDC*mdc)

{

//计算直线deep增量

doubleCurDeep=0.0;//当前扫描线的深度

doubleDeepStep=0.0;//当前扫描线随着x增长的深度步长

doubleA=0.0;//平面方程系数A

doubleB=0.0;//平面方程系数B

doubleC=0.0;//平面方程系数C

doubleD=0.0;//平面方程系数D

//计算当前面方程Ax+By+Cz+D=0的系数

A=(Point[1].y-Point[2].y)*(Point[1].z-Point[3].z)-(Point[1].y-Point[3].y)*(Point[1].z-Point[2].z);

B=(Point[1].x-Point[3].x)*(Point[1].z-Point[2].z)-(Point[1].z-Point[3].z)*(Point[1].x-Point[2].x);

C=(Point[1].x-Point[2].x)*(Point[1].y-Point[3].y)-(Point[1].x-Point[3].x)*(Point[1].y-Point[2].y);

D=-A*Point[1].x-B*Point[1].y-C*Point[1].z;

//计算curDeep;从x=xMin开始计算,此时针对yi

DeepStep=-A/C;

HeadE=NULL;

for(CurrentB=HeadB;CurrentB!

=NULL;CurrentB=CurrentB->next)//访问所有桶结点

{for(CurrentE=CurrentB->p;CurrentE!

=NULL;CurrentE=CurrentE->next)//访问桶中排序前的边结点

{Edge*TEdge=newEdge;

TEdge->x=CurrentE->x;

TEdge->yMax=CurrentE->yMax;

TEdge->k=CurrentE->k;

TEdge->next=NULL;

AddAet(TEdge);//将该边插入临时Aet表}

AetOrder();//使得Aet表按照x递增的顺序存放

T1=HeadE;//根据ymax抛弃扫描完的边结点

if(T1==NULL)

{return;}

while(CurrentB->ScanLine>=T1->yMax)//放弃该结点,Aet表指针后移

{T1=T1->next;

HeadE=T1;

if(HeadE==NULL)

{return;}}

if(T1->next!

=NULL)

{T2=T1;

T1=T2->next;}

while(T1!

=NULL)

{if(CurrentB->ScanLine>=T1->yMax)//跳过一个结点

{T2->next=T1->next;

T1->next=NULL;

T1=T2->next;}

else

{T2=T1;

T1=T2->next;}}

BOOLIn=false;//设置一个BOOL变量In,初始值为假

doublexb,xe;//扫描线的起点和终点

for(T1=HeadE;T1!

=NULL;T1=T1->next)//填充扫描线和多边形相交的区间

{if(In==false)

{xb=T1->x;CurDeep=-(xb*A+CurrentB->ScanLine*B+D)/C;//z=-(Ax+By-D)/C

In=true;//每访问一个结点,把In值取反一次}

else//如果In值为真,则填充从当前结

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1