计算机图形学课程设计
计算机图形学教案

计算机图形学教案一、课程简介计算机图形学是一门涉及计算机图形、图像处理和计算机视觉等领域的重要课程。
本课程将介绍计算机图形学的基本概念、原理和应用,帮助学生掌握计算机图形学的基础知识,并提升他们在图形学领域的技能。
二、课程结构1. 计算机图形学基础- 介绍计算机图形学的历史发展和基本概念- 讨论计算机图形学的应用领域和未来发展趋势- 熟悉图像处理、图形学渲染和动画等基本技术2. 图形系统建模- 学习三维图形对象的建模和表示方法- 掌握光栅化和矢量化图形处理技术- 讨论图形系统的设计和实现3. 计算机视觉- 理解视觉系统的基本原理和功能- 学习计算机视觉的算法和应用- 探讨计算机视觉在人工智能领域的应用4. 图形学编程实践- 深入学习图形学编程语言和库- 完成实际项目,提升图形学编程能力- 探索图形学在多领域的应用案例三、教学目标1. 帮助学生全面了解计算机图形学的基本知识和技术2. 培养学生分析和解决计算机图形学问题的能力3. 提升学生在图形学领域的实际操作和应用能力4. 激发学生对计算机图形学研究的兴趣和热情四、教学方法1. 理论讲解:通过课堂讲解、案例分析等方式,向学生介绍计算机图形学的基本概念和原理2. 实践操作:组织学生参与实验、项目等实际操作,巩固理论知识并提升实践能力3. 课堂互动:鼓励学生提问、讨论,促进师生间的互动和交流4. 作业考核:布置不同形式的作业,检测学生对知识的掌握情况,促进学习效果的提升五、教材参考1. 《计算机图形学导论》2. 《OpenGL图形与游戏开发实践》3. 《计算机视觉:算法与应用》4. 《经典图形学算法实例详解》六、学习评价1. 课堂表现:出勤情况、课堂参与度等2. 作业考核:课后作业、实验报告等3. 期末考核:闭卷考试、项目实践等4. 综合评价:综合考虑以上因素,对学生进行综合评定七、总结计算机图形学作为一门新兴的学科,正逐渐成为信息技术领域的热门专业之一。
计算机图形学课程设计

计算机图形学课程设计一、课程目标知识目标:1. 让学生掌握计算机图形学的基本概念、基本原理和基本算法,如二维图形的表示、变换、裁剪和三维图形的建模、光照模型等。
2. 使学生了解计算机图形学在实际应用中的发展现状和前景,如虚拟现实、计算机辅助设计等。
3. 帮助学生建立计算机图形学与相关学科(如数学、物理、艺术等)的联系,提高跨学科素养。
技能目标:1. 培养学生运用计算机图形学知识解决实际问题的能力,如使用相关软件进行二维绘图、三维建模等。
2. 提高学生的编程能力,使其能够使用至少一种计算机图形学编程库(如OpenGL、DirectX等)实现基本图形绘制和动画效果。
3. 培养学生的团队协作能力和沟通表达能力,通过小组项目实践,共同完成具有一定难度的计算机图形学任务。
情感态度价值观目标:1. 激发学生对计算机图形学的兴趣,培养其主动探究、创新实践的精神。
2. 培养学生具有良好的审美观,能够从美学的角度评价和优化计算机生成的图形。
3. 强化学生的版权意识,尊重他人知识产权,遵循学术道德,树立正确的价值观。
本课程针对高中年级学生,结合学科特点和教学要求,将目标分解为具体的学习成果,以便于后续的教学设计和评估。
通过本课程的学习,期望学生能够掌握计算机图形学的基础知识,提高实际操作技能,培养良好的情感态度价值观。
二、教学内容1. 计算机图形学基本概念与历史:介绍计算机图形学的定义、发展历程、应用领域及发展趋势。
- 教材章节:第一章 计算机图形学概述- 内容安排:1课时2. 二维图形的表示与处理:讲解二维图形的数学表示、几何变换、裁剪算法等。
- 教材章节:第二章 二维图形处理- 内容安排:4课时3. 三维图形的建模与渲染:介绍三维图形的建模方法、光照模型、纹理映射等。
- 教材章节:第三章 三维图形处理- 内容安排:5课时4. 计算机动画与视觉效果:探讨计算机动画原理、关键帧动画、粒子系统等视觉效果技术。
- 教材章节:第四章 计算机动画与视觉效果- 内容安排:4课时5. 计算机图形学编程实践:学习计算机图形学编程库(如OpenGL、DirectX 等)的基本使用,完成二维和三维图形绘制实例。
计算机图形学(C语言)教案

计算机图形学(C语言)教案第一章:计算机图形学概述1.1 课程介绍介绍计算机图形学的定义、发展和应用领域。
解释图形和图像的区别。
1.2 图形学基本概念什么是点、线、面和体。
坐标系统和变换。
图形表示方法和存储结构。
1.3 图形处理流程图形输入、输出和显示。
图形裁剪和映射。
图形渲染和着色。
1.4 常见图形算法直线、圆和椭圆的算法。
填充算法和图像处理算法。
第二章:C语言基础2.1 C语言简介介绍C语言的历史和特点。
解释C语言在计算机图形学中的应用。
2.2 基本数据类型和语法整型、浮点型、字符型数据。
变量、常量和运算符。
2.3 控制语句条件语句和循环语句。
分支语句和循环控制语句。
2.4 函数和数组函数的定义和调用。
一维、二维数组和字符串。
第三章:图形库和API3.1 图形库简介什么是图形库和API。
常见的图形库和API介绍。
3.2 图形库的使用方法图形库的安装和配置。
图形库的基本函数和功能。
3.3 图形API的调用过程初始化图形环境。
创建图形对象和操作图形对象。
处理图形事件和关闭图形环境。
3.4 示例:绘制简单的图形使用图形库绘制点、线、圆等基本图形。
调整图形属性和颜色。
第四章:图形绘制和变换4.1 图形绘制基础绘制基本图形和文本。
使用图形属性调整图形外观。
4.2 图形变换坐标变换和几何变换。
矩阵和变换矩阵的运算。
4.3 图形裁剪和映射裁剪原理和算法。
映射原理和算法。
4.4 示例:绘制复杂的图形使用图形变换绘制复杂的图形。
应用图形裁剪和映射技术。
第五章:图形渲染和着色5.1 图形渲染基础什么是图形渲染和着色。
光和材质的模型。
5.2 颜色模型和转换RGB颜色模型和HSV颜色模型。
颜色转换和混合。
5.3 图形着色和光照基本着色算法和纹理映射。
点光源、聚光灯和环境光。
5.4 示例:实现简单的光照效果使用图形着色和光照技术绘制三维图形。
调整光照参数和观察光照效果。
第六章:图形界面设计6.1 图形界面设计基础界面设计原则和概念。
计算机图形学的课程设计

计算机图形学课程设计设计题目:画三次Bezier曲线和三次B样条曲线班级:姓名:学号:一、总体目标和要求1 课程设计目的本课程主要内容包括计算机图形学的研究内容、发展与应用,图形输入输出设备,图形显示原理,图形软件标准,基本图形生成算法,图形几何变换与裁剪,自由曲线和曲面,三维实体造型,分形几何造型,分形艺术,隐藏面消除,光照模型,颜色模型,光线跟踪,纹理细节模拟,常用的计算机动画技术和软件等。
通过本课程设计,使自己了解计算机图形学的有关原理、算法及系统,掌握基本图形显示程序设计方法,及二维和三维图形变换程序设计方法,为进一步学习计算机辅助设计方面的技术知识打下基础。
2 目标以图形学算法为目标,深入研究。
续而策划设计实现一个能够表现计算机图形学算法原理的或完整过程的演示系统,并能从某些方面做出评价和改进意见。
通过完成一个完整程序,经历策划、设计、开发、总结。
达到:(1)巩固和实践计算机图形学课程中的理论和算法;(2)学习表现计算机图形学算法的技巧;(3)培养认真学习积极探索的精神。
3总体要求策划、设计并实现一个能够充分表现图形学算法的系统,界面要求美观大方,能清楚地演示算法执行的每一个步骤。
二、内容与要求1设计题目画三次Bezier曲线和三次B样条曲线。
2设计要求利用计算机图形学原理画出三次Bezier曲线和三次B样条曲线。
三、算法描述(1)画三次Bezier曲线根据Q(t)=∑P i•B• C i n t i(1-t)n-i(∑中的n=3)并且 C i nBEZ 0,3BEZ 1,3(u)=3u(1-u)(1-u)BEZ2,3(u)=3uu(1-u)BEZ3,3(u)=3uuu三次Bezier函数可以写成P(u)=[u3 u2 u 1]×M×[a b c d] 其中M=[ -1 3 -3 1 ]3 -6 -3 0-3 3 0 01 0 0 0i=0(2)画三次B样条曲线Q i,3(t)=∑P i+l F l,3(t)= P i F0,3(t)+ P i+1 F1,3(t)+ P i+2 F2,3(t)+ P i+ 3 F3,3(t)(其中∑中的n=3)因为四个调和函数F0,3(t)、F1,3(t)、F2,3(t)和F3,3(t) 已知(参看公式7-5-3)因此只要给出四个控制点的位置矢量的坐标,当t在[0,1]范围内取离散地取100个点时(dt=0.01),分别求出每一个曲线上点,相邻点用直线段连接起来,就可以得到相应的B样条曲线。
计算机图形学课程设计

《计算机图形学》课程设计报告学院:专业:班级:姓名:学号:指导教师:年11 月15 日一、课程设计报告内容说明:1 、直线:1.1 点生成直线利用for 循环,用pDC->SetPixel(int x,int y,RGB(a,b,c))像素函数画出直线。
1.2 DDA :根据直线的微分方程来产生直线,即dy/dx=△y/△x=(12y y -)/(12x x -)=k其中(1x ,1y )、(2x ,2y )是直线的两个端点坐标。
DDA 算法的原理是增量法,即使x 和y 同时以很小的步长增长,每次增长量与x 和y 的一阶导数成正比。
直线的一阶导数是与△x 和△y 成正比的函数。
可以将x 和y 各递增ε△x 和ε△y 来产生线,ε是很小的量。
从当前画线任意点的位置(i x ,i y )上分别递增两个增量ε△x 和ε△y ,就可以得到直线增长的下一个(1+i x ,1+i y )的坐标位置公式如下1+i x =ix +ε△x1+i y =i y +ε△y1.3 金刚石将圆分为20份,利用直线生成的MoveTo 和LineTo 函数,使每个点与其他点相连。
展示图形为:点生成直线、数值微分法画直线、金刚石 2、曲线2.1 直角坐标系:写出参数表达式后,利用MoveTo 和LineTo 函数,连接各点。
如:正弦曲线:参数方程如下 x_SIN=1000*t; y_SIN=1000*sin(t);极坐标系:写出参数表达式后,利用MoveTo 和LineTo 函数,连接各点。
如:四叶图:参数方程如下r_SIYE=5000*sin(2*t); x_SIYE=r_SIYE*cos(t); y_SIYE=r_SIYE*sin(t);2.2 以实际工作中应用较多的参数样条曲线为例:参数样条曲线定义:给定n+1个控制点Pi (i =0,1,2,…,n ),n 次B 样条曲线段的参数表达式为: 。
依次用线段连接控制点Pi (i =0,1,2,…,n )组成的多边形称为B 样条曲线控制多边形。
计算机图形学-期末课程设计

图形学课程设计报告题目:系别:班级:学号:姓名:指导老师:目录诚信说明......................................................................................................... 错误!未定义书签。
目录 .. (1)一、项目描述 (2)1.1项目的目的 (2)二、项目需求 (2)2.1需求分析 (2)2.2功能描述 (2)三、项目设计 (3)3.1直线扫描算法 (3)3.1.1 DAA扫描线算法 (3)3.1.2 中点扫描线算法 (3)3.1.3 Bresenham扫描线算法 (3)3.2圆的扫描算法 (4)3.2.1 中点画圆扫描算法 (4)3.2.2 Bresenham画圆扫描算法 (4)3.3种子填充算法 (4)3.4图形的基本几何变换算法 (4)3.4.1平移 (4)3.4.2旋转 (5)3.4.3伸缩 (5)3.5 Bezier曲线算法 (5)四、项目效果 (5)五、项目总结 (10)六、参考文献 (11)七、附录 (11)一、项目描述1.1项目的目的通过本次课程设计,使自己了解计算机图形学的有关原理、算法及系统,掌握基本图形显示程序设计方法,及二维和三维图形基本几何变换程序设计方法,为进一步学习计算机辅助设计方面的技术知识打下基础。
1.掌握图形学直线扫描算法:DDA,中点扫描线算法,Bresenham扫描线算法2.掌握图形学画圆扫描算法:中点画圆算法和Bresenham扫描算法3.掌握简单的几何图形的填充算法:种子填充和扫描线填充算法4.掌握简单图形的基本几何变换:平移,旋转和伸缩5.掌握Bezier曲线的生成算法6.熟悉并掌握vc6.0中的MFC使用方法7.掌握C/C++语言编程方法8.在学习基础上设计一个基于MFC的画图软件1.2项目内容在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的画图设计工具也越来越多,类似CAD和CDM及Photoshop的画图软件和图片处理软件的发展也日新月异,因此产生了制作一个类似的画图软件;而且通过制作该程序还能更好的学习图形学编程知识。
计算机图形学课程设计

皮球运动动画一、设计方案圆皮球从某竖直高度以横向速度抛出,落地,弹起,最终静止。
设弹起后所能上升的高度为上一次最大高度的4/5,实现运动轨迹动画。
整个设计包括两个方面,一是掌握动画的基本原理,二是圆的绘制。
动画是将静止的画面变为动态的艺术。
实现由静止到动态,主要是靠人眼的视觉残留效应。
利用人的这种视觉生理特性可制作出具有高度想象力和表现力的动画影片。
动画中的皮球要用到中点画圆算法画圆,void MidCircle(int x0, int y0, int r)定义圆心的坐标和圆半径,用mLight.Ir, mLight.Ig, mLight.Ib来定义圆的颜色,glClearColor定义显示框的背景颜色,int cx=100,cy=300,cr=20定义圆开始运动时的水平位置,垂直高度和体积大小,glClearColor定义显示框的背景颜色,int windowswidth = 1000,windowshight = 500定义显示框的宽度和高度。
void Init()用来初始化,void myDisplay()用来显示,glLoadIdentity()为加载身份,void RenderScene(void)为渲染现场,void TimerFunction(int value)为计时器功能。
二、程序流程图floatmo;VectorN;theta<0alpha=H.fx*N.fx+H.fy*N.fy+H.fx*N.fz;alpha<0intx,y,deltax,deltay,d;x<yglEnd();d<0glVertex2i(x+x0,y+y0);NOd+=deltax; intx,y,deltax,deltay,d; i=-xi<=xi++i=-yi<=yi++mColor=Phong(x0,y0,r,i+x0,y +y0); WHILEmColor=Phong(x0,y0,r,i+x0,x +y0);glClear(GL_COLOR_BUFFE R_BIT);glViewport(0,0,(GLsizei)w,(G Lsizei)h);glClear(GL_COLOR_BUFFE R_BIT); floatt=0,vv,s,hv;h>1cy-cr>0&&cx+cr<windowswi flag==1Multit=sqrt(2*h/g);YESflag=1;glutInit(&argc,argv); return0;三、程序清单#include <GL/glut.h>#include <stdio.h>#include <stdlib.h>#include <math.h>#define NO_LIGHT 1#define LIGHT 2bool bLight = false;struct Vector{float fx, fy, fz;};struct Color{float Ir, Ig, Ib;/*定义皮球的颜色*/};float KaIa;float Kd, n;Vector H,light;Color mLight, mColor;int cx=100,cy=300,cr=20;/*定义皮球开始运动时的水平位置,下落高度和体积大小*/int windowswidth = 1000,windowshight = 500;/*定义显示框的宽度和高度*/int xstep=0,ystep=0,flag=10,up=0;float vh =4,g=9.8,h=cy;void Init(){float mo;Vector eye;mLight.Ir = 200;mLight.Ig =20;mLight.Ib =200;/*定义皮球的颜色*/KaIa=100;Kd = 0.7;n = 20;light.fx=0.10;light.fy=0.50;light.fz = sqrt(1-(light.fx*light.fx)-(light.fy*light.fy));eye.fx=1;eye.fy=0;eye.fz=1;H.fx=light.fx+eye.fx;H.fy=light.fy+eye.fy;H.fz=light.fz+eye.fz;mo=sqrt(H.fx*H.fx+H.fy*H.fy+H.fz*H.fz);H.fx=(H.fx/mo);H.fy=(H.fy/mo);H.fz=(H.fz/mo);H.fx=(H.fx/mo);H.fy=(H.fy/mo);H.fz=(H.fz/mo);glClearColor(1.0, 1.0, 1.0, 0.0);glShadeModel(GL_SMOOTH);}Color Phong(int x0, int y0, int r, int x, int y){Vector N;float z,alpha,theta,Ks;Ks=1.0-Kd;z=sqrt((float)(r*r-(x-x0)*(x-x0)-(y-y0)*(y-y0)));N.fx=(x-x0)*1.0/r;N.fy=(y-y0)*1.0/r;N.fz = z*1.0/r;theta = N.fx * light.fx + N.fy * light.fy + N.fz * light.fz;if(theta<0)theta=0;alpha=H.fx*N.fx+H.fy*N.fy+H.fx*N.fz;if(alpha<0)alpha=0;mColor.Ir=KaIa+mLight.Ir*Kd*theta+mLight.Ir*Ks*pow(alpha,n);mColor.Ig=KaIa+mLight.Ig*Kd*theta+mLight.Ig*Ks*pow(alpha,n);mColor.Ib=KaIa+mLight.Ib*Kd*theta+mLight.Ib*Ks*pow(alpha,n);return mColor;}void MidCircle(int x0, int y0, int r) /*中点画圆算法定义圆的圆心坐标和半径*/ {int x,y,deltax,deltay,d;x = 0;y = r;deltax = 5;deltay = 5-r-r;d = 1-r;glColor3f (1.0f, 1.0f, 1.0f); glBegin(GL_POINTS); glVertex2i (x+x0,y+y0); glVertex2i (-x+x0,y+y0); glVertex2i (-x+x0,-y+y0); glVertex2i (x+x0,-y+y0); glVertex2i (y+y0, x+x0); glVertex2i (y+y0, -x+x0); glVertex2i (-y+y0, -x+x0); glVertex2i (-y+y0, x+x0);while(x<y){if(d<0){d += deltax;deltax += 2;deltay += 2;x++;}else{d += deltay;deltax += 2;deltay += 4;x++;y--;}glVertex2i (x+x0,y+y0);glVertex2i (-x+x0,y+y0);glVertex2i (-x+x0,-y+y0);glVertex2i (x+x0,-y+y0);glVertex2i (y+y0, x+x0);glVertex2i (y+y0, -x+x0);glVertex2i (-y+y0, -x+x0);glVertex2i (-y+y0, x+x0);}glEnd();}void MidCircleLight(int x0, int y0, int r) {int x,y,deltax,deltay,d;x = 0;y = r;deltax = 3;deltay = 5-r-r;d = 1-r;int i=0;glBegin(GL_POINTS);{for( i=-x;i<=x;i++){mColor=Phong(x0,y0,r,i+x0,y+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);glVertex2i (i+x0,y+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);glVertex2i (i+x0,-y+y0);}for(i=-y;i<=y;i++){mColor=Phong(x0,y0,r,i+x0,x+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);glVertex2i (i+x0,x+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);glVertex2i (i+x0,-x+y0);}while(x<y){if(d<0){d += deltax;deltax += 2;deltay += 2;x++;}else{d += deltay;deltax += 2;deltay += 4;x++;y--;}for(i=-x;i<=x;i++){mColor=Phong(x0,y0,r,i+x0,y+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);glVertex2i (i+x0,y+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);glVertex2i (i+x0,-y+y0);}for(i=-y;i<=y;i++){mColor=Phong(x0,y0,r,i+x0,x+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);glVertex2i (i+x0,x+y0);glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);glVertex2i (i+x0,-x+y0);}}}glEnd();}void myDisplay() /*用此函数来显示*/{glClear(GL_COLOR_BUFFER_BIT);glColor3f (0.0f, 0.0f, 1.0f);MidCircleLight(cx, cy, cr);glFlush();}void Reshape(int w, int h) /*加载身份*/{glViewport(0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);}void RenderScene(void) /*渲染现场*/{glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f, 0.0f, 0.0f);/*清空命令缓冲区并交换帧缓存*/glutSwapBuffers();}void TimerFunction(int value) /*定义计时器功能*/ {/*处理到达窗口边界的球形,使之反弹*/float t=0,vv,s,hv;if (h>1){if(cy-cr>0 && cx+cr<windowswidth && up == 0) {t =sqrt(2*h/g);vv = g*t/5;/*hv = 0.5*g*g*t;s= vh*t;*/cx += vh;cy -= vv;}else if(cy-cr<=0){flag = 1;up =1 ;}if(flag == 1){h=4.0/5.0*h;flag = 0 ;}printf("%d,%d,%d,%d\n",up,flag,h,cy-cr);if(cy-cr<=h && up == 1){t = sqrt(2*h/g);vv = sqrt(2*g*h)/8;/*hv= vv*t - 0.5*g*t*t;s = vh *t;*/cy +=vv;cx +=vh;}else if(cy-cr>=h){up = 0 ;}/*用新坐标重新绘图*/glutPostRedisplay();glutDisplayFunc(myDisplay);glutTimerFunc(33,TimerFunction, 1);}}int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(windowswidth,windowshight );glutCreateWindow("Ball bouncing");Init();glutDisplayFunc(RenderScene);glutTimerFunc(33, TimerFunction, 1);glutReshapeFunc(Reshape);glutMainLoop();return 0;}四、程序运行结果及分析效果图1效果图2效果图3效果图4皮球从某一高度处水平抛出,落地后立即弹起,弹起的最大高度为上一次高度的4/5。
计算机图形学课程设计报告

课程设计报告书设计名称:计算机图形学课程设计题目:画图程序的实现学生姓名:专业:计算机科学与技术(网络技术)班别:学号:指导老师:绘图小工具此绘图工具可以画直线、椭圆、矩形、曲线,可动态改变画笔的大小,画笔风格有连笔、单笔、填充颜色、实线、虚线1、虚线2,可根据需要选择其中一种,另外,还以根据需要调出颜色板定义颜色。
为了方便选择颜色进行绘图,特意在绘图区增加了颜料盒,操作将更加方便快捷。
1.总体界面如下:1.1“绘图”菜单界面1.2“画笔大小”菜单1.3“风格”菜单1.4“调色板”菜单及颜料盒2.各功能的实现及代码2.1首先在StdAfx.h头文件中定义全局变量extern int num; //记住“绘图”菜单选择extern int num2; //颜色填充选择extern int width; //记住“画笔大小”选择extern int fengge; //“风格”选择(连笔/单笔)extern int col,penstyle; //记住“颜料盒”与“调色板”的选择及画笔风格extern COLORREF c;//各种颜色的选择再在在StdAfx.cpp中初始化以上定义的各变量int num,num2=1,width,col=0,fengge=10,penstyle=0;COLORREF c;2.2.在Draw1View.h中定义CDDraw1View类私有变量POINT points[20];int m_Num;POINT m_pPrev; //画图的前一个终点POINT m_pOrigin; //画图起点POINT m_pPrev2;POINT m_pOrigin2; //记录获取颜料盒颜色时鼠标所在坐标int m_Drag; //鼠标状态HCURSOR m_HCursor;2.3.画图时以按下鼠标左键记住作图起点,为鼠标左键添加消息映射,函数如下:void CDraw1View::OnLButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultCClientDC dc(this);OnPrepareDC(&dc);dc.DPtoLP(&point);m_pPrev=point; //画图的前一个终点m_pOrigin=point; //点击鼠标左键作为拖动绘图的第一点m_Drag=1; //设置鼠标为拖动状态CView::OnLButtonDown(nFlags, point);}2.4.鼠标左键按下时已将其状态设为拖动状态,当鼠标移动时可以作画,为鼠标移动添加消息映射,函数如下:void CDraw1View::OnMouseMove(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultCClientDC dc(this);OnPrepareDC(&dc);dc.DPtoLP(&point);CBrush MyBrush,*OldBrush;if(m_Drag)//鼠标左键按下时已经将状态设为真{CPen NewPen,*pOldPen;if(col= =0) //选择颜料盒颜色c=dc.GetPixel(m_pOrigin2.x,m_pOrigin2.y);NewPen.CreatePen(penstyle,width,c);pOldPen=dc.SelectObject(&NewPen);if(num2= =0) //选择为图像填充颜色时,num2=0.{MyBrush.CreateSolidBrush(c);OldBrush=dc.SelectObject(&MyBrush);}dc.SetROP2(fengge);//风格(单笔:fengge=10/连笔:fengge=9) switch(num) //选择画直线(num=0)、椭圆(num=1)、矩形(num=2)、曲线(num=3) { case 0: dc.MoveTo(m_pOrigin); dc.LineTo(m_pPrev);dc.MoveTo(m_pOrigin); dc.LineTo(point);break;case 1: dc.Ellipse(m_pOrigin.x,m_pOrigin.y,m_pPrev.x,m_pPrev.y);dc.Ellipse(m_pOrigin.x,m_pOrigin.y,point.x,point.y);break;case 2: dc.Rectangle(m_pOrigin.x,m_pOrigin.y,m_pPrev.x,m_pPrev.y);dc.Rectangle(m_pOrigin.x,m_pOrigin.y,point.x,point.y);break;case 3: if(penstyle= =0) //选择画实曲线时(penstyle=0){dc.MoveTo(m_pOrigin);dc.LineTo(point);m_pOrigin=point;}else dc.SetPixel(point.x,point.y,c); //选择画虚曲线}m_pPrev=point; //把新的点设为所作图形的前一个终点dc.SelectObject(pOldPen);}CView::OnMouseMove(nFlags, point);}2.5.当作完画松开鼠标左键时要将鼠标状态设置为非拖动状态以停止作画,为鼠标左键松开添加消息映射,函数如下:void CDraw1View::OnLButtonUp(UINT nFlags, CPoint point){m_Drag=0;//设置为非拖动状态CView::OnLButtonUp(nFlags, point);2.6.当按下鼠标右键时记录此时鼠标的坐标以获取该像素点的颜色,为鼠标右键按下添加消息映射,函数如下:void CDraw1View::OnRButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultCClientDC dc(this);dc.DPtoLP(&point);m_pOrigin2=point;//点击鼠标右键获取此时鼠标所在位置的颜色col=0; //col=0时,所选颜色为颜料盒颜色,col=1时为调色板颜色CView::OnRButtonDown(nFlags, point);}2.7.当需要清除所画图形时,双击鼠标右键,为双击鼠标右键添加消息映射,函数如下:void CDraw1View::OnRButtonDblClk(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultCDraw1Doc *pDoc=GetDocument();pDoc->UpdateAllViews(NULL);CView::OnRButtonDblClk(nFlags, point);}2.8.颜料盒代码,先画矩形后填充各种不同的颜色,函数如下:void CDraw1View::OnDraw(CDC* pDC){CDraw1Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);int j=0;CBrush MyBrush,*OldBrush;MyBrush.CreateSolidBrush(RGB(205,203,203));OldBrush=pDC->SelectObject(&MyBrush);pDC->Rectangle(0,0,200,40);MyBrush.DeleteObject();for(int i=0;i<=160;){ if(j==0){ MyBrush.CreateSolidBrush(RGB(255,0,0));OldBrush=pDC->SelectObject(&MyBrush);}else if(j==10){ MyBrush.CreateSolidBrush(RGB(0,255,0));OldBrush=pDC->SelectObject(&MyBrush);}else if(j==20){ MyBrush.CreateSolidBrush(RGB(53,121,248));OldBrush=pDC->SelectObject(&MyBrush);}else if(j==30){ MyBrush.CreateSolidBrush(RGB(250,0,250));OldBrush=pDC->SelectObject(&MyBrush);}else if(j==40){ MyBrush.CreateSolidBrush(RGB(151,53,227));OldBrush=pDC->SelectObject(&MyBrush);}else if(j==50){ MyBrush.CreateSolidBrush(RGB(223,225,14));OldBrush=pDC->SelectObject(&MyBrush);}else if(j==60){ MyBrush.CreateSolidBrush(RGB(251,242,4));OldBrush=pDC->SelectObject(&MyBrush);}else if(j==70){ MyBrush.CreateSolidBrush(RGB(3,3,3));OldBrush=pDC->SelectObject(&MyBrush);}else if(j==80){ MyBrush.CreateSolidBrush(RGB(250,250,250));OldBrush=pDC->SelectObject(&MyBrush);}pDC->Rectangle(10+i,10,30+i,30);i+=20;j+=10;MyBrush.DeleteObject();}}2.9.修改画笔大小时,函数如下:void CPenWidth::OnOK(){UpdateData();CPenWidth penwidth; // CPenWidth为对话框类width=m_penwidth;CDialog::OnOK();}3.效果展示:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《计算机图形学》实验报告题目: 3D真实感场景绘制姓名: 郭继杰学号: 2014214168班级: 地信141学院: 理学院指导老师: 解山娟日期: 2017年1月1日一、实验目的结合一学期所学计算机图形学知识,基于专业背景,使用OpenGL绘制简单的3D真实感图形场景。
二、实验要求应用光栅化算法、多边形裁剪计算以及消隐算法在场景绘制中,其中真实感场景绘制包括颜色模型、纹理模型、雾化模型、运动模型以及环境光、漫反射、镜面反射等光照模型设置。
三、实验小组及任务分工小组成员任务分工金城纹理贴图,颜色模型,雾化模型郭继杰运动模型,光照模型沈黎达材料收集,代码整合四、实验内容1、实验前期工作前期工作经过小组成员充分讨论,资料收集,最终确定小组实验模板为以下两幅场景。
目标就是实现一艘简单3D帆船模型以及一辆3D小车模型2、程序编译环境:Visual Studio 20123、光照模型建立过程光照模型建立流程图:3、1设置光照模型相应指数3、2打开光源光照模型设计过程有两点注意的就是:1、glShadeModel函数用于控制opengl中绘制指定两点间其她点颜色的过渡模式,参数一般为GL_SMOOTH、GL_FLAT,如果两点的颜色相同,使用两个参数效果相同,如果两点颜色不同,GL_SMOOTH会出现过渡效果,GL_FLAT 则只就是以指定的某一点的单一色绘制其她所有点。
glShadeModel(GL_FLAT) 着色模式glShadeModel(GL_SMOOTH)着色模式(可以瞧出GL_SMOOTH模式下颜色更加光滑)2、需要使用光照模型时必须启用,glEnable(GL_LIGHTING)(启用灯源)、glEnable(GL_LIGHT0)(启用光源),否则所有灯光效果都会无效。
效果对比如下图所示。
(未启用灯光) (启用灯光)(未启用灯光) (启用灯光)4、颜色模型建立过程1、设定多边形图形:OpenGL利用glBegin()函数画图形样式,里面的参数表示图形样式,这里以glBegin(GL_QUADS)为例,GL_QUADS表示绘制由四个顶点组成的一组单独的四边形。
2、设定颜色:OpenGL利用glColor3f(a,b,c)函数设置图形颜色,里面的参数表示设定颜色的颜色。
3、坐标设定:OpenGL利用glVertex3f(a,b,c)函数设置图形坐标,里面的参数表示坐标的位置。
以跑道颜色模型为例:(未使用颜色模型)(使用颜色模型)5、雾化模型建立过程雾就是生活中比较常见的现象,有了雾化模型,场景会比较逼真。
1、建立过程及参数设定如下:2、其中,设置雾气起始位置与结束位置可以使雾气浓度随运动模型变化。
3、效果对比(未使用雾化) (使用雾化)4、实验存在不足之处,由于本实验的场景绘制不就是特别接近真实感,所以雾化模型的效果不就是很好。
6.运动模型建立过程1、本次实验的运动模型主要由键盘按键响应发生。
2、设定键盘按键响应函数void specialKeyBoard(int key,int x,int y)在主函数入口设定设置当前窗口的特定键的回调函数glutSpecialFunc(specialKeyBoard);glTranslatef(0,0,0、1+delta_v);//表示将当前图形向x轴平移0,向y轴平移0,向z轴平移0、1+delta ,表示物体在这个坐标的时候开始绘制。
glutPostRedisplay();在图像绘制的所有操作之后,要加入 glutPostRedisplay()函数来重绘图像。
实现物体的移动glRotatef(1,0,1,0); //,旋转角度函数,表示小车往(0,1,0)向量方向逆时针旋转1°以上都就是控制小车运动的函数,通过键盘响应来触发。
(向前运动) (旋转)7.纹理贴图过程①载入位图图像:AUX_RGBImageRec *LoadBMP(CHAR *) //载入位图图象{FILE *; //文件句柄if (!) //确保文件名已提供{return NULL; //如果没提供,返回 NULL }(,"r"); //尝试打开文件if (File) //判断文件就是否存在?{fclose(File); //关闭句柄return auxDIBImageLoadA(); //载入位图并返回指针}return NULL; //如果载入失败,返回 NULL}②位图转化成纹理:int LoadGLTextures() //载入位图(调用上面的代码)并转换成纹理{int Status= FALSE; //状态指示器AUX_RGBImageRec *TextureImage[2]; //创建纹理的存储空间memset(TextureImage,0,sizeof(void *)*1);//将指针设为 NULL//载入位图,检查有无错误,如果位图没找到则退出if ((TextureImage[0]=LoadBMP("Data/wenli、bmp"))&&(TextureImage[1]=LoadBMP("Data/wenli2、bmp"))){Status= TRUE; //将Status设为TRUEglGenTextures(2, &texture[0]); //创建纹理for(int loop=0;loop<2;loop++){glBindTexture(GL_TEXTURE_2D,texture[loop]);//绑定纹理glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//设置滤波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[loop]->sizeX,TextureImage[loop]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[loop]->data);//生成纹理}}for (int loop=0; loop<2; loop++){if (TextureImage[loop]!=NULL) //判断纹理就是否存在{if (TextureImage[loop]->data!=NULL) //纹理图像就是否存在{free(TextureImage[loop]->data); //释放纹理图像占用内存}free(TextureImage[loop]); //释放图像结构}}return Status; //返回 Status}③调用纹理glBindTexture(GL_TEXTURE_2D, texture[0]); //选择纹理glBegin(GL_QUADS); //开始绘制四边形glTexCoord2f(1、0f, 0、0f); glVertex3f( 0、0f, 1、5f, 0、0f); // 纹理与四边形的右下glTexCoord2f(1、0f, 1、0f); glVertex3f( 0、0f, 2、5f, 0、0f); // 纹理与四边形的右上glTexCoord2f(0、0f, 1、0f); glVertex3f( 0、0f, 2、5f, 1、0f); // 纹理与四边形的左上glTexCoord2f(0、0f, 0、0f); glVertex3f( 0、0f, 1、5f, 1、0f); // 纹理与四边形的左下glEnd();模型解读(1)创建纹理图像:OpenGL要求纹理的高度与宽度都必须就是2的n次方大小,只有满足这个条件,这个纹理图片才就是有效的。
一旦获取了像素值,我们就可以将这些数据传给OpenGL,让OpenGL生成一个纹理贴图:①glGenTextures(2, &texture[0]):创建纹理对象②glBindTexture(GL_TEXTURE_2D,texture[loop]):绑定纹理对象③glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[loop]->sizeX, TextureImage[loop]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[loop]->data):将Pixels数组中的像素值传给当前绑定的纹理对象,于就是便创建了纹理。
glTexImage函数的参数分别就是纹理的类型,纹理的等级,每个像素的字节数,纹理图像的宽度与高度,边框大小,像素数据的格式,像素值的数据类型,像素数据。
(2)纹理滤镜:在纹理映射的过程中,如果图元的大小不等于纹理的大小,OpenGL便会对纹理进行缩放以适应图元的尺寸。
我们可以通过设置纹理滤镜来决定OpenGL对某个纹理采用的放大、缩小的算法。
调用glTexParameter来设置纹理滤镜。
如:glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//设置放大滤镜glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);//设置缩小滤镜(3)纹理坐标:要使用当前的纹理绘制图元,我们必须在绘制每个顶点之前为该顶点指定纹理坐标。
只需调用glTexCoord2d(s:Double;t:Double);函数即可。
其中,s、t就是对于2D纹理而言的s、t坐标。
对于任何纹理,无论纹理的真正大小如何,其顶端(左上角)的纹理坐标恒为(0,0),右下角的纹理坐标恒为(1,1)。
也就就是说,纹理坐标应就是一个介于0到1之间的一个小数。
纹理贴图前后对比效果见图5。
纹理贴图前纹理贴图后五、成果展示本次实验将两个模型进行改造,实现了一辆简单的小车以及一艘简单的帆船。
(小车模型)(帆船模型)六、心得体会计算机图形学本身就是一门理论与实践都比较复杂的学科,从最开始二维图形的实现,到最后三维真实感场景的实现,都不就是一个简单的过程,好的真实感场景实现需要多个模型的相互融合,在实验设计过程中,难免遇到困难,下面就是本次实验总结出来的感受。
1.glEnable( )启动函数,无论就是构造什么样的模型,都需要由这个函数来启动,如光照模型需要glEnable(GL_LIGHTING),纹理贴图需要glEnable(GL_TEXTURE_2D);没有启动函数的作用,效果都就是不可能就是实现的。