您的位置:首页 > 理论基础

计算机图形学-实验5-掌握Bezier样条曲面生成思想、复习基本图元绘制、交互操作和几何变换相关内容

2017-05-07 09:52 459 查看
实验五:(2学时)
 

一、 实验目的:

掌握Bezier样条曲面生成思想、复习基本图元绘制、交互操作和几何变换相关内容

 

二、 实验内容:

1、在窗口中画三维坐标,包括原点和三个坐标轴;

2、画一条Bezier样条曲面,包含4*4个控制点;

3、利用鼠标或键盘控制曲面在屏幕上移动、旋转和放缩;

4、用鼠标调整控制点的位置,观察曲面变化

 

三、 实现效果及步骤(或流程)

1、在窗口中画三维坐标,包括原点和三个坐标轴;

a) 实现效果:


 
b) 实现步骤:

(1)画原点

//原点
glColor3d(0.0, 1.0, 0.0);
glBegin(GL_POINTS);
glVertex3f(0, 0, 0);
glEnd();


(2)画x轴以及标识

//画x轴
glColor3d(1.0, 0.0, 0.0);
glBegin(GL_LINES);
glVertex3f(-linex1, liney1, linez1);
glVertex3f(linex1, liney1, linez1);
glEnd();
//画x标识
glBegin(GL_LINES);
glVertex3f(linex1 + 5, liney1, linez1);
glVertex3f(linex1 + 15, liney1 - 10, linez1);
glEnd();
glBegin(GL_LINES);
glVertex3f(linex1 + 5, liney1 - 10, linez1);
glVertex3f(linex1 + 15, liney1, linez1);
glEnd();


 

(3)画y轴以及标识

//画y轴
glColor3d(0.0, 1.0, 0.0);
glBegin(GL_LINES);
glVertex3f(linex2, -liney2, linez2);
glVertex3f(linex2, liney2, linez2);
glEnd();
//画y标识
glBegin(GL_LINES);
glVertex3f(linex2 - 10, liney2 + 5, linez2);
glVertex3f(linex2 - 5, liney2, linez2);
glEnd();
glBegin(GL_LINES);
glVertex3f(linex2, liney2 + 5, linez2);
glVertex3f(linex2 - 5, liney2, linez2);
glEnd();
glBegin(GL_LINES);
glVertex3f(linex2 - 5, liney2 - 7, linez2);
glVertex3f(linex2 - 5, liney2, linez2);
glEnd();


(4)画z轴以及标识

//z轴 蓝
glColor3d(0.0, 0.0, 1.0);
glBegin(GL_LINES);
glVertex3f(linex3, liney3, -linez3);
glVertex3f(linex3, liney3, linez3);
glEnd();
//画z
glBegin(GL_LINES);
glVertex3f(linex3 + 2, liney3, linez3);
glVertex3f(linex3 + 12, liney3, linez3);
glEnd();
glBegin(GL_LINES);
glVertex3f(linex3 + 2, liney3 - 7, linez3);
glVertex3f(linex3 + 12, liney3, linez3);
glEnd();
glBegin(GL_LINES);
glVertex3f(linex3 + 2, liney3 - 7, linez3);
glVertex3f(linex3 + 12, liney3 - 7, linez3);
glEnd();


2、画一条Bezier样条曲面,包含4*4个控制点;

a) 实现效果:

 


b) 实现步骤:

(1)初始化坐标

//初始坐标
GLfloat ctrlPts[4][4][3] = { { { -45, -45, 120 },{ -15, -45, 60 },{ -15, -45, -30 },{ 45, -45, 60 } },{ { -45, -15, 30 },{ -15, -15, 90 },{ 15, -15, 0.0 },{ 45, -15, -30 } },{ { -45, 15, 120 },{ -15, 15, 0.0 },{ 15, 15, 90 },{ 45, 15, 120 } },{ { -45, 45, -60 },{ -15, 45, -60 },{ 15, 45, 0.0 },{ 45, 45, -30 } } };


(2)画曲面

//画曲面
for (j = 0; j <= 10; j++)
{
glBegin(GL_LINE_STRIP);
for (i = 0; i <= 10; i++)
{
glEvalCoord2f((GLfloat)i / 10.0, (GLfloat)j / 10.0);
//调用求值器
}
glEnd();
glBegin(GL_LINE_STRIP);
for (i = 0; i <= 10; i++)
{
//调用求值器
glEvalCoord2f((GLfloat)j / 10.0, (GLfloat)i / 10.0);
}
glEnd();
}


(3)画控制点

//画控制点
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
glPointSize(4);
glColor3d(1.0,
4000
0.0, 0.0);
//选中则为蓝色
if (i == switchx&&j == switchy)
{
glColor3d(0.0, 0.0, 1.0);
}
glBegin(GL_POINTS);
glVertex3f(ctrlPts[i][j][0], ctrlPts[i][j][1], ctrlPts[i][j][2]);
glEnd();
}
}


3、利用鼠标或键盘控制曲面在屏幕上移动、旋转和放缩;

a) 实现效果:

 


b) 实现步骤:

(1)自定义平移函数

//自定义平移函数
void translate3D(GLfloat tx, GLfloat ty, GLfloat tz) {
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
for (int k = 0; k < 3; k++)
{
if (k == 0)
{
ctrlPts[i][j][k] += tx* 0.01;
}
else if (k == 1)
{
ctrlPts[i][j][k] += ty* 0.01;
}
else if (k == 2)
{
ctrlPts[i][j][k] += tz * 0.01;
}
}
}
}
}


(2)自定义旋转函数

 //自定义旋转函数
void Rotate3D(GLfloat inx, GLfloat iny)
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
xx = ctrlPts[i][j][0];
yy = ctrlPts[i][j][1];
zz = ctrlPts[i][j][2];

ctrlPts[i][j][1] = yy*cos(iny*pi / 180) + zz*sin(iny*pi / 180);
ctrlPts[i][j][2] = -yy*sin(iny*pi / 180) + zz*cos(iny*pi / 180);

zz = ctrlPts[i][j][2];

ctrlPts[i][j][2] = zz*cos(inx*pi / 180) - xx*sin(inx*pi / 180);
ctrlPts[i][j][0] = zz*sin(inx*pi / 180) + xx*cos(inx*pi / 180);
}
}
}
(3)自定义放缩函数

void scale3D(GLfloat zoom)
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
for (int k = 0; k < 3; k++)
{
if (k == 0)
{
ctrlPts[i][j][k] *= zoom;
}
else if (k == 1)
{
ctrlPts[i][j][k] *= zoom;
}
else if (k == 2)
{
ctrlPts[i][j][k] *= zoom;
}
}
}
}
}


4、用鼠标调整控制点的位置,观察曲面变化

a) 实现效果:


 
b) 实现步骤:

//获取点拖拽起始点
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
if ((ctrlPts[i][j][0] - x + 250) >= -5 && (ctrlPts[i][j][0] - x + 250) <= 5)
{
if ((ctrlPts[i][j][1] - 250 + y) >= -5 && (ctrlPts[i][j][1] - 250 + y) <= 5)
{
oldx = x;
oldy = 500 - y;
switchx = i;
switchy = j;
changeMode = 1;
}
}
}
}
//获取点拖拽终点
if (changeMode == 1)
{
nowx = x;
nowy = 500 - y;
ctrlPts[switchx][switchy][0] += nowx - oldx;
ctrlPts[switchx][switchy][1] += nowy - oldy;
oldx = x;
oldy = 500 - y;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//重新绘制
glutPostRedisplay();
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐