图形学课程设计报告_第1页
图形学课程设计报告_第2页
图形学课程设计报告_第3页
图形学课程设计报告_第4页
图形学课程设计报告_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、可视化报告一、 所选题目长方体的光照效果可视化显示。二、可视化简介可视化(Visualization)是利用计算机图形学和图像处理技术,将数据转换成图形或图像在屏幕上显示出来,并进行交互处理的理论、方法和技术。它涉及到计算机图形学、图像处理、计算机视觉、计算机辅助设计等多个领域,成为研究数据表示、数据处理、决策分析等一系列问题的综合技术。目前正在飞速发展的虚拟现实技术也是以图形图像的可视化技术为依托的。最近几年计算机图形学的发展使得三维表现技术得以形成,这些三维表现技术使我们能够再现三维世界中的物体,能够用三维形体来表示复杂的信息,这种技术就是可视化(Visualization)技术。可视化技

2、术使人能够在三维图形世界中直接对具有形体的信息进行操作,和计算机直接交流。这种技术已经把人和机器的力量以一种直觉而自然的方式加以统一,这种革命性的变化无疑将极大地提高人们的工作效率。可视化技术赋予人们一种仿真的、三维的并且具有实时交互的能力,这样人们可以在三维图形世界中用以前不可想象的手段来获取信息或发挥自己创造性的思维。机械工程师可以从二维平面图中得以解放直接进入三维世界,从而很快得到自己设计的三维机械零件模型。医生可以从病人的三维扫描图象分析病人的病灶。军事指挥员可以面对用三维图形技术生成的战场地形,指挥具有真实感的三维飞机、军舰、坦克向目标开进并分析战斗方案的效果。更令人惊奇的是目前正在

3、发展的虚拟现实技术,人们对计算机可视化技术的研究已经历了一个很长的历程,而且形成了许多可视化工具,其中SGI公司推出的GL三维图形库表现突出,易于使用而且功能强大。利用GL开发出来的三维应用软件颇受许多专业技术人员的喜爱,这些三维应用软件已涉及建筑、产品设计、医学、地球科学、流体力学等领域。随着计算机技术的继续发展,GL已经进一步发展成为OpenGL,OpenGL已被认为是高性能图形和交互式视景处理的标准,包括ATT公司UNIX软件实验室、IBM公司、DEC公司、SUN公司、HP公司、Microsoft公司和SGI公司在内的几家在计算机市场占领导地位的大公司都采用了OpenGL图形标准。值得一

4、提的是,由于Microsoft公司在Windows NT中提供OpenGL图形标准,OpenGL将在微机中广泛应用,尤其是OpenGL三维图形加速卡和微机图形工作站的推出,人们可以在微机上实现三维图形应用,如CAD设计、仿真模拟、三维游戏等,从而更有机会、更方便地使用OpenGL及其应用软件来建立自己的三维图形世界。三、题目要求a) 题目要求 对长方体,建立一个点光源,采用环境光和点光源漫反射光的光照模型,应用FLAT明暗处理方法,显示平行投影后的长方体光照效果。b) 任务分析本题目主要包括五个任务,1)长方体表面模型的建立 2)长方体的可见面判断 3)可见面的背光性判断4)可见面光照计算5)

5、可见面光照效果显示。其中,任务1)中,定义三维齐次坐标结构和面的结构;定义顶点表和面表,对长方体绕X轴旋转和绕Y轴旋转。任务2)中对每一个面计算其外法向量及可见性任务3)中对每个可见面计算其光线向量,并判断其是否为背光面。任务4)计算每个见光面的环境光和点光源的漫反射分量。任务5)用该面的光强显示该可见面四、数据可视化流程用户感知社会自然现象数据采集数据处理变换可视化映射可视化流程概念图五、算法流程图六、核心算法描述(1) 判断长方体六个面的可见性首先计算每个面的外法向量N,视线方向为预先给定的方向eye,两个向量进行点积即可判断可见性;若点积结果>0,即cos>0,则此面可见;点

6、积结果<0,即cos<0,则此面不可见;若点积结果=0,即cos=0,则外法向量与视线方向垂直,长方形退化为一条直线。(2) 判断长方体六个面的向光性先取每个面的中心点(对角线的中点)与点光源做差,得到的方向为照射此面的光线方向,根据光线方向与外法向量的点积判断每个面的向光性;若点积结果>=0,即cos>=0,则此面为向光面;点积结果<0,即cos<0,则此面为背光面;(3) 环境光与漫反射光的颜色分量的叠加照射到每个面的光照强度根据cos的不同而不同,因此,在计算向光性的时候将cos的值计算出,并保存在数组中,然后根据公式计算出每个面的总光照强度,同时也计

7、算出RGB模型的三个颜色分量,以便图形的显示。(4) 平行投影与窗视变换平行投影:将三维的图形平行投影到XOY平面上。窗视变换:假定把窗口内的一点变换为视区中的一点根据公式 和 进行窗口视区变换,图形在视区中显示(5) 图形的显示调用BeginPath()和EndPath()函数标记填充路径,并调用FillPath()选用当前画刷分别填充向光面(因每个面选用的画刷的颜色分量不同,而分别显示每个面的光照效果);背光面不进行填充。七、算法步骤: 定义结构和变量 定义三维齐次坐标结构和面结构;定义凸多面体表面模型,顶点表为顶点结构数组,面表为面结构数组,定义光照颜色分量结构,定义环境光模型与漫反射模

8、型; 变量初始化 在视图类构造函数中给顶点表赋值;给面表赋值(注意顶点序列顺序); 分别对凸多面体绕X轴旋转和绕Y轴旋转。 设置环境光光强,反射系数,点光源光强,点光源漫反射系数 计算各面的可见性由相邻两条边的叉积计算面的外法向量,由外法向量与视线方向的点积判断面的可见性,若该面可见,继续进行下面步骤,否则该面结束。 计算每个面的中心点,即各顶点求平均;计算入射光方向,即点光源坐标-面的中心点;计算入射光线与外法向量的夹角,若大于等于90度,则点光源无法直接照射到该中心点,即该面的点光源漫反射分量为0;否则根据入射光线与法向量夹角计算该面的点光源漫反射分量;该面的光强为环境光强分量与点光源漫反

9、射分量之和。 对该面的四个顶点作投影平面为XOY平面的平行投影。 对该面的四个顶点作窗口-视区变换。 用该面的光强显示其投影后的多变形区域八、程序代码:(1) 定义的结构体 /定义三维齐次坐标结构typedef struct tagHOMOCOORD float x; float y; float z; float w;HOMOCOORD;/定义面的结构typedef struct tagPLANEint v0, v1, v2, v3;bool bvisible;bool HeadLight;PLANE;/定义点的结构,需要浮点数的x,ytypedef struct tagMYPOINTflo

10、at x,y;MYPOINT;/定义颜色分量结构,需要的浮点数red,green,bluetypedef struct tagCOLORfloat red,green,blue;LCOLOR;/定义环境光模型与漫反射模型,需要变量为光强和反射系数,I_a表示环境光的光强,I_p表示漫反射光的光强;K_a表示环境光的反射系数,K_d表示漫反射光的反射系数typedef struct tagINTENSEfloat I_a,I_p;LCOLOR K_a,K_d,I;LINTENSE;(2) Draw3Dview的源代码/ Draw3DView.cpp : implementation of the

11、 CDraw3DView class#include "stdafx.h"#include "Draw3D.h"#include "Draw3DDoc.h"#include "Draw3DView.h"#include "math.h"#define ROUND(a) int(a+0.5)/四舍五入#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CDraw3DView

12、IMPLEMENT_DYNCREATE(CDraw3DView, CView)BEGIN_MESSAGE_MAP(CDraw3DView, CView)/AFX_MSG_MAP(CDraw3DView)/ NOTE - the ClassWizard will add and remove mapping macros here./ DO NOT EDIT what you see in these blocks of generated code!/AFX_MSG_MAP/ Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView:O

13、nFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MAP()/ CDraw3DView construction/destructionCDraw3DView:CDraw3DView()/ TODO: add construction code hereCDraw3DView:CDraw3DView()BOOL CDraw3DView:PreCreateWindow(CREATES

14、TRUCT& cs)/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn CView:PreCreateWindow(cs);/ CDraw3DView drawingvoid CDraw3DView:OnDraw(CDC* pDC)CDraw3DDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereDrawMy3DGraphics(); /绘图函数

15、/ CDraw3DView printingBOOL CDraw3DView:OnPreparePrinting(CPrintInfo* pInfo)/ default preparationreturn DoPreparePrinting(pInfo);void CDraw3DView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add extra initialization before printingvoid CDraw3DView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo

16、* /*pInfo*/)/ TODO: add cleanup after printing/ CDraw3DView diagnostics#ifdef _DEBUGvoid CDraw3DView:AssertValid() constCView:AssertValid();void CDraw3DView:Dump(CDumpContext& dc) constCView:Dump(dc);CDraw3DDoc* CDraw3DView:GetDocument() / non-debug version is inlineASSERT(m_pDocument->IsKind

17、Of(RUNTIME_CLASS(CDraw3DDoc);return (CDraw3DDoc*)m_pDocument;#endif /_DEBUG/ CDraw3DView message handlersvoid CDraw3DView:DrawMy3DGraphics()int i;/形体定义ptn=8;pts=new HOMOCOORDptn;/设置长方体pts0.x=1; pts0.y=2; pts0.z=1; pts0.w=1;pts1.x=-1; pts1.y=2; pts1.z=1; pts1.w=1;pts2.x=-1; pts2.y=-2; pts2.z=1; pts2.

18、w=1;pts3.x=1; pts3.y=-2; pts3.z=1; pts3.w=1;pts4.x=1; pts4.y=2; pts4.z=-1; pts4.w=1;pts5.x=-1; pts5.y=2; pts5.z=-1; pts5.w=1;pts6.x=-1; pts6.y=-2; pts6.z=-1; pts6.w=1;pts7.x=1; pts7.y=-2; pts7.z=-1; pts7.w=1;/给定义面的指针分配内存;fn=6;faces=new PLANEfn;/设置立方体各面faces0.v0=0; faces0.v1=1; faces0.v2=2; faces0.v3

19、=3; faces1.v0=4; faces1.v1=5; faces1.v2=1; faces1.v3=0; faces2.v0=5; faces2.v1=6; faces2.v2=2; faces2.v3=1; faces3.v0=6; faces3.v1=7; faces3.v2=3; faces3.v3=2; faces4.v0=7; faces4.v1=4; faces4.v2=0; faces4.v3=3; faces5.v0=7; faces5.v1=6; faces5.v2=5; faces5.v3=4; pts2D=new MYPOINTptn;RotateX(30); /绕

20、X轴逆时针旋转30度 RotateY(30); /绕Y轴逆时针旋转30度 /外法向量/N为外法向量,eye为视线方向,light表示点光源位置;u1和u2分别是中间量HOMOCOORD *N,eye,*u1,*u2,light;/L_tensep为点光源强度,L_tense为镜面反射光照强度,ADD_tense为叠加后的光照强度LINTENSE *L_tensep,L_tense,*ADD_tense;L_tensep = new LINTENSEfn;ADD_tense=new LINTENSEfn;float cos_theta6; /cos_theta为入射光线与外法向量的夹角N=new

21、 HOMOCOORDfn;u1=new HOMOCOORDfn;u2=new HOMOCOORDfn;eye.x=0;eye.y=0;eye.z=1;light.x=1;light.y=1;light.z=100;/判断每个面的可见性,并标记 for(i=0;i<fn;i+) u1i.x=ptsfacesi.v1.x-ptsfacesi.v0.x; u1i.y=ptsfacesi.v1.y-ptsfacesi.v0.y; u1i.z=ptsfacesi.v1.z-ptsfacesi.v0.z; u2i.x=ptsfacesi.v2.x-ptsfacesi.v1.x; u2i.y=ptsf

22、acesi.v2.y-ptsfacesi.v1.y; u2i.z=ptsfacesi.v2.z-ptsfacesi.v1.z; Ni.x=u1i.y*u2i.z-u2i.y*u1i.z; Ni.y=u1i.z*u2i.x-u1i.x*u2i.z; Ni.z=u1i.x*u2i.y-u1i.y*u2i.x; if(Ni.x*eye.x+Ni.y*eye.y+Ni.z*eye.z > 0)facesi.bvisible=1; else facesi.bvisible=0;/判断每个面的向光性,见光面为1,背光面为0 for(i=0;i<fn;i+) u1i.x=(ptsfacesi.v

23、0.x+ptsfacesi.v2.x)/2; u1i.y=(ptsfacesi.v0.y+ptsfacesi.v2.y)/2; u1i.z=(ptsfacesi.v0.z+ptsfacesi.v2.z)/2; u2i.x=light.x-u1i.x; u2i.y=light.y-u1i.y; u2i.z=light.z-u1i.z; cos_thetai=(Ni.x*u2i.x+Ni.y*u2i.y+Ni.z*u2i.z)/(sqrt(Ni.x*Ni.x+Ni.y*Ni.y+Ni.z*Ni.z)*sqrt(u2i.x*u2i.x+u2i.y*u2i.y+u2i.z*u2i.z);/计算总的入射

24、光强与外法向量的夹角的余弦值 if(cos_thetai > 0) /判断面的向光性 facesi.HeadLight=1; L_tensepi.I_p=1; else facesi.HeadLight=0; L_tensepi.I_p=0; cos_thetai=0; /初始化已知数据,材质为金的环境光反射率和漫反射光反射率的RGB分量值L_tense.K_a.red=0.247; L_tense.K_d.red=0.752; L_tense.K_a.blue=0.075; L_tense.K_d.blue=0.226; L_tense.K_a.green=0.200; L_tense

25、.K_d.green=0.606; L_tense.I_a=1; /计算叠加后的光照强度的RGB分量for(i=0;i<fn;i+)ADD_tensei.I.red=L_tense.I_a*L_tense.K_a.red+L_tensepi.I_p*L_tense.K_d.red*cos_thetai;ADD_tensei.I.red=ADD_tensei.I.red>1?1:ADD_tensei.I.red; ADD_tensei.I.green=L_tense.I_a*L_tense.K_a.green+L_tensepi.I_p*L_tense.K_d.green*cos_t

26、hetai;ADD_tensei.I.green=ADD_tensei.I.green>1?1:ADD_tensei.I.green; ADD_tensei.I.blue=L_tense.I_a*L_tense.K_a.blue+L_tensepi.I_p*L_tense.K_d.blue*cos_thetai;ADD_tensei.I.blue=ADD_tensei.I.blue>1?1:ADD_tensei.I.blue; /平行投影变换for(i=0;i<ptn;i+)pts2Di.x=ptsi.x;pts2Di.y=ptsi.y;/窗口-视区变换实现过程float w

27、xl=-3,wxr=3,wyb=-3,wyt=3;int vxl=0,vxr=500,vyb=0,vyt=400; / 窗口-视区变换 float a=(vxr-vxl)/(wxr-wxl); float b=vxl-wxl*a; float c=(vyt-vyb)/(wyt-wyb); float d=vyb-wyb*c; for(i=0;i<ptn;i+) pts2Di.x=a*pts2Di.x+b;pts2Di.y=c*pts2Di.y+d; /图形显示CClientDC dc(this); CBrush NewBrush,*pOldBrush;for(i=0;i<fn;i+)dc.BeginPath();NewBrush.CreateSolidBrush(RGB(ROUN

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论