搜档网
当前位置:搜档网 › 计算机图形学课设。双三次Bezier曲面的绘制 2

计算机图形学课设。双三次Bezier曲面的绘制 2

计算机图形学课设。双三次Bezier曲面的绘制 2
计算机图形学课设。双三次Bezier曲面的绘制 2

课程名称:《计算机图形学》

论文题目:双三次Bezier曲面的绘制

教学部:

年级:

班级:

学号:

姓名:

摘 要:本文主要讨论了在VC++中使用OpenGL 绘制Bezier 、NURBS 等典型曲面的一般性方法和OpenGL 的特点及功能,OpenGL 可以与Visual C++紧密接口,便于实现机械手的有关计算和图形算法,可保证算法的正确性和可靠性

关键词:Bezier 曲面;OpenGL ;曲面绘制

一、设计概述

1.设计要求

1)掌握双三次Bezier 曲面定义:

Bezier 曲面与 Bezier 曲线有相同的性质,Bezier 曲面片是由特征多面体的顶点决定的,利用两组正交的 Bezier 曲线逼近由控制点网格描述的曲面。给定(n+1)*(m+1)个点Pjk (i=0,1…n ;j=0,1,...m ),则可以生成一个n*m 次的Bezier 曲面片,其表示形式为

其中Pij 是Bezier 曲面片的特征多面体。当m=n=3时,特征多面体有16个顶点,其相应的Bezier 曲面片称为双三次Bezier 曲面片。

2)实现矩阵相关运算;

双三次Bezier 曲面片的矩阵表示为 其中

2.设计方案

∑∑

===m i n j n j m i j i Q v B u B p v u 00,,,)

()(),([0,1]

v)(u,∈T

T b

b Q V GM UM v u =),(?????????

???----=0001003303631331b M ????????????=44434241343332312423222114131211P P P P P P P P P P P P P P P P G []123u u u U =[]123v v v V =

1)给定16个三维控制点如下:

P00(200,20,0),P01(150,0,100),P02(50,-130,100),P03(0,-250,50);

P10(150,100,100),P11(100,30,100),P12(50,-40,100),P13(0,-110,1

00);

P20(140,280,90),P21(80,110,120),P22(30,30,130),P23(-50,-100,1

50);

P30(150,350,30),P31(50,200,150),P32(0,50,200),P33(-70,0,100);

2)实现键盘控制曲面旋转效果

二、环境需求分析

开发环境:Windows XP

开发工具:Microsoft Visual Studio 2005

运行环境:本系统是基于OpenGL软件接口和VC++应用程序开发的一套管理系统,本系统可以在装有Windows 98 /2000/XP/NT的操作系统下运行。

1.OpenGL的特点及功能

OpenGL是一个开放的三维图形软件包,它只是图形函数库(GLU),稳定,可跨平台使用,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植;OpenGL可以与Visual C++紧密接口,便于实现机械手的有关计算和图形算法,可保证算法的正确性和可靠性;

OpenGL使用简便,效率高。它具有七大功能:①.建模②变换③颜色模式设置④光照和材质设置⑤纹理映射⑥位图显示和图象增强⑦双缓存动画

2.OpenGL相关的函数库

对于所有的OpenGL应用程序,需要在每个文件中包含gl.h头文件。几乎所有的OpenGL应用程序都使用GLU(前面所提到的OpenGL工具函数库),它要求包含glu.h头文件。因此,几乎所有的OpenGL源代码文件都是以下面这两行开头的:

#include < GL/gl.h>

#include < GL/glu.h>

注意:Microsoft Windows要求在gl.h或glu.h之前包含windows.h 头文件,因为Microsoft Windows版本的gl.h和glu.h文件内部所使用的一些宏是在windows.h中定义的。

绝大多数OpenGL应用程序还使用标准C函数库的系统调用,因此包含与图形无关的头文件也非常常见,例如:

#include

#include

有关GLUT函数的一个子集介绍:

1)窗口管理

GLUT用5个函数执行初始化窗口所需要的任务:

① glutInit(int *argc, char **argv) 对GLUT进行初始化,并处理任意命令行参数(对于X系统,这将是类似-display和-geometry这样的选项)。glutInit()应该在调用任何其他GLUT函数之前被调用。

② glutInitDisplayMode(unsigned int mode) 指定使用RGBA还是颜色索引模式。还可以指定使用单缓冲还是双缓冲窗口(如果使用的是颜色索引模式,需要把一些颜色载入到颜色映射表中,可以用glutSetColor()来完成这个任务)。最后,可以使用这个函数来表示希望窗口拥有相关联的深度、模版、多重采样和/或累积缓冲区。例如,如果需要一个双缓冲、RGBA 颜色模式以及一个深度缓冲区的窗口,可以调用glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)。

③ glutInitWindowPosition( int x, int y) 指定了窗口左上角的屏幕位置。

④ glutInitWindowSize( int width, int size) 指定了窗口的大小(以像素为单位)。

⑤ int glutCreateWindow( char *string) 创建了一个带有OpenGL渲染环境的窗口。这个函数为新窗口返回一个唯一的标识符。注意:在调用glutMainLoop()函数之前,这个窗口并没有被显示。

2)显示回调函数

glutDisplayFunc(void (*func)(void)) 是所看到的第一个也是最为重要的事件回调函数。每当GLUT确定一个窗口的内容需要重新显示时,通过glutDisplayFunc()所注册的那个回调函数就会被执行。因此,应该把重绘场景所需要的所有代码都放在这个显示回调函数里。

3)运行程序

最后,必须调用glutMainLoop()。所有已经创建的窗口将在此时显示,对那些窗口的渲染也开始生效。事件处理开始启动,已注册的显示回调函数被触发。一旦进入循环,它就永远不会退出。

4)处理输入事件

可以使用下面这些函数注册回调函数,当指定的事件发生时,这些函数便会被调用:

① glutReshapeFunc( void(*func)int w, int h))表示当窗口的大小发生改变时应该采取什么行动。

② glutKeyboardFunc(void(*func)(unsigned char key, int x, int y)) 和glutMouseFunc(void

(*func)(int button, int state, int x, int y)) 允许把键盘上的一个键或鼠标上的一个按钮与一个函数相关联,当这个键或按钮被按下或释放时,这个函数就会被调用。

5)管理后台进程

可以在glutIdleFunc(void(*func)(void)) 函数中指定一个函数,如果不存在其他尚未完成的事件(例如,当事件循环处于空闲的时候),就执行

这个函数。这个函数接受一个函数指针作为它的唯一参数。

三、调试后的正确程序清单

程序实现代码:

#include"stdafx.h"

#include

#include

#include

#include

#include//数学头文件

#define ROUND(a) int(a+0.5)//四舍五入

double Fei=0,Thta=0;

struct P2D{

int x,y;

};

struct P3D{

int x,y,z;

};

P2D P2d[4][4];

P3D P3d[4][4],T[4][4];

double MT[4][4];

void Init()//读入控制多边形个顶点坐标

{

glColor3f(1.0,1.0,1.0);

P3d[0][0].x=200;P3d[0][0].y=20;P3d[0][0].z=0;//P00

P3d[0][1].x=150;P3d[0][1].y=0;P3d[0][1].z=100;//P01

P3d[0][2].x=50;P3d[0][2].y=-130;P3d[0][2].z=100;//P02

P3d[0][3].x=0;P3d[0][3].y=-250;P3d[0][3].z=50;//P03

P3d[1][0].x=150;P3d[1][0].y=100;P3d[1][0].z=100;//P10

P3d[1][1].x=100;P3d[1][1].y=30;P3d[1][1].z=100;//p11

P3d[1][2].x=50;P3d[1][2].y=-40;P3d[1][2].z=100;//p12

P3d[1][3].x=0;P3d[1][3].y=-110;P3d[1][3].z=100;//p13

P3d[2][0].x=140;P3d[2][0].y=280;P3d[2][0].z=90;//P20

P3d[2][1].x=80;P3d[2][1].y=110;P3d[2][1].z=120;//P21

P3d[2][2].x=30;P3d[2][2].y=30;P3d[2][2].z=130;//P22

P3d[2][3].x=-50;P3d[2][3].y=-100;P3d[2][3].z=150;//P23

P3d[3][0].x=150;P3d[3][0].y=350;P3d[3][0].z=30;//P30

P3d[3][1].x=50;P3d[3][1].y=200;P3d[3][1].z=150;//P31

P3d[3][2].x=0;P3d[3][2].y=50;P3d[3][2].z=200;//P32

P3d[3][3].x=-70;P3d[3][3].y=0;P3d[3][3].z=100;//P33 }

void Transform3DTo2D()//三维坐标变换为二维坐标

{

for(int i=0;i<4;i++)

for(int j=0;j<4;j++)

{

P2d[i][j].x=P3d[i][j].y-P3d[i][j].x/sqrtf(2);

P2d[i][j].y=-P3d[i][j].z+P3d[i][j].x/sqrtf(2);

}

}

void KeepOriginalMatrix(P3D Orig[4][4],P3D Dest[4][4])//保留矩阵函数

{

for(int i=0;i<4;i++)

for(int j=0;j<4;j++)

{

Dest[i][j].x=Orig[i][j].x;

Dest[i][j].y=Orig[i][j].y;

Dest[i][j].z=Orig[i][j].z;

}

}

void Calculate1(double M0[][4],P3D P0[][4])//两个矩阵M*P相乘{

KeepOriginalMatrix(P0,T);

for(int i=0;i<4;i++)

for(int j=0;j<4;j++)

{

P3d[i][j].x=M0[i][0]*T[0][j].x+M0[i][1]*T[1][j].x+M0[i][2]*T[2 ][j].x+M0[i][3]*T[3][j].x;

P3d[i][j].y=M0[i][0]*T[0][j].y+M0[i][1]*T[1][j].y+M0[i][2]*T[2 ][j].y+M0[i][3]*T[3][j].y;

P3d[i][j].z=M0[i][0]*T[0][j].z+M0[i][1]*T[1][j].z+M0[i][2]*T[2 ][j].z+M0[i][3]*T[3][j].z;

}

}

void Calculate2(P3D P0[][4],double M1[][4])//两个矩阵P*M相乘{

KeepOriginalMatrix(P0,T);

for(int i=0;i<4;i++)

for(int j=0;j<4;j++)

{

P3d[i][j].x=T[i][0].x*M1[0][j]+T[i][1].x*M1[1][j]+T[i][2].x*M1 [2][j]+T[i][3].x*M1[3][j];

P3d[i][j].y=T[i][0].y*M1[0][j]+T[i][1].y*M1[1][j]+T[i][2].y*M1 [2][j]+T[i][3].y*M1[3][j];

P3d[i][j].z=T[i][0].z*M1[0][j]+T[i][1].z*M1[1][j]+T[i][2].z*M1 [2][j]+T[i][3].z*M1[3][j];

}

}

void MatrixRotate(double M0[][4])//矩阵转置

{

for(int i=0;i<4;i++)

{

for(int j=0;j<4;j++)

{

MT[j][i]=M0[i][j];

}

}

}

void myDisplay(void)//绘制双次Bezier曲面

{

glClearColor(1.0,1.0,1.0,1.0);

//glColor3f(1.0,1.0,1.0);

double x,y,u,v,u1,u2,u3,u4,v1,v2,v3,v4;

double M[4][4];

M[0][0]=-1;M[0][1]=3;M[0][2]=-3;M[0][3]=1;

M[1][0]=3;M[1][1]=-6;M[1][2]=3;M[1][3]=0;

M[2][0]=-3;M[2][1]=3;M[2][2]=0;M[2][3]=0;

M[3][0]=1;M[3][1]=0;M[3][2]=0;M[3][3]=0;

for(u=0;u<=1;u+=0.001)

{

for(v=0;v<=1;v+=0.001)

{

u1=u*u*u;u2=u*u;u3=u;u4=1;v1=v*v*v;v2=v*v;v3=v;v4=1;

x=(u1*P2d[0][0].x+u2*P2d[1][0].x+u3*P2d[2][0].x+u4*P2d[3][0].x )*v1

+(u1*P2d[0][1].x+u2*P2d[1][1].x+u3*P2d[2][1].x+u4*P2d[3][1].x)*v2

+(u1*P2d[0][2].x+u2*P2d[1][2].x+u3*P2d[2][2].x+u4*P2d[3][2].x)*v3

+(u1*P2d[0][3].x+u2*P2d[1][3].x+u3*P2d[2][3].x+u4*P2d[3][3].x)*v4 ;

y=(u1*P2d[0][0].y+u2*P2d[1][0].y+u3*P2d[2][0].y+u4*P2d[3][0].y )*v1

+(u1*P2d[0][1].y+u2*P2d[1][1].y+u3*P2d[2][1].y+u4*P2d[3][1].y)*v2

+(u1*P2d[0][2].y+u2*P2d[1][2].y+u3*P2d[2][2].y+u4*P2d[3][2].y)*v3

+(u1*P2d[0][3].y+u2*P2d[1][3].y+u3*P2d[2][3].y+u4*P2d[3][3].y)*v4 ;

glPointSize(3);

glBegin(GL_POINTS);

glColor3f(1.0f,0.0f,0.0f);

glVertex2f(ROUND(1000/2+x),ROUND(2000/2+y));

glutSwapBuffers();

glEnd();

}

}

glPopMatrix();

glFlush();

getchar();

}

void SpecialKeys(int key, int x, int y)//键盘的上下左右键用来旋转球体

{

if(key == GLUT_KEY_UP) Fei--;

if(key == GLUT_KEY_DOWN) Fei++;

if(key == GLUT_KEY_LEFT) Thta--;

if(key == GLUT_KEY_RIGHT) Thta++;

// 刷新窗口

glutPostRedisplay();

}

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);

}

int main(int argc, char *argv[])

{ Init();

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE|GLUT_DEPTH);

glutInitWindowPosition(0, 0);

glutInitWindowSize(1400,900);

glutCreateWindow("ShuangBezier!");

Transform3DTo2D();

glutDisplayFunc(myDisplay);

glutSpecialFunc(SpecialKeys);

glutReshapeFunc(reshape);

glutMainLoop();

return 0;

}

四、运行结果

图4.1双三次Beizer曲面的运行效果

五、程序实现原理

本程序主要是通过矩阵的有关运算实现Bezier曲面,Bezier曲面与Bezier曲线比较类似,在本程序中通过调用循环函数画出了Bezier曲面,在这里定义了两个参数u,v,当u,v的增量越小时,所画出来的曲面效果越好,不过增量越小,再加上入栈,出栈过程,程序运行越慢,需要耐心等待。

六、设计总结分析

经过一周的课程设计时间,我在老师的精心指导和严格要求下,以及同学之间的相互讨论,获得了丰富的理论知识,极大地提高了实践能力,使我学到了不少关于图形学和OpenGL这一图形函数库的知识,这对我今后进一步学习计算机方面的知识有极大的帮助。在此,忠心感谢老师以及同学的指导和支持。

尽管学到了不少东西,但是所做的程序避免不了会有很多漏洞,本程序没有实现键盘控制曲面旋转效果,我也试用了很多方法,编译时无错,就是不能控制曲面旋转,我也认真思考了原因,我自己感觉是因为本程序中有个缺陷,并没有把曲面整体显示出来,而是些离散点,如控制点旋转比较难以实现,但是由于本人能力有限,以及时间不足问题,我实在是实现不了键盘控制旋转这一功能,希望老师能再多多指导,我今后会多看有关这方面的书籍,多了解一些有关这方面的知识,并加强动手实践能力。

参考文献:

(1)孔令德.计算机图形学实践教程(Visual C++版).[M].清华大学出版社, 2008(2)徐文鹏. 计算机图形学. [M].机械工业出版社. 2009

(3)李春雨. 计算机图形学理论与实践. [M].北京航空航天大学出版社. 2004 (4)唐敏. 计算机图形学课程设计.[M].浙江大学出版社. 2008

计算机图形学真实图形

#include #include /* Initialize material property, light source, lighting model, * and depth buffer. */ void init(void) { GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat mat_shininess[] = { 50.0 }; GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 }; GLfloat lightPos[]={0.0f,0.0f,75.0f,1.0f}; GLfloat ambientLight[]={0.0f,0.0f,75.0f,1.0f}; GLfloat specular[]={0.0f,0.0f,75.0f,1.0f}; GLfloat specref[]={0.0f,0.0f,75.0f,1.0f}; GLfloat spotDir[]={0.0f,0.0f,75.0f,1.0f}; glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_SMOOTH);//设置阴影模型 glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);//镜面光分量强度glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);//镜面光反射指数glLightfv(GL_LIGHT0, GL_POSITION, light_position);//设置光源的位置 glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambientLight); glLightfv(GL_LIGHT1,GL_DIFFUSE,ambientLight); glLightfv(GL_LIGHT1,GL_SPECULAR,specular); glLightfv(GL_LIGHT1,GL_POSITION,lightPos); glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,50.0f); glEnable(GL_LIGHT1); glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE); glMaterialfv(GL_FRONT,GL_SPECULAR,specref); glMateriali(GL_FRONT,GL_SHININESS,128); glEnable(GL_LIGHTING);//启动光照 glEnable(GL_LIGHT0);//激活光源 glEnable(GL_LIGHT1);//激活光源 glEnable(GL_DEPTH_TEST); } /* 调用glut函数绘制一个球*/ void display(void) { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

计算机图形学实验

实验1 直线的绘制 实验目的 1、通过实验,进一步理解和掌握DDA和Bresenham算法; 2、掌握以上算法生成直线段的基本过程; 3、通过编程,会在TC环境下完成用DDA或中点算法实现直线段的绘制。实验环境 计算机、Turbo C或其他C语言程序设计环境 实验学时 2学时,必做实验。 实验内容 用DDA算法或Besenham算法实现斜率k在0和1之间的直线段的绘制。 实验步骤 1、算法、原理清晰,有详细的设计步骤; 2、依据算法、步骤或程序流程图,用C语言编写源程序; 3、编辑源程序并进行调试; 4、进行运行测试,并结合情况进行调整; 5、对运行结果进行保存与分析; 6、把源程序以文件的形式提交; 7、按格式书写实验报告。 实验代码:DDA: # include # include

void DDALine(int x0,int y0,int x1,int y1,int color) { int dx,dy,epsl,k; float x,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; x=x0; y=y0; if(abs(dx)>abs(dy)) epsl=abs(dx); else epsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { putpixel((int)(x+0.5),(int)(y+0.5),4); x+=xIncre; y+=yIncre; } } main(){ int gdriver ,gmode ;

计算机图形学复习重点

1:简述计算机图像学与数字图像处理和计算几何以及模式识别等学科之间的区别:计算机图形学研究计算机显示图像,即现实世界在计算机中的表示,其逆过程就是计算机视觉;图像处理:对图像进行处理包括图像变换,图像分析,边缘检测,图像分割等。模式识别:对数据的模式分析,涉及数据分析统计学,模式分类等。 2:第一台图像显示器是起源于:1950年麻省理工的旋风一号。 3:I.E萨瑟兰德被誉为计算机图像学之父,1963年他的SKETCHPAD被作为计算机图像学作为一个新学科的出现的标志。 4:列举计算机图像学的应用领域:计算机辅助绘图设计;事务管理中的交互式绘图;科学技术可视化;过程控制;计算机动画及广告;计算机艺术;地形地貌和自然资源的图形显示。5:计算机图形系统包括哪些组成:硬件设备和相应的程序系统(即软件)两部分组成。6:图像系统的基本功能:计算功能;存储功能;输入功能;输出功能;对话功能。 7:图像系统的分类:用于图形工作站的图形系统;以PC为基础的图形系统;小型智能设备上的图形系统 8:显示器的分类:阴极射线管(CRT);液晶显示器(LCD);LED(发光二极管)显示器;等离子显示器。 9:什么是CRT?其组成部分:即阴极射线管。组成有电子枪,加速结构,聚焦系统,偏转系统,荧光屏。 10:彩色阴极射线管生成彩色的方法:射线穿透法。应用:主要用于画线显示器。优点:成本低。缺点:只能产生有限几种颜色;影孔板法。 11:显示器的刷新方式经历了哪几个阶段:随机扫描显示;直视存储管式显示;光栅扫描显示。 12:什么是显示处理器,它与CPU是一回事吗?:显示处理器又称视觉处理器,是一种专门在PC,游戏机和一些移动设备上图像运算工作的微处理器,是显卡中重要组成部分。它的作用是代替CPU完成部分图形处理功能,扫描转换,几何变换,裁剪,光栅操作,纹理映射等。 13:什么是显存,它与内存的区别:显存全称显示内存,即显示卡专用内存。它负责存储显示芯片需要处理的各种数据。电脑的内存是指CPU在进行运算时的一个数据交换的中转站,数据由硬盘调出经过内存条再到CPU。区别:显存是显卡缓冲内存。内存是电脑的内部存储器。是不同的概念。 14:黑白显示器需要1个位平面;256级灰度显示器需要8个,真彩色需要24个位平面。15:OpenGL是什么?它在计算机图形学中的作用?OpenGL是一个工业标准的三维计算机图形软件接口,可以方便的用它开发出高质量的静止或动画三维彩色图形,并有多种特殊视觉效果,如光照,文理,透明度,阴影等。 16:图元:图形元素,可以编辑的最小图形单位。是图形软件用于操作和组织画面的最基本素材,是一组最简单,最通用的几何图形或字符。基本二维图元包括:点,直线,圆弧,多边形,字体符号和位图等。 17:直线的生产算法有:逐点比较法;数值微分法(DDA);中点画线法;Bresenham算法。18:采用哪种平移方法可以使任意二维直线变为第一和第二象限中的直线:逐点比较法。19:交互式图形系统的基本交换任务包括:定位,选择,文字输入,数值输出。定位任务是向应用程序指定一个点的坐标,定位中考虑的基本问题:坐标系统;分辨率;网格;反馈。选择任务是指从一个被选集中挑选出一个元素来。在作图系统中,操作命令、属性值、物种种类、物体等都可能是被选集。被选集可根据其元素的变化程度分为可变集和固定集。可变集的选择技术:指名和拾取。固定集的选择技术:指名技术、功能键、菜单技术、模式识

计算机图形学实验报告(原创)

实验报告 计算机图形学实验报告——C字曲线算法

计算机图形学实验报告——C字曲线算法 1)算法原理介绍 实验环境:Microsoft Visual C++ C字线算法原理:C曲线由控制多边形通过一系列割角变换生成,具有连续性。C 曲线容易在计算机上快速产生, 用于计算机图形的实时处理。实验中还应用了C 曲线的凸包性、保凸性、局部无依赖性等性质。本实验程中GetMaxX()函数得到屏幕上的X方向上的最大值;GetMaxY()数得到屏幕上的Y方向上的最大值; c(n,300,150,MaxX-300,150)函数画出C字样图形。 2)程序设计文档说明 一、课程设计目的 在掌握图形学的基本原理、算法和实现技术基础上,通过编程实践学会基本的图形软件开发技术。 1.了解Visual C++ 2005绘图的基本概念 2.了解Visual C++2005绘图环境 3.了解Visual C++2005绘图环境 4. 掌握用Visual C++ 2005绘图的基本命令 二、课程设计内容 仿照Windows的附件程序“画图”, 用C++语言编制一个具有交互式绘制和编辑多种图元功能的程序“C字曲线算法”,实现以下功能对应的设计内容: (1) 能够以交互方式在图形绘制区绘制直线(折线); (2)设置C字曲线的迭代次数,分析不同迭代次数的变化情况;

(3)通过帮助文档了解和使用函数。 三、实验步骤 1.新建MFC应用程序 1.1新建工程。运行VC++6.0,新建一个MFC AppWizard[exe]工程,并命名,选择保存 路径,确定。

1.2选择应用程序的类型,选择“单文档”,则可以通过菜单打开对话框 2.建立单文档应用程序,在其中调用对话框 2.1 查看工程资源 在单击完成之后,即建立了一个工程,在工程的左侧资源视图可以看到MFC向导为该程序提供的一些资源。 分别如下所示:

计算机图形学上机实验4_实现Bezier曲线和Bezier曲面的绘制

昆明理工大学理学院 信息与计算科学专业操作性实验报告 年级: 10级姓名:刘陈学号: 201011101128 指导教师: 胡杰 实验课程名称:计算机图形学程序设计开课实验室:理学院机房216 实验内容: 1.实验/作业题目:用计算机高级语言VC++6.0实现计算机的基本图元绘制2.实验/作业课时:2学时 3.实验过程(包括实验环境、实验内容的描述、完成实验要求的知识或技能):实验环境:(1)硬件:每人一台PC机 (2)软件:windows OS,VC++6.0或以上版本。 试验内容及步骤: (1)在VC++环境下创建MFC应用程序工程(单文档) (2)编辑菜单资源 (3)添加菜单命令消息处理函数 (4)添加成员函数 (5)编写函数内容 试验要求: (1)掌握Bezier曲线、Bezier曲面、及另一个曲面的算法。 (2)实现对Bezier曲线、Bezier曲面、及另一个曲面。 (3)试验中调试、完善所编程序,能正确运行出设计要求结果。 (4)书写试验报告上交。 4.程序结构(程序中的函数调用关系图)

5.算法描述、流程图或操作步骤: 在lab4iew.cpp文件中添加如下头文件及变量 int flag_2=0; int n_change; #define M 30 #define PI 3.14159 //圆周率 #include "math.h" //数学头文件 在lab4iew.h文件中的public内添加变量: int move; int graflag; void Tiso(float p0[3],float x0, float y0, float p[3]); void OnBezierface(); 在lab4iew.h文件中的protected内添加变量: int n;//控制点数 const int N;//控制点数的上限 CPoint* a;//控制点存放的数组 double result[4][2]; 在lab4iew.cpp文件中的函数Clab4iew::OnDraw(CDC* pDC)下添加如下代码: int i,j; for(i=0;iFillSolidRect(a[i].x-2,a[i].y-2,4,4,RGB(255,55,255)); } pDC->MoveTo(a[0]);

计算机图形学课程设计——扫雷游戏程序设计

计算机图形学课程设计——扫雷游戏程序设计

《计算机图形学》课程设计报告 VC++扫雷游戏的程序设计 专业班级: 小组成员:

指导老师: 日期:2012年12月24日 1、需求分析 本课程设计实现类似于Windows XP操作系统自带的扫雷游戏。该设计以V isual C++ 6.0为开发环境, Windows 7/XP为程序运行平台。在程序设计中,把整个雷区看成一个二维数组,把雷方块定义为具有所在雷区二维数组的行和列、当前状态、方块属性、历史状态的结构体,采用了MFC机制解决问题的方法。整个游戏程序包括了布雷、扫雷过程和结果三个阶段,在处理鼠标响应事件中伴随着GDI绘图。程序通过调试运行,实现简单的设计目标,满足扫雷游戏初学者的需要。 通过本课程设计,以便更好的巩固计算机图形学相关知识,掌握课程设计基本的方法和技巧,同时增加同学之间的团队合作精神以及培养分析问题、解决问题的能力。 2.总体设计 2.1 功能概述 扫雷游戏的游戏界面如图1所示。在这个界面中,由众多面积均等的小方块所组成的区域称之为雷区,雷区的大小由用户设置的游戏等级决定。

图1 游戏开始时,系统会在雷区中随机布下若干个地雷。安放地雷的小方块称之为雷方块,其他的称之为非雷方块。部署完毕后,系统会在其他非雷方块中填充一些数字。某一个具体数字表示与其紧邻的8个方块 中有多少雷方块。玩家可以根据这些信息去判断是否可以鼠标点击方块, 并把认为是地雷的方块打上标识。当玩家将所有地雷找出后,其余的非雷方块区域都已打开,此时游戏结束。在游戏过程中,一旦错误地打开了雷方块则立即失败,游戏结束。 游戏规则总结: ●开始:按左键开始游戏,按按钮或菜单重新开始。 ●左键:按下时,是雷则结束,非雷则显示数字。 ●数字:代表此数字周围一圈八格中雷的个数。 ●右键:奇次按下表示雷,偶数按下表示对上次的否定。 ●结束:左键按到雷结束,找出全部雷结束。 在游戏开始后,雷区上方有两个计数器。右边的计数器显示用户扫

西安电子科技大学计算机图形学重点总结,缩印必备!

反走样:在光栅显示器上显示图形时,直线段或图形边界或多或少会呈锯齿状。原因是图形信号是连续的,而在光栅显示系统中,用来表示图形的却是一个个离散的象素。这种用离散量表示连续量引起的失真现象称之为走样;用于减少或消除这种效果的技术称为反走样 反走样方法主要有:提高分辨率、区域采样和加权区域采样 提高分辨率:把显示器分辨率提高一倍,锯齿宽度也减小了一倍,所以显示出的直线段看起来就平直光滑了一些。这种反走样方法是以4倍的存储器代价和扫描转换时间获得的。因此,增加分辨率虽然简单,但是不经济的方法,而且它也只能减轻而不能消除锯齿问题。 区域采样方法:假定每个象素是一个具有一定面积的小区域,将直线段看作具有一定宽度的狭长矩形。当直线段与象素有交时,求出两者相交区域的面积,然后根据相交区域面积的大小确定该象素的亮度值。 加权区域采样:相交区域对象素亮度的贡献依赖于该区域与象素中心的距离。当直线经过该象素时,该象素的亮度F是在两者相交区域A′上对滤波器进行积分的积分值 刚体:平移和旋转的组合,保持线段的长度,保持角的大小,图形不变形,为刚体变化 仿射:旋转、平移、缩放的组合为仿射变换,平行边仍然平行,错切变换也为仿射变换 较高次数逼近的三种方法:1将y和z直接表示成x的显函数即y=f(x) z=g(x)2用一个形如f(x,y,z)=0的隐式方程的解来表示曲线3曲线的参数表示 前两方法缺点:1由一个x值不能得到多个y值;这一定义不是旋转不变的;描述具有与坐标轴垂直的切线的曲线是困难的2给定方程的解可能更多;曲线段做链接时,很难确定他们的切线方向在连接点上是否相等 参数表示为什么要选择三做参数:1低于三次的函数控制曲线形状时不够灵活,高于三次的曲线会增加不必要的摆动其增加计算量2三次参数曲线是三维空间中次数最低的非平面曲线3定义高次曲线需要更多条件,这样在交互生成时会造成曲线的摆动而难以控制 G0连续:两条曲线段拼接成一条曲线 G1连续:两条曲线段拼接点处切向量方向相同。若相等(方向、大小)-C1 Gn连续:两条曲线段拼接点处切向量的阶导数方向相同。n阶导数相等-Cn B样条曲线优势:1四点加权求和,调和函数非负且和为1,具有凸壳特性2可证明Qi和Qi+1在连接点处连续3曲线段三次函数,所以整个曲线具有连续4凸壳的对曲线裁剪有用 中点生成算法: TBRL中点生成算法:

计算机图形学心得体会

计算机图形学心得体会 姓名: 学号: 201203284 班级: 计科11202 序号: 31 院系: 计算机科学学院

通过一个学期的学习,经过老师细心的讲解,我对图形学这门课有了基础的认识,从您的课上我学到了不少知识,基本上对图形学有了一个大体的认识。上课的时候,您的PPT做的栩栩如生,创意新颖的FLASH就吸引了我的眼球,再加上您那详细生动的讲解,就让我对这门课产生了浓厚的兴趣,随着一节一节课的教学,您的讲课更加深深地吸引了我,并且随着对这门课越来越深入的了解更促使我产生了学好这门的欲望。您教会了我们怎们做基本知识,还教了我们不少的算法。听您的课可以说是听得津津有味。以下就是我对计算机图形学这门课的认识。 一、图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成。从处理技术上来看图形主要分为两类一类是基于线条信息表示的如工程图、等高线地图、曲面的线框图等另一类是明暗图也就是通常所说的真实感图形。计算机图形学一个主要的目的就是要利用计算机产生令人赏心悦目的真实感图形。为此必须建立图形所描述的场景的几何表示再用某种光照模型计算在假想的光源、纹理、材质属性下的光照明效果。所以计算机图形学与另一门学科计算机辅助几何设计有着密切的关系。事实上图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其主要的研究内容。同时真实感图形计算的结果是以数字图像的方式提供的计算机图形学也就和图像处理有着密切的关系。 二、计算机图形学的研究内容非常广泛如图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法、非真实感绘制以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等。1990年的第11届亚洲运动会上首次采用了计算机三维动画技术来制作有关的电视节目片头。继而以3D Studio 为代表的三维动画微机软什和以Photostyler、Photoshop等为代表的微机二维平面设计软件的普及对我国计算机动画技术的应用起到了推波助谰的作用。计算机动画的应用领域十分宽广除了用来制作影视作品外在科学研究、视觉模拟、电子游戏、工业设计、教学训练、写真仿真、过程控制、平面绘画、机械设计等许多方面都有重要应用如军事战术模拟。 三、科学计算可视化它将科学计算过程中及计算结果的数据转换为几何

计算机图形学——绘制Bezier曲线

计算机图形学 实验报告 专业:信息与计算科学 班级: 1002班 学号: 1008060*** 姓名: ****

实验目的: (1)掌握直线的参数表示法。 (2)掌握德卡斯特里奥算法的几何意义。 (3)掌握绘制二维Bezier曲线的方法。 实验要求: (1)使用鼠标左键绘制个数为10以内的任意控制点,使用直线连接构成控制多边形。 (2)使用鼠标右键绘制Bezier曲线。 (3)在状态栏显示鼠标的位置坐标。 (4)B ezier曲线使用德卡斯特里奥算法绘制。 实验算法: Bezier曲线的分割递推德卡斯特里奥算法 给定空间n+1个点P i(i=0,1,2,…,n)及参数t,有 P r i(t)=(1-t)P1-r i(t)+t P1-r1i+(t) 式中,r=1,2,…,n;i=0,1,…,n-r;t∈[0,1]。 且规定当r=0时,P0i(t)=P i, P n0(t)是在曲线上具有参数t的点。 德卡斯特里奥算法的基础就是在矢量? ?→ ? P P10 上选择一个点P,使 得P点划分矢量? ?→ ? P P10为|P P0|:|P P1|=t:1-t,给定点P0、P1 的坐标以及t的值,点P的坐标为P=P0+t(P1-P0)=(1-t)P0+tP1。式中,t∈[0,1]。 定义贝塞尔曲线的控制点编号为P r i,其中,r表示迭代次数。德卡斯特里奥证明了,当r=n时,P n0表示Bezier曲线上的点。

函数功能介绍 1.德卡斯特里奥函数: long CMy12View::DeCasteliau(double t,long *p) { double P[N_MAX_POINT][N_MAX_POINT]; int n=CtrlPNum-1; for(int k=0;k<=n;k++) { P[0][k]=p[k]; } for(int r=1;r<=n;r++) { for(int i=0;i<=n-r;i++) { P[r][i]=(1-t)*P[r-1][i]+t*P[r-1][i+1]; } } return(long(P[n][0])); } 函数功能介绍:此函数为德卡斯特里奥算法函数。在绘制Bezier 曲线时,需调用两次此函数,分别关于x方向和y方向上的调用。由DrawBezier()函数调用。 2. void CMy12View::DrawBezier() 函数功能介绍:此函数为绘制Bezier曲线。绘制二维Bezier曲线,需要对x方向和y方向进行计算。这个函数就是解决这个问题,然后通过OnRButtonDown(UINT nFlags,CPoint point)调用进行绘制。 3 .void CMy12View::DrawCtrPolygon() 函数功能介绍:此函数为绘制控制多边形。定义一个CPen型NewPen,和CPen*型PoldPen,进行绘制多边形,为了突出控制点,使用黑色填充边长为4个像素的正方形块代表控制点。 4. void CMy12View::OnLButtonDown(UINT nFlags,CPoint point) 函数功能介绍:此函数为鼠标左键按下函数。按下鼠标左键,将鼠

西北工业大学计算机图形学重点汇编

第一章绪论 ?计算机图形学是研究怎样用计算机生成、处理和显示图形的一门学科。 生成:在计算机内表示客观世界物体的模型,即图形建模; 显示:模型对象在计算机显示设备或其他输出设备上的显示; 处理:利用计算机实现客观世界、对象模型和输出图形这三者之间映射的一系列操作和处理过程。 ?1.点阵法:枚举出图形中所有的点来表示,强调图形由点及其点的属性(颜色)构成:像素图、位图或图像。一般地,一个图像就是一个矩阵,该矩阵的每一个元素都表示图像某行某列一个点的颜色值,矩阵的维数就是图像的宽度和高度缺点:点阵图形需要大量的存储空间;对点阵图形进行编辑、修改较困难; 点阵图的放大操作会使图形失真;JPEG, BMP, Tif, GIF, PNG 2.参数法:由图形的形状参数和属性参数来表示图形(矢量图、图形) 形状参数(必须有):几何,方程或分析表达式的系数,线段的端点坐标等 属性参数(可选):非几何,颜色、线形等DXF, OBJ, 3DS ?几何要素:刻画对象的轮廓、形状、几何元素组成等。 非几何要素:刻画对象的颜色、材质、纹理等。 ?图像:图像一定是二维的。基本单位是像素:组成图像的颜色点(或亮度点),是数字图像的最小信息单位,通常是一个整数,其大小称为像素值。 ?灰度级分辨率、颜色分辨率 图像分为两色图(黑白)、灰度图、彩色图、真彩色图 图形:图形可以是二维的、或者三维的,图形的基本信息包括它的基本几何元素(必须),拓扑关系,以及颜色、材质、纹理等可选要素 第二章图形系统与图像生成 ?计算机图形系统是进行图形处理的计算机系统,是计算机图形硬件和图形软件的集合。 图形硬件包括具有图形处理能力的计算机主机、图形显示器以及鼠标和键盘等基本交互工具,还有图形输入板、绘图仪、图形打印机等输入输出设备,以及磁盘、光盘等图形存储设备。 图形软件分为图形数据模型、图形应用软件和图形支撑软件三部分。涵盖了计算机系统软件、高级语言和专业应用软件等方面。 ?一个计算机图形系统至少应当具有计算、存储、对话、输入、输出五个方面的基本功能 ?图形系统的硬件就是指执行以上不同功能的各种设备,如计算机、鼠标、扫描仪、显示器、硬盘、绘图仪等。根据具体的业务需求,组成系统的设备是可选的。在系统中,计算机处于核心地位,其他设备与其直接相连。 星型设备,其他可选

计算机图形学基础教程实验报告

湖北民族学院信息工程学院实验报告 (数字媒体技术专业用) 班级:0312413姓名:谌敦斌学号:031241318实验成绩: 实验时间:2013年10 月14 日9、10 节实验地点:数媒实验室课程名称:计算机图形学基础教程实验类型:设计型 实验题目:直线与圆的绘制 一、实验目的 通过本次实验,熟练掌握DDA、中点、Bresenham直线绘制方法和中点、Bresenham圆的画法,能够在vc环境下独立完成实验内容,逐渐熟悉opengl的语法特点,提高程序基本绘图的能力。 二、实验环境(软件、硬件及条件) Microsoft vc++6.0 多媒体计算机 三、实验内容 1.从DDA、中点、Bresenham画线法中任选一种,完成直线的绘制。 2.从中点、Bresenham画圆法中任选一种,完成圆的绘制。 四、实验方法与步骤 打开vc++6.0,新建一个工程,再在工程里面建一个.cpp文件,编辑程序,编译连接后执行即可。

程序如下 bresenham画线法: #include #include int bresenham(int x0,int y0,int x1,int y1,int color) { int x,y,dx,dy,e,i; dx=x1-x0; dy=y1-y0; e=-dx; y=y0; for(x=x0;x<=x1;x++) { putpixel(x,y,color); e+=2*dy; if(e>=0) { y++; e-=2*dx; } } return 0; } int main() { initgraph(640,480); bresenham(0,0,500,200,255); while(!kbhit()) { } closegraph(); return 0; } Bresenham画圆法: #include #include int circlepoints(int x,int y,int color) { putpixel(255+x,255+y,color); putpixel(255+y,255+x,color); putpixel(255-x,255+y,color);

计算机图形学

a.扫描线算法:目标:利用相邻像素之间的连贯性,提高算法效率。处理对象:简单多边形,非自交多边形(边与边之间除了顶点外无其它交点)。扫描线:平行于坐标轴的直线,一般取平行于X轴。区间:扫描线与边的交点间的线段。基本原理:将整个绘图窗口内扫描多边形的问题分解到一条条扫描线,只要完成每条扫描线的绘制就实现了多边形的扫描转换;一条扫描线与多边形的边有偶数个交点,每2个点形成一区间。步骤:(对于每一条扫描线)(1)计算扫描线与边的交点(2)交点按x坐标从小到大排序(3)交点两两配对,填充区间。算法:1、建立ET;2、将扫描线纵坐标y的初值置为ET中非空元素的最小序号,如图中,y=1;3、置AEL为空;4、执行下列步骤直至ET和AEL都为空.4.1、如ET中的第y类非空,则将其中的所有边取出并插入AEL 中;4.2、如果有新边插入AEL,则对AEL中各边排序;4.3、对AEL中的边两两配对,(1和2为一对,3和4为一对,…),将每对边中x坐标按规则取整,获得有效的填充区段,再填充.4.4、将当前扫描线纵坐标 y 值递值1;4.5、将AEL中满足y = ymax边删去(因为每条边被看作下闭上开的);4.6、对AEL中剩下的每一条边的x 递增deltax,即x = x+deltax. b.走样与反走样:走样:用离散量(像素)表示连续的量(图形)而引起的失真,称为走样,或称为混淆。光栅图形的走样现象:阶梯(锯齿)状边界、图形细节失真、狭小图形遗失:动画序列中时隐时现,产生闪烁。反走样:在图形显示过程中,用于减少或消除走样(混淆)现象的方法。方法:提高分辨率方法{方法简单,但代价非常大,显示器的水平、竖直分辩率各提高一倍,则显示器的点距减少一倍,帧缓存容量则增加到原来的4倍,而扫描转换同样大小的图元却要花4倍时间}、非加权区域采样{扫描转换线段的两点假设:像素是数学上抽象的点,它的面积为0,它的亮度由覆盖该点的图形的亮度所决定;直线段是数学上抽象直线段,它的宽度为0。而现实:像素的面积不为0;直线段的宽度至少为1个像素;假设与现实的矛盾是导致走样出现的原因之一。解决方法:改变直线段模型,线上像素灰度不等。方法步骤:1、将直线段看作具有一定宽度的狭长矩形;2、当直线段与某像素有交时,求出两者相交区域的面积;3、根据相交区域的面积,确定该像素的亮度值}、加权区域采样{权函数w(x, y),以像素A的中心为原点建立二维坐标系,w(x, y)反应了微面积元dA对整个像素亮度的贡献大小,与 dA 到像素中心距离d 成反比。实现步骤:1.求直线段与像素的相交区域2.计算的值3.上面所得到的值介于0、1之间,用它乘像素的最大灰度值,即设该像素的显示灰度。问题:计算量大。 c.为什么需要齐次坐标? 1、对多个点计算多次不同的变换时,分别利用矩阵计算各变换导致计算量大2、运算表示形式不统一:平移为“+”、旋转和放缩为“·”3、统一运算形式后,可以先合成变换运算的矩阵,再作用于图形对象。 d.Sutherland-Hodgman算法:S-H算法基本思想(亦称逐边裁剪算法):将多边形关于矩形窗口的裁剪分解为多边形关于窗口四边所在直线的裁剪。步骤:1、多边形由一系列顶点表示:V1V2…Vn2、按一定(左上右下)的次序依次裁剪; 与左边所在直线裁剪

计算机图形学必考知识点

Phong Lighting 该模型计算效率高、与物理事实足够接近。Phong模型利用4个向量计算表面任一点的颜色值,考虑了光线和材质之间的三种相互作用:环境光反射、漫反射和镜面反射。Phong模型使用公式:I s=K s L s cosαΦα:高光系数。计算方面的优势:把r和v归一化为单位向量,利用点积计算镜面反射分量:I s=K s L s max((r,v)α,0),还可增加距离衰减因子。 在Gouraud着色这种明暗绘制方法中,对公用一个顶点的多边形的法向量取平均值,把归一化的平均值定义为该顶点的法向量,Gouraud着色对顶点的明暗值进行插值。Phong着色是在多边形内对法向量进行插值。Phong着色要求把光照模型应用到每个片元上,也被称为片元的着色。 颜色模型RGB XYZ HSV RGB:RGB颜色模式已经成为现代图形系统的标准,使用RGB加色模型的RGB三原色系统中,红绿蓝图像在概念上有各自的缓存,每个像素都分别有三个分量。任意色光F都可表示为F=r [ R ] + g [ G ] + b [ B ]。RGB颜色立方体中沿着一个坐标轴方向的距离代表了颜色中相应原色的分量,原点(黑)到体对角线顶点(白)为不同亮度的灰色 XYZ:在RGB 系统基础上,改用三个假想的原色X、Y、Z建立了一个新的色度系统, 将它匹配等能光谱的三刺激值,该系统称为视场XYZ色度系统,在XYZ空间中不能直观地评价颜色。 HSV是一种将RGB中的点在圆柱坐标系中的表示法,H色相S饱和度V明度,中心轴为灰色底黑顶白,绕轴角度为H,到该轴距离为S,沿轴高度为S。 RGB优点:笛卡尔坐标系,线性,基于硬件(易转换),基于三刺激值,缺点:难以指定命名颜色,不能覆盖所有颜色范围,不一致。 HSV优点:易于转换成RGB,直观指定颜色,’缺点:非线性,不能覆盖所有颜色范围,不一致 XYZ:覆盖所有颜色范围,基于人眼的三刺激值,线性,包含所有空间,缺点:不一致 交互式计算机程序员模型 (应用模型<->应用程序<->图形库)->(图形系统<->显示屏).应用程序和图形系统之间的接口可以通过图形库的一组函数来指定,这和接口的规范称为应用程序编程人员接口(API),软件驱动程序负责解释API的输出并把这些数据转换为能被特定硬件识别的形式。API提供的功能应该同程序员用来确定图像的概念模型相匹配。建立复杂的交互式模型,首先要从基本对象开始。良好的交互式程序需包含下述特性:平滑的显示效果。使用交互设备控制屏幕上图像的显示。能使用各种方法输入信息和显示信息。界面友好易于使用和学习。对用户的操作具有反馈功能。对用户的误操作具有容忍性。Opengl并不直接支持交互,窗口和输入函数并没有包含在API中。 简单光线跟踪、迭代光线跟踪 光线跟踪是一种真实感地显示物体的方法,该方法由Appel在1968年提出。光线跟踪方法沿着到达视点的光线的相反方向跟踪,经过屏幕上每一象素,找出与视线所交的物体表面点P0,并继续跟踪,找出影响P0点光强的所有的光源,从而算出P0点上精确的光照强度。光线跟踪器最适合于绘制具有高反射属性表面的场景。优缺点:原理简单,便于实现,能生成各种逼真的视觉效果,但计算量开销大,终止条件:光线与光源相交光线超出视线范围,达到最大递归层次。一般有三种:1)相交表面为理想漫射面,跟踪结束。2)相交表面为理想镜面,光线沿镜面反射方向继续跟踪。3)相交表面为规则透射面,光线沿规则透射方向继续跟踪。 描述光线跟踪简单方法是递归,即通过一个递归函数跟踪一条光线,其反射光想和折射光线再调用此函数本身,递归函数用来跟踪一条光线,该光线由一个点和一个方向确定,函数返回与光线相交的第一个对象表面的明暗值。递归函数会调用函数计算指定的光线与最近对象表面的交点位置。 图形学算法加速技术BVH, GRID, BSP, OCTree 加速技术:判定光线与场景中景物表面的相对位置关系,避免光线与实际不相交的景物表面的求交运算。加速器技术分为以下两种:Bounding Volume Hierarchy 简写BVH,即包围盒层次技术,是一种基于“物体”的场景管理技术,广泛应用于碰撞检测、射线相交测试之类的场合。BVH的数据结构其实就是一棵二叉树(Binary Tree)。它有两种节点(Node)类型:Interior Node 和Leaf Node。前者也是非叶子节点,即如果一个Node不是Leaf Node,它必定是Interior Node。Leaf Node 是最终存放物体/们的地方,而Interior Node存放着代表该划分(Partition)的包围盒信息,下面还有两个子树有待遍历。使用BVH需要考虑两个阶段的工作:构建(Build)和遍历(Traversal)。另一种是景物空间分割技术,包括BSP tree,KD tree Octree Grid BSP:二叉空间区分树 OCTree:划分二维平面空间无限四等分 Z-buffer算法 算法描述:1、帧缓冲器中的颜色设置为背景颜色2、z缓冲器中的z值设置成最小值(离视点最远)3、以任意顺序扫描各多边形a) 对于多边形中的每一个采样点,计算其深度值z(x,y) b) 比较z(x, y)与z缓冲器中已有的值zbuffer(x,y)如果z(x, y) >zbuffer(x, y),那么计算该像素(x, y)的光亮值属性并写入帧缓冲器更新z缓冲器zbuffer(x, y)=z(x, y) Z-buffer算法是使用广泛的隐藏面消除算法思想为保留每条投影线从COP到已绘制最近点距离,在投影后绘制多边形时更新这个信息。存储必要的深度信息放在Z缓存中,深度大于Z缓存中已有的深度值,对应投影线上已绘制的多边形距离观察者更近,故忽略该当前多边形颜色,深度小于Z缓存中的已有深度值,用这个多边形的颜色替换缓存中的颜色,并更新Z缓存的深度值。 void zBuffer() {int x, y; for (y = 0; y < YMAX; y++) for (x = 0; x < XMAX; x++) { WritePixel (x, y, BACKGROUND_VALUE); WriteZ (x, y, 1);} for each polygon { for each pixel in polygon’s projection { //plane equation doubl pz = Z-value at pixel (x, y); if (pz < ReadZ (x, y)) { // New point is closer to front of view WritePixel (x, y, color at pixel (x, y)) WriteZ (x, y, pz);}}}} 优点:算法复杂度只会随着场景的复杂度线性增加、无须排序、适合于并行实现 缺点:z缓冲器需要占用大量存储单元、深度采样与量化带来走样现象、难以处理透明物体 着色器编程方法vert. frag 着色器初始化:1、将着色器读入内存2、创建一个程序对象3、创建着色器对象4、把着色器对象绑定到程序对象5、编译着色器6、将所有的程序连接起来7、选择当前的程序对象8、把应用程序和着色器之间的uniform变量及attribute变量关联起来。 Vertex Shader:实现了一种通用的可编程方法操作顶点,输入主要有:1、属性、2、使用的常量数据3、被Uniforms使用的特殊类型4、顶点着色器编程源码。输入叫做varying变量。被使用在传统的基于顶点的操作,例如位移矩阵、计算光照方程、产生贴图坐标等。Fragment shader:计算每个像素的颜色和其他属性,实现了一种作用于片段的通用可编程方法,对光栅化阶段产生的每个片段进行操作。输入:Varying 变量、Uniforms-用于片元着色器的常量,Samples-用于呈现纹理、编程代码。输出:内建变量。 观察变换 建模变换是把对象从对象标架变换到世界标架 观察变换把世界坐标变换成照相机坐标。VC是与物理设备无关的,用于设置观察窗口观察和描述用户感兴趣的区域内部分对象,观察坐标系采用左手直角坐标系,可在用户坐标系中的任何位置、任何方向定义。其中有一坐标轴与观察方向重合同向并与观察平面垂直。观察变换是指将对象描述从世界坐标系变换到观察坐标系的过程。(1):平移观察坐标系的坐标原点,与世界坐标系的原点重合,(2):将x e,y e轴分别旋转(-θ)角与x w、y w轴重合。 规范化设备坐标系 规范化设备坐标系是与具体的物理设备无关的一种坐标系,用于定义视区,描述来自世界坐标系窗口内对象的图形。 光线与隐式表面求交 将一个对象表面定义为f(x,y,z)=f(p)=0,来自P0,方向为d的光线用参数的形式表示为P(t)=P0+td. 交点位置处参数t的值满足:f(P0+td)=0,若f是一个代数曲面,则f是形式为X i Y j Z k的多项式之和,求交就转化为寻求多项式所有根的问题,满足的情况一:二次曲面,情况二:品面求交,将光线方程带入平面方程:p*n+c=0可得到一个只需做一次除法的标量方程p=p0+td。可通过计算得到交点的参数t的值:t=(p0*n+c)/(n*d). 几何变换T R S矩阵表示 三维平移T 三维缩放S旋转绕z轴Rz( ) 100dx 010dy 001dz 0001 Sx000 0Sy00 00Sz0 0001 cos-sin00 sin cos00 0010 0001 θθ θθ 旋转绕x轴Rx(θ) 旋转绕y轴Ry(θ) 1000 0cos-sin0 0sin cos0 0001 θθ θθ cos0sin0 0100 -sin0cos0 0001 θθ θθ 曲线曲面 Bezier曲线性质:Bezier曲线的起点和终点分别是特征多边形的第一个顶点和最后一个顶点。曲线在起点和终点处的切线分别是特征多边形的第一条边和最后一条边,且切矢的模长分别为相应边长的n倍;(2)凸包性;(3)几何不变性(4)变差缩减性。端点插值。 均匀B样条曲线的性质包括:凸包性、局部性、B样条混合函数的权性、连续性、B样条多项式的次数不取决于控制函数。 G连续C连续 C0连续满足:C1连续满足: (1)(0) p(1)=(1)(0)(0) (1)(0) px qx py q qy pz qz == ???? ???? ???? ???? (1)(0) p'(1)=(1)'(0)(0) (1)(0) p x q x p y q q y p z q z == ???? ???? ???? ???? C0(G0)连续:曲线的三个分量在连接点必须对应相等 C1连续:参数方程和一阶导数都对应相等 G1连续:两曲线的切线向量成比例 三维空间中,曲线上某点的导数即是该点的切线,只要求两个曲线段连接点的导数成比例,不需要导 数相等,即p’(1)=aq’(0) 称为G1几何连续性。将该思想推广到高阶导数,就可得到C n和G n连续性。

计算机图形学课设(含所有程序图文)

计算机图形学课程设计报告 系(院):计算机科学学院 专业班级:信计11102 姓名:吴家兴 学号:201106262 指导教师:严圣华 设计时间:2014.6.16 - 2014.6.26 设计地点:10教机房

(此处目录根据自己情况可以调整改动) 一、课程设计目的 ................................................. 错误!未定义书签。 二、课程设计具体要求..................................... 错误!未定义书签。 三、需求分析与总体设计 ..................................... 错误!未定义书签。 四、详细设计与实现[含关键代码和实现界面] ... 错误!未定义书签。 五、小结......................................................................................... 错误!未定义书签。 一、课程设计目的 计算机图形学课程设计是验证、巩固和补充课堂讲授的理论知识的必要环节,通过上机实验,培养学生的自学能力、动手能力、综合运用知识解决实际问题的能力。要求学生运用计算机图形学理论与技术设计、编写、调试程序并撰写课程设计报告。 二、课程设计具体要求 1.独立完成设计并撰写课程设计报告。 2.在规定时间将程序和设计报告用附件(信计111X班XXX 图形学课设报告.RAR)发送到274548837@https://www.sodocs.net/doc/bd9589053.html,,并上交纸质打印稿(A4纸10页左右)。 3. 课程设计报告内容包括: (1)列出设计者姓名及本人详细信息、所用开发工具; (2)程序的基本功能介绍; (3)程序实现步骤和关键算法的理论介绍; (4)关键源代码实现说明。(不要打印全部源程序!) (5)程序运行界面截图(3幅左右) (6)课设总结和自我评价。 4.《计算机图形学》课程的知识结构体系: (1)课设为期两周:总学时为40学时,2学分 (2)学生必须完成二维线画图元和二维填充图元两个大功能。二维裁剪和二维图形变换至少实现两个内容。总共不少于10个算法。 (3)程序应做到:通用性、交互性、界面友好性!

相关主题