文档库 最新最全的文档下载
当前位置:文档库 › 图形学第五课--变换OpenGL GLUT场景漫游

图形学第五课--变换OpenGL GLUT场景漫游

图形学第五课--变换OpenGL GLUT场景漫游
图形学第五课--变换OpenGL GLUT场景漫游

OpenGL---GLUT教程(五)GLUT键盘控制

分类:OpenGL2007-12-02 15:11 5773人阅读评论(2) 收藏举报functioninsertbufferupnullfloat

GLUT教程

键盘输入

GLUT允许我们编写程序,在里面加入键盘输入控制,包括了普通键,和其他特殊键(如F1,UP)。在这一章里我们将学习如何去检测哪个键被按下,可以从GLUT里得到些什么信息,和如何处理键盘输入。

到现在,你应该注意到了,只要你想控制一个事件的处理,你就必须提前告诉GLUT,哪个函数将完成这个任务。到现在为止,我们已经使用GLUT告诉窗口系统,当窗口重绘时我们想调用哪个渲染函数,但系统空闲时,哪个函数被调用。和当窗口大小改变时,哪个函数又将被调用。

相似的,我们必须做同样的事来处理按键消息。我们必须使用GLUT通知窗口系统,当某个键被按下时,哪个函数将完成所要求的操作。我们同样是调用一个函数注册相关的回调函数。

当你按下一个键后,GLUT提供了两个函数为这个键盘消息注册回调。第一个是glutKeyboardFunc。这个函数是告诉窗口系统,哪一个函数将会被调用来处理普通按键消息。

普通键是指字母,数字,和其他可以用ASCII代码表示的键。函数原型如下:

void glutKeyboardFunc(void(*func)(unsigned char key,int x,int y));

参数:

func: 处理普通按键消息的函数的名称。如果传递NULL,则表示GLUT忽略普通按键消息。

这个作为glutKeyboardFunc函数参数的函数需要有三个形参。第一个表示按下的键的ASCII码,其余两个提供了,当键按下时当前的鼠标位置。鼠标位置是相对于当前客户窗口的左上角而言的。

一个经常的用法是当按下ESCAPE键时退出应用程序。注意,我们提到过,glutMainLoop 函数产生的是一个永无止境的循环。唯一的跳出循环的方法就是调用系统exit函数。这就是我们函数要做的,当按下ESCAPE键调用exit函数终止应用程序(同时要记住在源代码包含头文件stdlib.h)。下面就是这个函数的代码:

void processNormalKeys(unsigned char key,int x,int y)

{

if(key==27)

Exit(0);

}

下面让我们控制特殊键的按键消息。GLUT提供函数glutSpecialFunc以便当有特殊键按下的消息时,你能注册你的函数。函数原型如下:

void glutSpecialFunc(void (*func)(int key,int x,int y));

参数:

func: 处理特殊键按下消息的函数的名称。传递NULL则表示GLUT忽略特殊键消息。

下面我们写一个函数,当一些特殊键按下的时候,改变我们的三角形的颜色。这个函数使在按下F1键时三角形为红色,按下F2键时为绿色,按下F3键时为蓝色。

void processSpecialKeys(int key, int x, int y) {

switch(key) {

case GLUT_KEY_F1 :

red = 1.0;

green = 0.0;

blue = 0.0; break;

case GLUT_KEY_F2 :

red = 0.0;

green = 1.0;

blue = 0.0; break;

case GLUT_KEY_F3 :

red = 0.0;

green = 0.0;

blue = 1.0; break;

}

}

上面的GLUT_KEY_*在glut.h里已经被预定义为常量。这组常量如下:

GLUT_KEY_F1 F1 function key

GLUT_KEY_F2 F2 function key

GLUT_KEY_F3 F3 function key

GLUT_KEY_F4 F4 function key

GLUT_KEY_F5 F5 function key

GLUT_KEY_F6 F6 function key

GLUT_KEY_F7 F7 function key

GLUT_KEY_F8 F8 function key

GLUT_KEY_F9 F9 function key

GLUT_KEY_F10 F10 function key

GLUT_KEY_F11 F11 function key

GLUT_KEY_F12 F12 function key

GLUT_KEY_LEFT Left function key

GLUT_KEY_RIGHT Up function key

GLUT_KEY_UP Right function key

GLUT_KEY_DOWN Down function key

GLUT_KEY_PAGE_UP Page Up function key GLUT_KEY_PAGE_DOWN Page Down function key GLUT_KEY_HOME Home function key

GLUT_KEY_END End function key

GLUT_KEY_INSERT Insert function key

为了让上面processSpecialKeys函数能过编译通过,我们还必须定义,red,green,blue 三个变量。此外为了得到我们想要的结果,我们还必须修改renderScene函数。

...

// 所有的变量被初始化为1,表明三角形最开始是白色的。

float red=1.0, blue=1.0, green=1.0;

void renderScene(void) {

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

glPushMatrix();

glRotatef(angle,0.0,1.0,0.0);

// glColor3f设置绘制三角形的颜色。

glColor3f(red,green,blue);

glBegin(GL_TRIANGLES);

glVertex3f(-0.5,-0.5,0.0);

glVertex3f(0.5,0.0,0.0);

glVertex3f(0.0,0.5,0.0);

glEnd();

glPopMatrix();

angle++;

glutSwapBuffers();

}

。下面我们就该告诉GLUT,我们刚刚定义的函数用来处理,按键消息。也就是该调用glutKeyboardFunc和glutSpecialFunc函数。我们在main函数里调用它们。下面就是最新的main函数。

VC工程可以在这里下载(glut3.zip)

CTRL,ALT和SHIFT

一些时候我们想知道要是一个组合键(modifier key)也就是CTRL,ALT或者SHIFT被按下该如何处理。GLUT提供了一个函数来检测时候有组合键被按下。这个函数仅仅只能在处理按键消息或者鼠标消息函数里被调用。函数原型如下:

int glutGetModifiers(void);

这个函数的返回值是三个glut.h里预定义的常量里的一个,或它们的或组合。这三个常量是:

1:GLUT_ACTIVE_SHIFT: 返回它,当按下SHIFT键或以按下CAPS LOCK,注意两者同时按下时,不会返回这个值。

2:GLUT_ACTIVE_CTRL: 返回它,当按下CTRL键。

3:GLUT_ACTIVE_ATL:返回它,当按下ATL键。

注意,窗口系统可能会截取一些组合键(modifiers),这是就没有回调发生。现在让我们扩充processNormalKeys,处理组合键。按下r键时red变量被设置为0.0,当按下ATL+r时

red被设置为1.0。代码如下:

void processNormalKeys(unsigned char key, int x, int y) {

if (key == 27)

exit(0);

else if (key=='r') {

int mod = glutGetModifiers();

if (mod == GLUT_ACTIVE_ALT)

red = 0.0;

else

red = 1.0;

}

}

注意如果我们按下R键,将不会有什么发生,因为R与r键的ASCII码不同。即这是两个不同的键。最后就是如何检测按键CTRL+ALT+F1?。这种情况下,我们必须同时检测两个组合键,为了完成操作我们需要使用或操作符。下面的代码段,使你按下CTRL+ALT+F1时颜色改变为红色。

void processSpecialKeys(int key, int x, int y) {

int mod;

switch(key) {

case GLUT_KEY_F1 :

mod = glutGetModifiers();

if (mod == (GLUT_ACTIVE_CTRL|GLUT_ACTIVE_ALT)) {

red = 1.0; green = 0.0; blue = 0.0;

}

break;

case GLUT_KEY_F2 :

red = 0.0;

green = 1.0;

blue = 0.0; break;

case GLUT_KEY_F3 :

red = 0.0;

green = 0.0;

blue = 1.0; break;

}

}

键盘控制例子:场景漫游

让我们看一个比较好的使用键盘控制的例子。这一章我们将建立一个应用程序。这个程序绘制了一个小的居住着雪人的世界。并且我们将用方向键来移动照相机(即移动视点在场景中漫游)。左右方向键,将照相机绕y轴旋转,上下方向键,将前后方向移动照相机。

这个例子的代码放在下面。首先我们处理初始状态。

#include

#include

#include

#include

#include

static float angle=0.0,ratio;

static float x=0.0f,y=1.75f,z=5.0f;

static float lx=0.0f,ly=0.0f,lz=-1.0f;

static GLint snowman_display_list;

注意我们包含了math.h头文件。我们需要计算旋转角。上面变量的含义到后面你就会清楚了,但我们还是简单的描述下:

1:angle:绕y轴的旋转角,这个变量允许我们旋转照相机。

2:x,y,z:照相机位置。

3:lx,ly,lz:一个向量用来指示我们的视线方向。

4:ratio:窗口宽高比(width/height)。

5:snowman_display_list:一个雪人的显示列表索引。

注意:如果你不愿意用显示列表,你也可以忽略它,这并不影响,教程。

接下来,我们用一个公共的函数来处理窗口尺寸。唯一的区别是函数glutLookAt的参数用变量而不是固定的值。gluLookAt函数提供了一个简单直观的方法来设置照相机的位置和方向。它有三组参数,每一组由三个浮点型数组成。前三个参数表明照相机的位置,第二组参数定义照相机观察的方向,最后一组表明向上的向量,这个通常设为(0.0,1.0,0.0)。也就是说照相机并没有倾斜。如你想看到所有的物体都是倒置的则可以设置为(0.0,-1.0,0.0)。

上面提到的变量x,y,z表示照相机位置,因此这三个变量也就对应着函数gluLookAt里的第一组向量。第二组参数观察方向,是通过定义视线的向量和照相机位置相加得到的:

Look At Point=Line Of Sight+ Camera Position

void changeSize(int w, int h)

{

// 防止被0除.

if(h == 0)

h = 1;

ratio = 1.0f * w / h;

// Reset the coordinate system before modifying

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

//设置视口为整个窗口大小

glViewport(0, 0, w, h);

//设置可视空间

gluPerspective(45,ratio,1,1000);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

gluLookAt(x, y, z,

x + lx,y + ly,z + lz,

0.0f,1.0f,0.0f);

}

下面我们定义显示列表,绘制雪人,初始化场景,渲染场景。void drawSnowMan() {

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

//画身体

glTranslatef(0.0f ,0.75f, 0.0f);

glutSolidSphere(0.75f,20,20);

// 画头

glTranslatef(0.0f, 1.0f, 0.0f);

glutSolidSphere(0.25f,20,20);

// 画眼睛

glPushMatrix();

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

glTranslatef(0.05f, 0.10f, 0.18f); glutSolidSphere(0.05f,10,10);

glTranslatef(-0.1f, 0.0f, 0.0f); glutSolidSphere(0.05f,10,10);

glPopMatrix();

// 画鼻子

glColor3f(1.0f, 0.5f , 0.5f);

glRotatef(0.0f,1.0f, 0.0f, 0.0f); glutSolidCone(0.08f,0.5f,10,2);

}

GLuint createDL() {

GLuint snowManDL;

//生成一个显示列表号

snowManDL = glGenLists(1);

// 开始显示列表

glNewList(snowManDL,GL_COMPILE);

// call the function that contains // the rendering commands

drawSnowMan();

// endList

glEndList();

return(snowManDL);

}

void initScene() {

glEnable(GL_DEPTH_TEST);

snowman_display_list = createDL();

void renderScene(void) {

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //画了一个地面

glColor3f(0.9f, 0.9f, 0.9f);

glBegin(GL_QUADS);

glVertex3f(-100.0f, 0.0f, -100.0f);

glVertex3f(-100.0f, 0.0f, 100.0f);

glVertex3f( 100.0f, 0.0f, 100.0f);

glVertex3f( 100.0f, 0.0f, -100.0f);

glEnd();

//画了36个雪人

for(int i = -3; i < 3; i++)

for(int j=-3; j < 3; j++) {

glPushMatrix();

glTranslatef(i*10.0,0,j * 10.0);

glCallList(snowman_display_list);;

glPopMatrix();

}

glutSwapBuffers();

}

这里我们建立函数,处理特殊键按下消息。使用左右方向键旋转照相机,也就是改变视线。上下方向键使照相机沿视线前后移动。

void inputKey(int key, int x, int y) {

switch (key) {

case GLUT_KEY_LEFT :

angle -= 0.01f;

orientMe(angle);break;

case GLUT_KEY_RIGHT :

angle +=0.01f;

orientMe(angle);break;

case GLUT_KEY_UP :

moveMeFlat(1);break;

case GLUT_KEY_DOWN :

moveMeFlat(-1);break;

}

当我们按下左右方向键时angle变量改变,并且orientMe被调用。这个函数将旋转照相机。函数moveMeFlat负责在XZ平面里沿着某一视线移动照相机。

函数orientMe接受一个参数angle并且为视线的X,Z计算出适当的值。新的lx和lz映射在一个XZ平面的单位圆上。因此给定一个角度ang,新的lx,lz的值为:

Lx=sin(ang);

Lz=cos(ang);

就像我们把极坐标(ang,1)转换为欧几里德几何坐标一样。然后我们设定新的照相机方向。注意:照相机并未移动,照相机位置没变,仅仅改变了视线方向。

void orientMe(float ang) {

lx = sin(ang);

lz = -cos(ang);

glLoadIdentity();

gluLookAt(x, y, z,

x + lx,y + ly,z + lz,

0.0f,1.0f,0.0f);

}

下一个函数就是管理照相机移动的moveMeFlat。我们想沿视线移动照相机。为了完成这个任务,我们把视线里的一小部分加入到我们的当前的位置。新的X,Z的值为:

X=x+direction(lx)*fraction

Z=z+direction*(lz)*fraction

方向是1或者-1,这取决于我们是前移还是后移。这个fraction可以加速视实现。我们知道(lx,lz)是一个整体的向量。因此如果franction是个常数那么移动速度也就是一个常量。增大franction我们就可以移动的更快。接下来的步骤和orientMe函数一样。

void moveMeFlat(int direction) {

x = x + direction*(lx)*0.1;

z = z + direction*(lz)*0.1;

glLoadIdentity();

gluLookAt(x, y, z,

x + lx,y + ly,z + lz,

0.0f,1.0f,0.0f);

}

这时main函数如下:

int main(int argc, char **argv)

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);

glutInitWindowPosition(100,100);

glutInitWindowSize(640,360);

glutCreateWindow("SnowMen from 3D-Tech");

initScene();

glutSpecialFunc(inputKey);

glutDisplayFunc(renderScene); glutIdleFunc(renderScene);

glutReshapeFunc(changeSize);

glutMainLoop();

return(0);

}

完整代码为:

#include

#include

#include

#include

#include

static float angle=0.0,ratio;

static float x=0.0f,y=1.75f,z=5.0f;

static float lx=0.0f,ly=0.0f,lz=-1.0f;

static GLint snowman_display_list;

void drawSnowMan() {

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

//画身体

glTranslatef(0.0f ,0.75f, 0.0f);

glutSolidSphere(0.75f,20,20);

// 画头

glTranslatef(0.0f, 1.0f, 0.0f);

glutSolidSphere(0.25f,20,20);

// 画眼睛

glPushMatrix();

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

glTranslatef(0.05f, 0.10f, 0.18f);

glutSolidSphere(0.05f,10,10);

glTranslatef(-0.1f, 0.0f, 0.0f);

glutSolidSphere(0.05f,10,10);

glPopMatrix();

// 画鼻子

glColor3f(1.0f, 0.5f , 0.5f);

glRotatef(0.0f,1.0f, 0.0f, 0.0f);

glutSolidCone(0.08f,0.5f,10,2);

}

GLuint createDL()

{

GLuint snowManDL;

//生成一个显示列表号

snowManDL = glGenLists(1);

// 开始显示列表

glNewList(snowManDL,GL_COMPILE);

// call the function that contains

// the rendering commands

drawSnowMan();

// endList

glEndList();

return(snowManDL);

}

void myInit(void)

{

glEnable(GL_DEPTH_TEST);

snowman_display_list = createDL();

}

void myReshape(GLsizei w,GLsizei h)

{

// 防止被0除.

if(h == 0)

h = 1;

ratio = 1.0f * w / h;

// Reset the coordinate system before modifying

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

//设置视口为整个窗口大小

glViewport(0, 0, w, h);

//设置可视空间

gluPerspective(45,ratio,1,1000);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

gluLookAt(x, y, z,x + lx,y + ly,z + lz,0.0f,1.0f,0.0f);

}

void myDisplay(void)

{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//画了一个地面

glColor3f(0.9f, 0.9f, 0.9f);

glBegin(GL_QUADS);

glVertex3f(-100.0f, 0.0f, -100.0f);

glVertex3f(-100.0f, 0.0f, 100.0f);

glVertex3f( 100.0f, 0.0f, 100.0f);

glVertex3f( 100.0f, 0.0f, -100.0f);

glEnd();

//画了36个雪人

for(int i = -3; i < 3; i++)

for(int j=-3; j < 3; j++) {

glPushMatrix();

glTranslatef(i*10.0,0,j * 10.0);

glCallList(snowman_display_list);;

glPopMatrix();

}

glutSwapBuffers();

计算机图形学-图形的几何变换

贵州大学实验报告 学院:计算机科学与技术专业:软件工程班级:软件132 姓名常伟学号1308060226 实验地点一教704 实验时间2016.5.9 指导教师李智实验成绩 实验项目名称试验四、图形的几何变换 实验目的1.掌握矢量运算。 2.熟练使用齐次坐标。 3.掌握采用齐次坐标进行几何变换。 实验要求1.理解几何图形变换的原理,编程实现图形的几何变换。 2.编程界面友好,实现变换的所有方式,包括平移、缩放、旋转、对称、错切以及基本变换基础上的组合变换。 3.几何变换使用矩阵进行运算。

实验原理 二维齐次坐标变换的矩阵的形式是 ? ? ? ? ? ? ? ? ? ? i h g f e d c b a 这个矩阵的每一个元素都是有特殊含义的。其中,? ? ? ? ? ? e d b a 可以对图形进行缩放、旋 转、对称和错切等变换;? ? ? ? ? ? f c 是对图形进行平移变换;[]h g是对图形作投影变换;[]i 则是对图形进行缩放变换。 下面给出几个基本变换的矩阵运算。 1.平移变换 ? ? ? ? ? ? ? ? ? ? = ? ? ? ? ? ? ? ? ? ? + + = ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = ? ? ? ? ? ? ? ? ? ? ? ? 1 ) , ( 1 1 1 1 1 1 ' ' y x T y x y x t t t t t t y x y x y x y x 2.缩放变换 ? ? ? ? ? ? ? ? ? ? = ? ? ? ? ? ? ? ? ? ? ? ? = ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = ? ? ? ? ? ? ? ? ? ? 1 ) , ( 1 1 1 1 ' ' y x s s S y s x s y x s s y x y x y x y x 3.旋转矩阵 ? ? ? ? ? ? ? ? ? ? = ? ? ? ? ? ? ? ? ? ? + - = ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?- = ? ? ? ? ? ? ? ? ? ? 1 ) ( 1 cos sin sin cos 1 1 cos sin sin cos 1 ' ' y x R y x y x y x y x θ θ θ θ θ θ θ θ θ 4.对称矩阵 ? ? ? ? ? ? ? ? ? ? + + = ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = ? ? ? ? ? ? ? ? ? ? 1 1 1 1 ' ' ey dx by ax y x e d b a y x 对称变换其实只是a、b、d、e取0、1等特殊值产生的一些特殊效果。 5.错切变换 ? ? ? ? ? ? ? ? ? ? + + = ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = ? ? ? ? ? ? ? ? ? ? 1 1 1 1 1 1 ' ' y dx by x y x d b y x

图形学实验

天津理工大学实验报告 学院(系)名称:计算机与通信工程学院 姓名学号专业计算机科学与技术班级实验项目 课程名称计算机图形学课程代码 实验时间实验地点计算机软件实验室批改意见成绩 教师签字: 实验目的: 1. 采用glut创建图形窗口和实现人机交互功能。 2. 情节合理,交互操作简便灵活,动作过程平滑、真实。 实验内容: 1、设计一主题场景 2、场景中包括地形、天空和人物造型。 3、至少实现人物沿着地形行走的动作。 4、实现行走运动过程中的碰撞检测(可选做)。 5、实现交互式场景的浏览。

实验过程记录 虚拟校园漫游设计流程: 模块设计 公共基础模块: 提供场景视角变换,基本数学算法。 提供读入INI 文件接口。 场景设计模块 设计场景模型、地形布局。 设计地形,计算地形高度。 文件、资源管理模块: 向上提供模型、图片、纹理载入接口。 输入系统模块: 管理输入设备,提供交互系统接口。 对象管理模块: 管理静态动态实体,渲染图形。 控制动态实体动作。设计相关操作。 设计碰撞检测,漫游算法。 主要类的属性和方法的功能说明 class Ccamera 摄像机类 Milkshape 3d 实景照片 .3d .ms3d 场景数据 纹理材质 OpenGL 开发工具 漫游功能 在VS2008中制作虚拟校园漫游系统

static CCamera *m_pCamera; float dist_to_role;到英雄的矩离 vector3d position; 摄像机的位置 vector3d role_pos; 英雄的位置 float direction; 旋转角度 float pitch; 倾斜 int va;视角模式 int vm; 旋转模式 void FrameMove(void); 根据当前摄像机的位置角度变换矩阵 void Update(void); 更新摄像的参数,把它放到主循环中 class CTerrain地形类 unsigned int m_nWidth; 地形大小为m_iWidth*m_iWidth short* heightMap; 动态高程映射定义地形高度、为m_iWidth*m_iWidth矩阵 unsigned int m_nCellWidth; 每个格子的宽度 CTexture terrainTex; 地形上的多重纹理 void Render(void);插值计算地形高度并渲染 BOOL Init(int _width,char* TexFile);初始化高程映射和多重纹理 class CKeyboard键盘类 BOOL KeyDown(int key); key键是否按下 BOOL Update();更新键盘数据,放在主循环中 class CMouse鼠标类 BOOL ButtonDown(int button) 鼠标某键是否按下,0-左键,1-右键;/ void GetMovement(int &dx, int &dy); 获得光标坐标变化 SPoint2 GetMousePos();获得光标位置 void setmousepos(int dx, int dy) 设置光标位置 int GetWheelState();获得鼠标滚轮状态 BOOL Update();更新鼠标参数 struct SActiveObjPro动态实体的信息结构 void ChangeCurrFrame();改变当前帧 Update() 更新实体的信息结构 class Object游戏实体类的基类 float r1,r2;包围盒的半径,分别是x,y上的分量 class CActiveObj:public Object游戏中的活动实体 BOOL IsArrive(void);是否到达目的地 void SetActive(BOOL _active) 设定人物动作

计算机图形学--图形几何变换实现

实验五 图形几何变换的实现 班级:信计二班 学号: :解川 分数: 一、实验目的 为了掌握理解二维、三维的数学知识、变换原理、变换种类、变换方法;进一步理解采用齐次坐标进行二维、三维变换的必要性;利用VC++语言实现二维、三维图形的基本变换与复合变换。 二、实验容 (1) 理解采用齐次坐标进行图形变换的必要性——变换的连续性,使复合变换 得以实现。 (2) 掌握二维、三维图形基本变换的原理及数学公式。 (3) 利用VC++语言实现二维、三维图形的基本变换、复合变换,在评不上显 示变换过程或变换结果。 三、实验步骤 (1) 预习教材关于二维、三维图形变换的原理与方法。 (2) 使用VC++语言实现某一种或几种基本变换。 (3) 调试、编译、运行程序。 四、原理分析 源程序分别实现了对二维图形进行的平移变换—基本变换;对三维图形进行的绕某一个坐标轴旋转变换以及相对于立方体中心的比例变换—复合变换。 三维几何变换: (1) 比例变换: []1111z y x =[]1z y x T 3D =[]1z y x ????? ?? ?? ???s n m l r j i h q f e d p c b q 局部比例变换: s T =? ? ??? ???? ???1000000000000j e a 其中a 、b 、j 分别为在x 、y 、z 方向的比例系数。

整体比例变换: s T =? ? ??? ???? ???s 000010000100001其中s 为在xyz 方向的等比例系数。S>1时,整体缩小;s<1时,整体放大。 (2) 旋转变换: 旋转变换的角度方向为(沿坐标轴的反方向看去,各轴按逆时针方向旋转) 绕z 轴旋转: RZ T =?? ??? ???? ???-100 010000cos sin 00sin cos θθθθ 绕x 轴旋转: RX T =??????? ?? ???-10 00 0cos sin 00sin cos 000 01 θθθθ 绕y 轴旋转: RY T =????? ???? ???-10 0cos 0sin 00100sin 0cos θθθθ 程序代码: /*三维图形(立方体)旋转变换、比例变换*/ #include #include #include #include #include #include #define ZOOM_IN 0.9 #define ZOOM_OUT 1.1

计算机图形学课程设计书

计算机图形学课程设计 书 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

课程设计(论文)任务书 理学院信息与计算科学专业2015-1班 一、课程设计(论文)题目:图像融合的程序设计 二、课程设计(论文)工作: 自2018 年1 月10 日起至2018 年1 月12日止 三、课程设计(论文) 地点: 2-201 四、课程设计(论文)内容要求: 1.本课程设计的目的 (1)熟悉Delphi7的使用,理论与实际应用相结合,养成良好的程序设计技能;(2)了解并掌握图像融合的各种实现方法,具备初步的独立分析和设计能力;(3)初步掌握开发过程中的问题分析,程序设计,代码编写、测试等基本方法;(4)提高综合运用所学的理论知识和方法独立分析和解决问题的能力; (5)在实践中认识、学习计算机图形学相关知识。 2.课程设计的任务及要求 1)基本要求: (1)研究课程设计任务,并进行程序需求分析; (2)对程序进行总体设计,分解系统功能模块,进行任务分配,以实现分工合作;(3)实现各功能模块代码; (4)程序组装,测试、完善系统。 2)创新要求: 在基本要求达到后,可进行创新设计,如改进界面、增加功能或进行代码优化。

3)课程设计论文编写要求 (1)要按照书稿的规格打印誊写课程设计论文 (2)论文包括封面、设计任务书(含评语)、摘要、目录、设计内容、设计小结(3)论文装订按学校的统一要求完成 4)参考文献: (1)David ,《计算机图形学的算法基础》,机械工业出版社 (2)Steve Cunningham,《计算机图形学》,机械工业出版社 (3) 5)课程设计进度安排 内容天数地点 程序总体设计 1 实验室 软件设计及调试 1 实验室 答辩及撰写报告 1 实验室、图书馆 学生签名: 2018年1月12日 摘要 图像融合是图像处理中重要部分,能够协同利用同一场景的多种传感器图像信息,输出一幅更适合于人类视觉感知或计算机进一步处理与分析的融合图像。它可明显的改善单一传感器的不足,提高结果图像的清晰度及信息包含量,有利于更为准确、更为可靠、更为全面地获取目标或场景的信息。图像融合主要应用于军事国防上、遥感方面、医学图像处理、机器人、安全和监控、生物监测等领域。用于较多也较成熟的是红外和可见光的融合,在一副图像上显示多种信息,突出目标。一般情况下,图像融合由

图形学场景设计

图形学场景设计

计算机图形学课程设计报告 题目自然场景设计 院(系、部) 专业班级 学号

姓名成绩

1 设计目的与要求 1.1设计题目 自然场景设计 1.2 设计目的 以小组合作的方式绘制一个自然场景,给绘制的实体添加纹理光照效果,进一步巩固所学知识,提高团队合作能力 1.3 设计要求 (1)采用真实感图形学技术设计一个自然场景(2)模拟出水、云、山体等至少三种景物(3)实现场景的漫游 (4)对设计出的图像进行光照处理 (5)将图片的纹理贴附到物体表面 2 总体设计 2.1 功能简介 创建一个900*600的Windows窗口,在窗口中显示冰箱、电灯、茶壶三个实体,根据电灯位置在

地面上绘制个实体的投影;为茶壶添加纹理;利用键盘的方向键控制冰箱旋转,实现场景漫游2.2 功能模块图 主 初始化实体绘键盘操 作函数 电灯冰箱 茶壶 2.3 软件各模块功能介绍 2.3.1冰箱和茶壶的绘制 由四边形拼接出冰箱,通过平移旋转函数放置到指定位置,同时实现茶壶的绘制,在茶壶上添加纹理效果,通过平移旋转变换放置到冰箱上面2.3.2顶灯的绘制

绘制出一个带灯罩的电灯,并且将光源放置在灯泡的位置 2.3.3 设置光照 设置光照的各种参数,为场景添加光照效果,让实体具有立体效果 2.3.4 纹理图片生成 用数组存储一幅自己设计的纹理图片,方便实体添加纹理效果时的调用 2.3.5 影子生成 根据需求为场景中的实体添加阴影效果,使得场景效果更加逼真 2.3.6 法向量设置 为场景设置法向量,确保实体在不同的角度都能被看到 3 详细设计及关键代码 3.1 光照模块详细设计 3.1.1 光照设置功能 设置光照的各种参数,为场景添加光照效果,让实体具有立体效果 3.1.2 光照设置设计

《计算机图形学》答案,第六章

第六章曲线和曲面 3、参照Hermite三次曲线的几何形式,试用B[P 0 P 1 P u P 1 u P uu P 1 uu]T , 推导相 应五次曲线的调和函数和系数矩阵M。 解:设Hermite五次曲线的几何形式为: P(t)=a5t5 + a4t4 + a3t3 + a2t2 + a1t + a0其中 t∈[0,1] 按题意,已知曲线两端点的坐标值P0 P1 曲线两端点的一阶导数值P0u P1u 曲线两端点的二阶导数值P0uu P1uu 则求出系数a5,a4,a3,a2,a1,a0 则P(t)就可确定; 由于P(t)= a5t5 + a4t4 + a3t3 + a2t2 + a1t + a0其中 t∈[0,1] P’(t)=5a5t4 + 4a4t3 + 3a3t2 + 2a2t + a1 P”(t)=20a5t3+12a4t2+6a3t+2a2 P0=P(0)=a0 P1=P(1)=a5+a4+a3+a2+a1+a0 P0’=P’(0)=a1 P1’=P’(1)=5a5+4a4+3a3+2a2+a1 P0”=P”(0)=2a2 P1”=P”(1)=20a5+12a4+6a3+2a2 所以 a0 = P(0) a1 =P’(0) a2 =P”(0)/2 a3 = 10P(1)- 10P(0) - 4P’(1) - 6P’(0) + P”(1)/2 - 3P”(0)/2 a4 =-15P(1)+ 15P(0) + 7P’(1) + 8P’(0) - P”(1) - 3P”(0)/2 a5 = 6P(1)- 6P(0) - 3P’(1) - 3P’(0) - P”(0)/2 + P”(1)/2 => P(t)=[ -6P(0) + 6P(1) - 3P’(0) - 3P’(1) - P”(0)/2 + P”(1)/2] t5 +[+15P(0) - 15P(1) + 8P’(0) + 7P’(1) + 3P”(0)/2 ] t4 +[-10P(0) + 10P(1) - 6P’(0) - 4P’(1) - 3P”(0)/2 + P”(1)/2] t3 + [ P”(0)/2] t2 + [P’(0)] t +P(0) 整理得: P(t) = (-6t5 + 15t4 - 10t3 + 1) P(0) + (6t5-15t4+10t3) P(1) + (-3t5 + 8t4 -6t3 + t) P’(0) + (-3t5 +7t4-4t3) P’(1) + (-t5/2+ 3t4/2-3t3/2+t2/2) P”(0) + (t5/2-t4+t3/2) P”(1) 故调和函数为: F(0)= -6t5 + 15t4 - 10t3 + 1 F(1)= 6t5 - 15t4 + 10t3 F(2)= -3t5 + 8t4 - 6t3 + t F(3)= -3t5 + 7t4- 4t3 F(4)= -t5/2 + 3t4/2 -3t3/2 + t2/2

(计算机图形学)关于任意直线的对称变换

实验3:关于任意直线的对称变换 实验类型:验证、设计 所需时间:3学时 主要实验内容及要求: 对于任意直线的二维图形对称变化的实验,要求输入的直线是任意直线,直线的端点只能由键盘输入或者鼠标拾取,要做对称变换的图形也是一个任意图形(至少应是一个任意多边形)。 对称变换,先分析如何使用一系列简单变换来构造题目要求的复合变换。本体要实现的变换可以用如下一组变换组合来实现: ①将直线任一点移至与坐标原点重合 ②将平移后的直线绕原点旋转至与某一坐标轴重合 ③将题目要求的对称变换转为实现已知图形关于上述坐标轴的对称变换 ④按逆序求上述①、②变换的逆变换 ⑤将上述矩阵依次相乘得到最终的复合变换矩阵 则某一多边形关于任意直线的对称变换就转变为将该多边形的各顶点与上述求得的复合变换进行矩阵乘法,求得变换后的新多边形的各个顶点坐标。 根据上述流程,编程实现,并测试程序功能。 源代码: #include #include using namespace std;

void Initial(void) { glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0); } class CPoint { public: int x; int y; CPoint(){} CPoint(int x1,int y1) { x=x1; y=y1; } static CPoint ZeroMoveToXY(CPoint p, CPoint XY);//原始坐标向屏幕坐标XY 的平移 static CPoint ToZero(CPoint p);//关于原点对称 static CPoint XYMoveToZero(CPoint p, CPoint XY);//XY坐标向屏幕坐标的平移

计算机图形学简介及未来应用和发展方向

计算机图形学简介及未来应用和发展方向 姓名: 王清晓 专业班级: 信计试点10 学号: 201011011114

摘要: 客观世界的事物是多姿多彩的,而呈现的往往是他们的外观,通过外观人们进一步研究他们。以图片的表现形式展示信息成为一种很直接的表现形式,与其他的表现形式相比,图形更容易记忆并且为人们所理解,能更加直观的表现出来。随着科技发展,人们开始用计算机来处理图形信息,计算机图形学因此诞生,随即成为一个人们探索的一个新的领域。 一.计算机图形学起源 1950年,麻省理工学院的显示器显示了简单的图形。交互式图形终端随之诞生。在20实际50年代,计算机还不适应交互式使用,计算机图形学发展缓慢,那时的计算机主要用于大量数据的冗长的数据计算,50年代末期,交互式计算机诞生,随即计算机图形学开始走进人们的视野。这一时期计算机图形学得到了史无前例的飞速发展。 1962年麻麻省理工学院的Ivan E.sutherland发表了题为“人—机图形通信系统”的论文,向人们证实了图形显示是一个极其具有生命力有前途的研究领域。60年代中期,计算机图形学进入了发展的黄金年代。 70年代计算机图形学发展大有收获,这些技术广泛应用到了计算机辅助设计,事务管理,过程控制,教育等诸多领域。20

世纪90年代以来,科学计算的可视化,虚拟现实环境的应用又向计算机图形学提出了诸多问题,使得三维及多维图形学在真实性和实时性方面有了巨大的发展。 计算机图形学是人机交互最有效的最通俗的手段。计算机图形的显示对用户有强大的吸引力,直观清晰的特性拓展了其应用范围。集成电路的发展为图形学提供了坚强的硬件支持,图形学也使得硬件的工作效率大幅度提高。这一学科必将继续且长期持续发展。 二:计算机图形学简介 随着计算机技术的快速发展,涉及到图形学的方面越来越多,应用也变得越来越深入,比如卫星照片的处理,汽车零部件的图形显示等等。经过多年的发展,逐渐形成了多个与图形学相关的分之科学,计算机图形学,图像处理和模式识别就是其代表。 计算机图形学就是使用计算机进行图像和图形的输出的技术。计算机图形学是研究如何是计算机的内部数据显示为外观可视化图形的技术,并在专门的设备上显示的原理,方法和技术的学科。综合了计算机技术和科学计算方面的知识。 图形是对对象的一种外在显示,是对对象的有关信息的具体体现,所谓对象,可以是指各类具体的事物,比如零件,建筑等等,可以使抽象的,如天气分析,人口分布,经济增长趋势等等。能够正确的表达出对象的基本特征,性质,结构,和行为的描述

计算机图形学

计算机图形学 姓名:李倩倩 班级:硕研10-14 学号: 第一题: #include <> #include <> void MidpintLine( HDC hDC,int x0,int y0,int x1,int y1,unsigned long color) { int a,b,delta1,delta2,d,x,y; a=y0-y1; b=x1-x0; d=2*a+b; delta1=2*a; delta2=2*(a+b); x=x0; y=y0; SetPixel(hDC,x,y,color); while(x0) xinc=1; else xinc=-1; if(dy>0) yinc=1; else yinc=-1; dx=abs(dx);dy=abs(dy); int x=xs,y=ys; int i=0; if(dx==0&&dy==0) SetPixel(pdc,x,y,color); SetPixel(hDC,x,y,color); else if(dx==0) { for(i=0;i

计算机图形学作业答案

计算机图形学作业答案 第一章序论 第二章图形系统 1.什么是图像的分辨率? 解答:在水平和垂直方向上每单位长度(如英寸)所包含的像素点的数目。 2.计算在240像素/英寸下640×480图像的大小。 解答:(640/240)×(480/240)或者(8/3)×2英寸。 3.计算有512×512像素的2×2英寸图像的分辨率。 解答:512/2或256像素/英寸。 第三章二维图形生成技术 1.一条直线的两个端点是(0,0)和(6,18),计算x从0变到6时y所对应的值,并画出结果。 解答:由于直线的方程没有给出,所以必须找到直线的方程。下面是寻找直线方程(y =mx+b)的过程。首先寻找斜率: m =⊿y/⊿x =(y 2-y 1 )/(x 2 -x 1 )=(18-0)/(6-0) = 3 接着b在y轴的截距可以代入方程y=3x+b求出 0=3(0)+b。因此b=0,所以直线方程为y=3x。 2.使用斜截式方程画斜率介于0°和45°之间的直线的步骤是什么? 解答: (1)计算dx:dx=x 2-x 1 。 (2)计算dy:dy=y 2-y 1 。 (3)计算m:m=dy/dx。 (4)计算b: b=y 1-m×x 1 (5)设置左下方的端点坐标为(x,y),同时将x end 设为x的最大值。如果 dx < 0,则x=x 2、y=y 2 和x end =x 1 。如果dx > 0,那么x=x 1 、y=y 1 和x end =x 2 。 (6)测试整条线是否已经画完,如果x > x end 就停止。 (7)在当前的(x,y)坐标画一个点。 (8)增加x:x=x+1。 (9)根据方程y=mx+b计算下一个y值。 (10)转到步骤(6)。 3.请用伪代码程序描述使用斜截式方程画一条斜率介于45°和-45°(即|m|>1)之间的直线所需的步骤。

计算机图形学基础第五章课后习题答案

5.3 试用中点Bresenham 算法画直线段的原理推导斜率在[-1,0]之间的直线段绘制过程(要求写清原理、误差函数、递推公式以及最终画图过程)。 解: 原理:每次在最大位移方向上走一步,而另一个方向是走步还是不走步取决于误差项的判别。 ∵斜率k 在[-1,0]之间 ∴x 为最大位移方向,每次在x 加1,而y 或减1或减0。 设直线段的方程F(x,y)=y-kx-b ,假设当前点是P(x i ,y i ),则下一点在P u (x i +1,y i )与P d (x i +1,y i -1)中选一。设M 为P u 和P d 的中点,则M 点的坐标为(x i +1,y i -0.5)。 构造误差判别式: d i =F(x M ,y M )=F(x i +1,y i -0.5)= y i -0.5-k(x i +1)-b 若d i ≥0,取P d (x i +1,y i -1); 若d i <0,取P u (x i +1,y i ); 即有x i+1=x i +1,y i+1=y i -1(d i ≥0)或y i (d i <0)。 误差函数的递推: d i ≥0时,取P d (x i +1,y i -1),再判断下一像素取哪个时,应计算 d i+1=F(x i +2,y i -1.5)= y i -1.5-k(x i +2)-b=d i -1-k ,增量为-1-k 。 d i <0时,取P u (x i +1,y i ),再判断下一像素取哪个时,应计算 d i+1=F(x i +2,y i -0.5)= y i -0.5-k(x i +2)-b=d i -k ,增量为-k 。 (x 0,y

计算机图形学 图形几何变换的实现

计算机图形学图形几何变换的实现

————————————————————————————————作者:————————————————————————————————日期:

实验五图形几何变换的实现 班级08信计2 学号89姓名徐阳分数 一、实验目的和要求: 1、掌握理解二维、三维变换的数学知识、变换原理、变换种类、变换方法;进一步理解采用齐次坐标进行二维、三维变换的必要性;利用Turboc实现二维、三维图形的基本变换和复合变换。 二、实验内容: 1、理解采用齐次坐标进行图形变换的必要性——变换的连续性,使复合变换得以实现。 2、掌握二维、三维图形基本变换(平移、缩放、对称、旋转、错切)的原理及数学公式。 3、利用Turboc实现二维、三维图形的基本变换、复合变换,在屏幕上显示变换过程或变换结果。 三、实验结果分析: 程序代码如下: /*二维图形(直线)平移变换*/ #include #include #include main() {int x0,y0,x1,y1,i,j; int a[3][3]; char key; for(i=0;i<3;i++) for(j=0;j<3;j++) a[i][j]=0; for(i=0;i<3;i++) a[i][i]=1; int graphdriver=DETECT; int graphmode=0; initgraph(&graphdriver,&graphmode," "); cleardevice(); x0=250;y0=120;x1=350;y1=220; line(x0,y0,x1,y1); for( ; ;) {outtextxy(100,400,"<-:left->:right^:up v:down Esc->exit"); key=getch();

计算机图形学答案,第七章

习题 2.试证明下述几何变换的矩阵运算具有互换性: (1)两个连续的旋转变换;(2)两个连续的平移变换; (3)两个连续的变比例变换;(4)当比例系数相等时的旋转和比例变换; (1)证明:设第一次的旋转变换为: cosθ1 sinθ1 0 T1= - sinθ1 cosθ1 0 0 0 1 第二次的旋转变换为: Cosθ2 s inθ2 0 T2= - sinθ2 cosθ2 0 0 0 1 则因为 T1*T2 = cosθ1 sinθ1 0 cosθ2 sinθ2 0 - sinθ1 cosθ1 0 - sinθ2 cosθ2 0 0 0 1 0 0 1 = cosθ1 cosθ2+sinθ1 sinθ2 cosθ1 sinθ2+ sinθ1 cosθ2 0 - sinθ1 cosθ2- cosθ1 sinθ2 -sinθ1 sinθ1+ cosθ1 cosθ2 0 0 0 1 Cos(θ1+θ2)sin(θ1+θ2) 0 = - sin(θ1+θ2) cos(θ1+θ2) 0 0 0 1 cosθ2 sinθ2 0 cosθ1 sinθ1 0 T2*T1 = - sinθ2 cosθ2 0 - sinθ1 cosθ1 0 0 0 1 0 0 1

cosθ1 cosθ2+ sinθ1 sinθ2 cosθ1 sinθ2+ sinθ1 cosθ2 0 = - sinθ2cosθ1- cosθ2 sinθ1 -sinθ1 sinθ1+ cosθ1 cosθ2 0 0 0 1 Cos(θ1+θ2)sin(θ1+θ2) 0 = - sin(θ1+θ2) cos(θ1+θ2) 0 0 0 1 即T1*T2= T2*T1, 两个连续的旋转变换具有互换性 (2)证明:设第一次的平移变换为: 1 0 0 T1= 0 1 0 Tx1 Ty1 1 第二次的平移变换为: 1 0 0 T2= 0 1 0 Tx2 Ty2 1 则因为 T1*T2 = 1 0 0 1 0 0 0 1 0 0 1 0 Tx1 Ty1 1 Tx2 Ty2 1 1 0 0 = 0 1 0 Tx1+Tx2 Ty1+Ty2 1 而 T2*T1 = 1 0 0 1 0 0 0 1 0 0 1 0 Tx2 Ty2 1 Tx1 Ty1 1 1 0 0 = 0 1 0

计算机图形学在实际中的应用

计算机图形学在实际中的应用 1963年,伊凡?苏泽兰在麻省理工学院发表了名为《画板》的博士论文,它标志着计算机图形学的正式诞生。至今已有四十多年的历史。此前的计算机主要是符号处理系统,自从有了计算机图形学,计算机可以部分地表现人的右脑功能了,所以计算机图形学的建立具有重要的意义。现在计算机图形学有了长足的发展。 对于我们目前来说,计算机图形学能让我们感受到的主要在游戏和电影上的应用。比如《魔兽世界》、《使命召唤》等各类大型3D游戏,以及《阿凡达》等3D电影。我们享受着计算机图形学快速发展带来的各种便利中。 在电脑游戏中,计算机图形学的首要任务就是实现电脑游戏中的虚拟场景,这主要通过在计算机中重现真实世界场景来实现。游戏编程的主要任务是要模拟真实物体的物理属性,即物体的形状,光学性质,表面的纹理和粗糙程度,以及物体间的相对位置、遮挡关系等等。其中,光照和表面属性是最难模拟的。为了模拟光照,已有各种各样的光照模型。从简单到复杂排列分别是:简单光照模型、局部光照模型和整体光照模型。从绘制方法上看有模拟光的实际传播过程的光线跟踪法,也有模拟能量交换的辐射度方法。除了在计算机中实现逼真物理模型外,电脑游戏中图形学应用的另一个研究重点是加速算法,力求能在最短时间内绘制出最真实的场景,提高游戏的流畅度。 计算机图形学不仅在我们的娱乐中给我们带来越来越逼真的体验。没有计算机图形学的快速发展,iphone、android等智能手机将不能给我们带来现在这样好的体验。其实计算机图形学的在我们生活中的应用领域非常的广。 计算机图形学还应用在科学计算可视化方面。在数值仿真、气象卫星、石油勘探、遥感卫星、医学影像、蛋白质分子结构等都会产生大量的数据,即使是专业人员也们很难从一大堆枯燥乏味的数字中迅速发现其内在规律和变化趋势。计算机图形学帮助科技人员更直观形象地理解大规模数据所蕴涵的科学现象和规律。比如我现在正在学习的数字信号处理这门课程,全部都是对数据的分析处理,如果没有MatLab这个计算软件的话,学习将比现在还痛苦。而Matlab就是计算机图形学在科技计算方面的一个软件。它的全称叫做MA Trix LABoratory,将成为21世纪的语言。 现在在电子设计方面,国内外基本上全部转移到计算机上来。各种电路仿真软件,电路设计软件,极大的方便了硬件的设计。EDA技术的快速发展,也是由于计算机图形学的快速发展而产生的。也是计算机图形学的一个应用领域:计算机辅助设计和计算机辅助制造。 在工程和产品设计中,计算机可以帮助设计人员担负计算、信息存储和制图等项工作。在设计中通常要用计算机对不同方案进行大量的计算、分析和比较,以决定最优方案;各种设计信息,不论是数字的、文字的或图形的,都能存放在计算机的内存或外存里,并能快速地检索;设计人员通常用草图开始设计,将草图变为工作图的繁重工作可以交给计算机完成;利用计算机可以进行与图形的编辑、放大、缩小、平移和旋转等有关的图形数据加工工作。 在计算机辅助制造这一应用中,对于机械制造业,利用电子数字计算机通过各种数值控制机床和设备,自动完成离散产品的加工、装配、检测和包装等制造过程,极大的减轻人

计算机图形学简明教程张彩明版第6章习题参考答案

习题参考答案 6.1交互式绘图系统基本的交互任务有哪些? 答:1定位,2笔画,3定值,4选择,5拾取,6字符串,7三维交互。 6.2编写程序实现橡皮筋技术画直线和圆。 答:思想:首先将绘图模式设定为异或。 画直线时,点击鼠标左键,光标所在位置即为直线的起点,用鼠标牵引光标移动,当前光标所在位置即认为是直线的终点。光标从原位置移动到新位置时,首先在起点与原位置之间画一条直线,因为是异或模式,原有直线变为不可见,然后再在起点与新位置之间画一条直线,作为当前直线。 画圆时,点击鼠标左键,光标所在位置即为圆的圆心,用鼠标牵引光标移动,当前光标所在位置与圆心的距离即被认为是圆的半径。当鼠标牵引光标从原位置移动到新位置时,首先在以圆心与原位置的距离为半径画圆,因为是异或模式,原有的圆变为不可见,然后再以圆点与新位置的距离为半径画圆,作为当前圆。 6.3引力场是人机交互中的常见的辅助技术,它能给用户带来什么便利?设计人员在 设计引力场的时候需要注意什么问题? 答:用户用光标进行选图操作时,引力场的使用可使光标较容易地定位在选择区域小的图形上。设计人员在设计引力场时,引力场的大小要适中,外形应与其所含图形的外形一致。 6.4图形模式和图像模式下,拖拽的处理方法有什么不同? 答:图形模式下的拖拽是在异或的绘图模式下进行的。首先在原位置再次绘制要拖拽图形,由于自身异或的结果为空,原位置处的图形变为不可见,然后在新位置处绘制图形,实现了图形的拖拽。而图像模式下的拖拽,则是进行了图像的整体移动,即首先在要经过位置处按拖动图像大小保存原有屏幕图像,然后将拖动的图像整体移动到该位置,当图像离开该位置而移动到下一个新位置时,再恢复该位置保存的屏幕图像。图形模式不需要保存屏幕图像,只需在原位置重绘图形。 图像模式需要保存图像经过处的屏幕图像,并在移开后重新显示保存的屏幕图像。 6.5请叙述三种输入控制模式的流程。 答:请求模式下,用户在接收到应用程序请求后才输入数据;应用程序等待用户输入数据,输入结束,才进行处理。程序与输入串行运行。 样本模式下,应用程序与输入设备将各自独立运行,信息的输入和程序中的输入命令无关。设置为取样模式的设备将源源不断地把信息送入数据缓存区,取代原有数据,而不必等待应用程序的输入语句。当应用程序执行到输入指令时,就会把相应物理设备当前的输入值作为取样值加以处理。 事件模式下,输入过程和应用程序并发运作。所有输入数据(或事件)都被存放在一个事件队列中,该队列以事件发生的时间排序。用户在输入设备上完成

计算机图形学第6章课后习题参考答案

第六章 1.请简述朗伯(Lambert )定律。 设物体表面在P 点法线为N ,从P 点指向光源的向量为 L ,两者夹角为θ,则点P 处漫反射光的强度为: I d =I p k d cos θ 式中 : I d ——表面漫反射光的亮度; I p ——入射光的光亮度; K d ——漫射系数(决定于表面材料及入射光的波长) 0≤K d ≤l ; θ——入射光线与法线间的夹角,0≤θ≤π/2。 并且,当物体表面垂直于入射光方向时(N 、L 方向一致)看上去最亮,而θ越来越大,接近90°时,则看上去越来越暗。 2.试写出实现哥罗德(Gouraud )明暗处理的算法伪代码。 deltaI = (i2 - i1) / (x2 - x1); for (xx = x1; xx < x2; xx++) { int offset = row * CScene.screenW + xx; if (z < CScene.zBuf[offset]) { CScene.zBuf[offset] = z; CScene.frameBuf[offset] = i1; } z += deltaZ; i1 += deltaI; } 3. 在Phong 模型n s p d p a a V R K I N L K I K I I )()(?+?+=中,三项分别表示何含义?公式 中的各个符号的含义指什么? 三项分别代表环境光、漫反射光和镜面反射光。a I 为环境光的反射光强,p I 为理想漫

反射光强,a K 为物体对环境光的反射系数,d K 为漫反射系数,s K 为镜面反射系数,n 为 高光指数,L 为光线方向,N 为法线方向,V 为视线方向,R 为光线的反射方向。 4.试写出实现Phong (冯)明暗方法的伪代码。 for (xx = x1; xx < x2; xx++) { int offset = row * CScene.screenW + xx; if (z < CScene.zBuf[offset]) { CScene.zBuf[offset] = z; pt = face.findPtInWC(u,v); float Ival = face.ptIntensity; CScene.frameBuf[offset] = Ival; } u += deltaU; z += deltaZ; p1.add(deltaPt); n1.add(deltaN); } 5.请简述自身阴影的生成方法。 自身阴影生成过程如下: (1)首先将视点置于光源位置,以光线照射方向作为观察方向,对在光照模型下的物体实施消隐算法,判别出在光照模型下的物体的“隐藏面”,并在数据文件中加以标识; (2)然后按实际的视点位置和观察方向,对物体实施消隐算法,生成真正消隐后的立体图形; (3)检索数据文件,核查消隐后生成的图形中,是否包含有在光照模型下的“隐藏面”。如有,则加以阴影符号标识这些面。 6.试写出光线跟踪算法的C 语言描述。 /*TraceRay 的三个参数分别是起点start ,跟踪方向direction 和已跟踪的深度depth ,返回的是光线direction 的颜色。*/ Color TraceRay(start,direction,depth) V ector start,direction; Int depth; { if (depth>MAX_DEPTH) color=black; else { 光线与物体求交,找出离start 最近的交点; if (无交点) color=背景色;

图形学实验报告三维图形

图形学课程设计 题目:三维真实感图形设计与绘制专业:计算机科学与技术 学号姓名:

一. 一)课程设计目的与要求 图形学课程设计的主要目的是让同学们通过图形学的实际问题应用,进一步增强计算机图形学理论的理解、算法应用、图形数据结构设计与图形程序设计等,从而提高图形学实际应用与软件开发能力。 二)课程设计题目 三维真实感图形设计与绘制 三)问题的提出与需求分析 (1)题目内容说明:本题目要求应用OpenGL的光照技术和纹理技术实现一个简单的三维真实感图形的程序设计。具体要求实现功能: 1)通过对话方式实现交互式设计光照模型功能。 2)实现三维模型纹理映射功能。 3)用鼠标跟踪球方法实现三维模型的空间旋转。 (2)技术要点说明 1)三维模型显示场景树:将三维可视化模型场景内容分解用一种树或表数据结构描述。 2)实现一个读Targa文件的程序:Targa是一种常见的图像格式文件,该文件通常以未压缩的格式存储图像。 3)实现鼠标跟踪球方法程序。 二.设计思路 要设计一个良好的场景和优秀的交互方式,现在虚拟现实场景十分繁多,各种交互 方式也五花八门,我们要选择特定的场景,场景要保证两点:一是其新鲜性,让人耳目 一新,否则会让人有过于老套的感觉;另外就是其真实度,这是本次课题的着重关注点;在选取选定的场景后,我们要定义各交互方式,在从现有可得到的交互方式案例中提取和创新,以保证开发出来的交互方式可以最大程度的提高人机交互的效率。 场景的规模是必须考虑的,因为设计的时间和人员有限,必须限制场景规模,没有时间和人力去开发过大的场景规模,但是如果场景规模过小,演示系统就无法给人带来非常强烈的真实感冲击,而且过小规模的场景也会限制交互方式的设计和开发;所以定义适当的场景规模,对于课题的成败十分重要。 通过对计算机图形学和三维人机交互方式等相关书籍和文献的阅读和学习,了解和掌握建立真实图形显示系统的过程和三维虚拟场景中人机交互的方式。 三维图形及动画场景的显示,就是把所建立的三维空间模型,经过计算机的复杂处理,最终在计算机二维屏幕上显示的过程,并且在显示的过程要保证其真实感。一般,设计三维图形软件要经过以下步骤: (1)图元建立三维模型。 (2)设置观看物体的窗口和观看点(视点)。 (3)设定各物体的属性(如色彩、光照、纹理映射等) (4)如果要物体动起来,还要进行图形变换(如几何变换、视窗变换和投影变换等)。 (5)三维图形的二维化。 流程如下:

相关文档
相关文档 最新文档