计算机图形学第五次实验报告
计算机图形学实验报告

计算机图形学实验报告学号:姓名:班级:计算机 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"字符串,成功绘制了圆,椭圆,方形,多边形以及曲线圆弧、椭圆弧,同时按指定属性改绘了圆、方形和直线。
计算机图形学实习报告

实习报告实习名称:计算机图形学实习班级:学号:姓名:实习地点:实习指导教师:实习时间:年月日至月日一、实习目的与意义本次计算机图形学的实习分两部分,一部分是利用AutoCAD进行二维和三维模型的制作,另一部分是利用VC6.0进行编程实现对图形的简单操作。
通过对AutoCAD的实习,熟悉该软件的基本功能及操作特点,掌握二维及三维图形的基本制作过程。
通过对VC6.0的编程实习,理解图形的生成、图形的变换、图形的显示以及二维裁剪的基本思想,熟练掌握计算机图形学的基本原理和方法;熟练掌握计算机图形学算法的实现算法;学习和掌握图形系统的设计;学习用VC++编写计算机图形学程序;建立面向对象编程的基本概念。
二、实习主要内容1、AutoCAD软件操作(1)简单图形绘制(2)图形的基本编辑命令操作(3)标注文字及填充(4)三维图形绘制2.基于VC6.0下的计算机图形学程序编写(1)图形的生成:画直线、画圆、画曲线、画字符(2)图形的变换:平移、旋转、缩放、对称变换(3)图形的显示:扫描线填充、边缘填充、种子填充(4)图形的二维裁剪:CS裁剪、多边形裁剪、梁友栋裁剪、圆裁剪、中点分割法三、实习的主要过程第一部分 AutoCAD软件操作AutoCAD软件可以处理很多问题,在机械制图,土木建筑等方面有着广泛的应用,我们在机房打开AutoCAD软件对其进行系统配置,然后进行具体操作。
通过配置可以实现工具栏之类的快捷运用。
(1)简单图形绘制实习开始的第一天,在老师的讲解以及演示下,我们了解了AutoCAD软件的基本使用方法,与此同时,我们跟着老师的操作也逐渐熟悉了该软件的一些基本操作方法。
从设置基本绘图环境开始,按照指导书上的指示,采用边完成简单图形边学习各种命令的方式,逐渐熟练掌握了AutoCAD的使用,熟练掌握了其基本绘图功能,如掌握了绘图命令POINT、LINE、CIRCLE、ARC、DONUT、RECTANGLE、POLYLINE的功能及操作;掌握了实体绘图命令键盘输入的方法;掌握了缩放命令(ZOOM)的使用方法等。
南昌大学计算机图形学实验报告- B样条.doc

实验五 B样条实验类型:□验证□综合□设计□创新实验日期: 2012/12/15 一实验目的实现B样条的生成二实验环境VC6.0环境下的MFC及C++语言三算法思想一个片断上的B样条的表达式可以写作:其中Si是第i个B样条片断而P是一个控制点集,i和k是局部控制点索引。
控制点的集合会是的集合,其中是比重,当它增加时曲线会被拉向控制点,在减小时则把曲线远离该点。
片段的整个集合m-2条曲线由m+1个控制点定义,作为t上的一个B样条可以定义为其中i是控制点数,t是取节点值的全局参数。
这个表达式把B样条表示为B样条基函数的线性组合,这也是这个名称的原因。
有两类B样条-均匀和非均匀。
非均匀B样条相邻控制点间的距离不一定要相等。
一个一般的形式是区间随着插入控制点逐步变小到0。
四实验步骤1 在vc中创建MFC项目2 根据算法分析,在View类中添加函数及成员变量如下在构造函数中初始化各个控制点CBbbbView::CBbbbView(){// TODO: add construction code herem_fX0=50;m_fY0=150;m_fX1=150;m_fY1=250;m_fX2=300;m_fY2=230;m_fX3=350;m_fY3=150;}在GetLines函数中回去各个点的坐标CPoint CBbbbView::GetLine1(float fT){CPoint pt;CRect ClientRect;GetClientRect(&ClientRect);pt.x = 1.0/6.0*m_fX0*(3*fT*fT-fT*fT*fT-3*fT+1)+1.0/6.0*m_fX1*(3*fT*fT*fT-6*fT*fT+4)+1.0/6.0*m_fX 2*(3*fT*fT-3*fT*fT*fT+3*fT+1)+1.0/6.0*m_fX3*fT*fT*fT;pt.y = 1.0/6.0*m_fY0*(3*fT*fT-fT*fT*fT-3*fT+1)+1.0/6.0*m_fY1*(3*fT*fT*fT-6*fT*fT+4)+1.0/6.0*m_fY 2*(3*fT*fT-3*fT*fT*fT+3*fT+1)+1.0/6.0*m_fY3*fT*fT*fT ;return pt;}在OnDraw函数中,绘制B样条曲线void CBbbbView::OnDraw(CDC* pDC){CBbbbDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here pDC->MoveTo(GetLine1(0));int n=1;for(float i = 0; i < n; ){pDC->LineTo(GetLine1(i));pDC->MoveTo(GetLine1(i));i+=0.00001;}pDC->MoveTo(m_fX0,m_fY0);pDC->LineTo(m_fX1,m_fY1);pDC->MoveTo(m_fX1,m_fY1);pDC->LineTo(m_fX2,m_fY2);pDC->MoveTo(m_fX2,m_fY2);pDC->LineTo(m_fX3,m_fY3);}。
计算机图形学实验报告

计算机图形学实验报告
在计算机图形学课程中,实验是不可或缺的一部分。
通过实验,我们可以更好地理解课程中所学的知识,并且在实践中掌握这些
知识。
在本次实验中,我学习了如何使用OpenGL绘制三维图形,并了解了一些基本的图形变换和视图变换。
首先,我们需要通过OpenGL的基本命令来绘制基本图形,例
如线段、矩形、圆等。
这些基本的绘制命令需要首先设置OpenGL 的状态,例如绘制颜色、线段宽度等,才能正确地绘制出所需的
图形。
然后,在实验中我们学习了图形的变换。
变换是指通过一定的
规则将图形的形状、位置、大小等进行改变。
我们可以通过平移、旋转、缩放等变换来改变图形。
变换需要按照一定的顺序进行,
例如先进行旋转再进行平移等。
在OpenGL中,我们可以通过设
置变换矩阵来完成图形的变换。
变换矩阵包含了平移、旋转、缩
放等信息,通过矩阵乘法可以完成图形的复合变换。
最后,视图变换是指将三维场景中的图形投影到二维平面上,
成为我们所见到的图形。
在实验中,我们学习了透视投影和正交
投影两种方式。
透视投影是指将场景中的图形按照视点不同而产
生不同的远近缩放,使得图形呈现出三维感。
而正交投影则是简单地将场景中的图形按照平行投影的方式呈现在屏幕上。
在OpenGL中,我们可以通过设置视图矩阵和投影矩阵来完成视图变换。
通过本次实验,我对于计算机图形学有了更深入的了解,并掌握了一些基本的图形绘制和变换知识。
在今后的学习中,我将继续学习更高级的图形绘制技术,并应用于实际的项目中。
计算机图形学第五次实验报告

《计算机图形学》实验报告实验十一真实感图形一、实验教学目标与基本要求初步实现真实感图形, 并实践图形的造型与变换等。
二、理论基础运用几何造型, 几何、投影及透视变换、真实感图形效果(消隐、纹理、光照等)有关知识实现。
1.用给定地形高程数据绘制出地形图;2.绘制一(套)房间,参数自定。
三. 算法设计与分析真实感图形绘制过程中, 由于投影变换失去了深度信息, 往往导致图形的二义性。
要消除这类二义性, 就必须在绘制时消除被遮挡的不可见的线或面, 习惯上称之为消除隐藏线和隐藏面, 或简称为消隐, 经过消隐得到的投影图称为物体的真实图形。
消隐处理是计算机绘图中一个引人注目的问题, 目前已提出多种算法, 基本上可以分为两大类:即物体空间方法和图象空间方法。
物体空间方法是通过比较物体和物体的相对关系来决定可见与不可见的;而图象空间方法则是根据在图象象素点上各投影点之间的关系来确定可见与否的。
用这两类方法就可以消除凸型模型、凹形模型和多个模型同时存在时的隐藏面。
1).消隐算法的实现1.物体空间的消隐算法物体空间法是在三维坐标系中, 通过分析物体模型间的几何关系, 如物体的几何位置、与观察点的相对位置等, 来进行隐藏面判断的消隐算法。
世界坐标系是描述物体的原始坐标系, 物体的世界坐标描述了物体的基本形状。
为了更好地观察和描述物体, 经常需要对其世界坐标进行平移和旋转, 而得到物体的观察坐标。
物体的观察坐标能得到描述物体的更好视角, 所以物体空间法通常都是在观察坐标系中进行的。
观察坐标系的原点一般即是观察点。
物体空间法消隐包括两个基本步骤, 即三维坐标变换和选取适当的隐藏面判断算法。
选择合适的观察坐标系不但可以更好地描述物体, 而且可以大大简化和降低消隐算法的运算。
因此, 利用物体空间法进行消隐的第一步往往是将物体所处的坐标系转换为适当的观察坐标系。
这需要对物体进行三维旋转和平移变换。
常用的物体空间消隐算法包括平面公式法、径向预排序法、径向排序法、隔离平面法、深度排序法、光线投射法和区域子分法。
《计算机图形学》实验报告

实验报告模板《计算机图形学》实验报告一、实验目的及要求1.实习三维图形的坐标系之间的变换;2.三维图形几何变换;3.掌握三维图形的坐标系之间的变换算法及三维图形几何变换的原理和实现;4.实现二维图形的基本变换(平移、旋转、缩放、错切、对称、复合等);5.实现三维图形的基本变换(平移、旋转、缩放、复合等);二、理论基础在齐次坐标理论下,二维图形几何变换矩阵可用下式表示:⎪⎪⎪⎭⎫⎝⎛===ifchebgdaTnkxx kk2,1,0,)(ϕ平移变换:[x* y* 1] =[x y 1] *0000001ts⎛⎫⎪⎪⎪⎝⎭=[t*x s*y 1]比例变换:[x* y* 1]=[x y 1] *1000101m n⎛⎫⎪⎪⎪⎝⎭=[m+x n+y 1]旋转变换:在平面上的二维图形饶原点逆时针旋转Ө角,变换矩阵为[x* y* 1]=[x y 1] *cos sin0sin cos0001θθθθ⎛⎫⎪- ⎪⎪⎝⎭= [x*cosө-y*sinө]复合变换:以上各种变换矩阵都是以原点为参照点,当以任意参照点进行变换的时候,我们就要用到复合变换矩阵。
三维变换类似于二维,在画图时,把三维坐标转换为二维即可。
三、算法设计与分析二维变换:#define dx 50#define dy 100void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+dx;a[1]=m[i][1]+dy;b[0]=m[i+1][0]+dx;b[1]=m[i+1][1]+dy;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define h 0.1745#include<math.h>void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*cos(h)-m[i][1]*sin(h);a[1]=m[i][1]*cos(h)+m[i][0]*sin(h);b[0]=m[i+1][0]*cos(h)-m[i+1][1]*sin(h);b[1]=m[i+1][1]*cos(h)+m[i+1][0]*sin(h);DDALine(a,b, RGB(0, 200, 255), pDC);}}#define k 2;#define f 2.5void CCGWithVCView::OnTransMove() //缩放{// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Scale Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*k;a[1]=m[i][1]*f;b[0]=m[i+1][0]*k;b[1]=m[i+1][1]*f;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define n 2#define d 0void CCGWithVCView::OnTransOther(){// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Other Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+n*m[i][1];a[1]=m[i][1]+d*m[i][0];b[0]=m[i+1][0]+n*m[i+1][1];b[1]=m[i+1][1]+d*m[i+1][0];DDALine(a,b, RGB(0, 200, 255), pDC);}}三维变换:#include<math.h>#define dx 100#define dy 100#define dz 0void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]+dy-p3d[i][0]+dx/sqrt(2);p2d[i][1]=p3d[i][2]+dz+p3d[i][0]+dx/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}#define k 0.1745void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]*cos(k)-p3d[i][2]*sin(k)-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]*cos(k)+p3d[i][1]*sin(k)+p3d[i][0]/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}四、程序调试及结果的分析二维:三维:五、实验心得及建议在实验过程中,尽管过程中任由许多不会的地方,而且有待于今后的提高和改进,但我加深了对书本上知识的理解与掌握,同时也学到了很多书本上没有东西,并积累了一些宝贵的经验,这对我以后的学习与工作是不无裨益的。
计算机图形学实习报告
计算机图形学实习报告计算机图形学课程设计实验报告姓名:学号:专业:地理信息系统⼀、课程设计⽬的在掌握图形学的基本原理、算法和实现技术基础上,通过编程实践学会基本的图形软件开发技术。
⼆、课程设计内容仿照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布置对话框界⾯对话框资源插⼊后,即可在该对话框上布置各种需要的控件,并可通过编排菜单的各种命令或“对话”⼯具条调整各控件的⼤⼩,位置,对齐⽅式等,还可以单击对话⼯具条上第⼀个按钮“测试”按钮,看到对话框运⾏时的界⾯。
《计算机图形学》实验报告
《计算机图形学》实验报告一、实验目的计算机图形学是一门研究如何利用计算机生成、处理和显示图形的学科。
通过本次实验,旨在深入理解计算机图形学的基本原理和算法,掌握图形的生成、变换、渲染等技术,并能够运用所学知识解决实际问题,提高对图形学的应用能力和编程实践能力。
二、实验环境本次实验使用的编程语言为 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),进行后续分析和展示。
计算机图形学实验报告
计算机图形学实验报告计算机图形学实验报告学号:姓名:⼀、Bresenham算法1、算法思想:1画起点(x1, y1); 2.准备画下⼀个点,X坐标加1,判断如果达到终点,则完成。
否则找下⼀个点,由图可知要画的点要么为当前点的右邻接点,要么是当前点的右上邻接点。
2.1.如果线段ax+by+c=0与x=x1+1的交点y坐标⼤于(y+*y+1))/2则选右上那个点2.2.否则选右下那个点;3.画点;4.跳回第2步; 5.结束。
2、优点:Bresenham算法也是采⽤递推步进的办法,但与简单DDA 算法不同,它是根据⼀个简单的判别式来判断在另⼀个⽅向上是否也需要步进⼀个单位,这样就避免了许多实数运算。
3、运⾏结果:⼆、中点Bresenham算法画圆1、算法思想:1、赋初值:x=0,y=R,d=3-2R;2、画点(x,y)(同时画8个点);3、若d<0,则d=d+4x+6,否则d=d+4(x-y)+10,y=y-1;4、赋值:x=x+1;5、若x2、优点:将⼀个象限内的相邻⼋分圆弧对于分割两个部分的四⼗五度是对称的,利⽤园对称性的这种⽅法仅需计算从x=0到x=y段内的点就可得到整个园的所有像素位置,但计算时间仍很⼤,⽤Bresenham 画线算法以决策参数的增加量计算为基础,仅包括简单的整数操作。
3、运⾏结果:三、编程实现绘制⼀段三次Bezier曲线1、理解:Bezier曲线通过控制曲线上的四个点(起始点、终⽌点以及两个相互分离的中间点)来创造、编辑图形。
其中起重要作⽤的是位于曲线中央的控制线。
这条线是虚拟的,中间与贝塞尔曲线交叉,两端是控制端点。
移动两端的端点时贝塞尔曲线改变曲线的曲率(弯曲的程度);移动中间点(也就是移动虚拟的控制线)时,贝塞尔曲线在起始点和终⽌点锁定的情况下做均匀移动。
2、对两个端点的编码进⾏逻辑与运算:若结果为⾮零,则线段全部在裁剪窗⼝之外,舍弃,否则,若全为零,则线段全在窗⼝内,可直接接受;3、否则,求线段与窗⼝边的交点,舍弃在裁剪窗⼝外同侧的部分线段,对留下的线段重新执⾏2步骤。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《计算机图形学》实验报告实验十一真实感图形一、实验教学目标与基本要求初步实现真实感图形,并实践图形的造型与变换等。
二、理论基础运用几何造型,几何、投影及透视变换、真实感图形效果(消隐、纹理、光照等)有关知识实现。
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 环境光一个物体表面即使不直接暴露在光源下,只要其周围的物体被照亮,它也可能看得见,称为环境光。
环境光没有空间或方向上的特征,在所有方向上和所有物体表面上投射的环境光数量都恒定不变。
e a ae a a I I K I I K =------环境光反射强度环境光的强度物体表面对环境光的反射系数由于环境光只能为每个面产生一个平淡的明暗效果,因而在绘制场景时很少仅考虑环境光作用。
2 漫反射设物体表面在P 点的法矢为N ; 从P 点指向光源的矢量为L ;N 与L 的夹角为θ;若N 与L 的夹角小于0或大于90度,则光线被物体自身遮挡而照射不到P 点。
由Lambert 余弦定理可得点P 处漫反射光的强度为: cos ,[0,]2d p d p d I I K I K πθθθ=∈---入射光的强度漫反射系数光线的入射角如有多个点光源:,1cos n d p i d i i I I K θ==∑3 镜面反射镜面反射情况由Phong 模型给出:s cosI n s p s p I I K I V R n n αα=----镜面反射光在观察方向上的光强点光源的强度与之间的夹角与物体表面光滑度有关的一个常数,表面越光滑,越大。
cos n s p sI I K α= 考虑到受距离影响的衰减,上式重写为:200cos /(d d )n s p s I I K d d α=+--为点光源到物体表面参考点的距离为一参考值4 简单光照模型从视点观察到物体上任一点P 处的光强度I 应为环境光反射光强度Ie 、漫反射光强度Id 以及镜面反射光的光强度Is 的总和。
2020cos cos /()()()/()e d sn a a p d p s n a a p d p s I I I I I K I K I K d d I K I K L N I K R V d d θα=++=+++=+⋅+⋅+在RGB 颜色模型中,把入射光强I 设为三个分量,分别代表RGB 三基色的光强,通过这些分量的值来调整光源的颜色。
同样的,Ka 、Ks 、Kd 也有三个分量。
于是,RGB 颜色模型形式: ()()()()()()nr ar ar pr dr pr sr n g ag ag pg dg pg sg nbab ab pb db pb sb I I K I K L N I K R V I I K I K L N I K R V I I K I K L N I K R V ⎧=+⋅+⋅⎪=+⋅+⋅⎨⎪=+⋅+⋅⎩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 视角的变换和视点的平移此程序可通过上、下键来进行视点位置的前移或后移;通过左右实现视线方向的左右变换。
通过PgUp键实现视线向上翻转,通过PgDn实现实现向下翻转:在说其平移和变换时,先介绍glLookAt()函数,前三个函数为视点方向,中间三个为参考点(=视点方向+实现方向),后后三个参数为成像正立,一般设置为0,1,0。
初始化视x=0.0f,y=0.0f,z=5.0f;在定义视线位置lx=0.0f,ly=0.0f,lz=-1.0f;glLookAt(x,y,z,x+lx,y+ly,z+lz,0,1,0);视点位置平移:在xz平面内,仅需改变x,z值即可;前移:x+=lx*(一定速值);z+=lz*(一定速值);同理,后移x-=lx*(一定速值);z-=lz*(一定速值);视线方向改变:当视线向右变换时,此时视角(MoveAngel按一定速率自增)改变,xz平面内lx,lz值改变,即lx=sin(MoveAngle),lz=-cos(MoveAngle);同理视线左边换时,MoveAngle按一定速率自减,使lx=sin (MoveAngle),lz=-cos(MoveAngle);PgUp,PgDn的图像翻转实现:同理类似与视线的变换,只不过变换的平面不一样,PgUp和PgDn的上下翻转是在yz平面内实现,且在视线上下变换的同时,y点的视点位置亦要随之改变,这也就是翻转与视线变换的不同之所在了。