计算机图形学-实验5-掌握Bezier样条曲面生成思想、复习基本图元绘制、交互操作和几何变换相关内容
2017-05-07 09:52
459 查看
实验五:(2学时)
一、 实验目的:
掌握Bezier样条曲面生成思想、复习基本图元绘制、交互操作和几何变换相关内容
二、 实验内容:
1、在窗口中画三维坐标,包括原点和三个坐标轴;
2、画一条Bezier样条曲面,包含4*4个控制点;
3、利用鼠标或键盘控制曲面在屏幕上移动、旋转和放缩;
4、用鼠标调整控制点的位置,观察曲面变化
三、 实现效果及步骤(或流程)
1、在窗口中画三维坐标,包括原点和三个坐标轴;
a) 实现效果:
b) 实现步骤:
(1)画原点
(2)画x轴以及标识
(3)画y轴以及标识
(4)画z轴以及标识
2、画一条Bezier样条曲面,包含4*4个控制点;
a) 实现效果:
b) 实现步骤:
(1)初始化坐标
(2)画曲面
(3)画控制点
3、利用鼠标或键盘控制曲面在屏幕上移动、旋转和放缩;
a) 实现效果:
b) 实现步骤:
(1)自定义平移函数
(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)自定义放缩函数
4、用鼠标调整控制点的位置,观察曲面变化
a) 实现效果:
b) 实现步骤:
一、 实验目的:
掌握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(); }
相关文章推荐
- 计算机图形学-实验1-掌握开发环境配置方法和基本图元绘制函数
- python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。
- C#线程相关问题总结:基本操作及UI控件交互
- C#线程相关问题总结:基本操作及UI控件交互
- redis复习(一):基本知识点----安装、基本数据类型和相关操作
- Oracle数据库基本操作(三) —— DQL相关内容说明及应用
- Nebula3绘制基本图元
- bo2-31.cpp 一个数组只生成一个静态链表(数据结构由c2-3.h定义)的基本操作(11个))
- 代码开发人员需要掌握的基本操作——ClearCase札记2
- asp.net动态生成按钮,点击按钮执行相关操作
- ASP.net在页面所有内容生成后、输出内容前对页面内容进行操作
- LINUX期末复习---基本命令与操作
- 掌握sql四条最基本的数据操作语句- -
- ASP.net在页面所有内容生成后、输出内容前对页面内容进行操作
- VC操作Excel文件编程相关内容总结
- 在WORD中使用宏达到 找到指定某一位置的内容后 做相关操作。
- bo2-32.cpp 一个数组可生成若干静态链表(数据结构由c2-3.h定义)的基本操作(12个)
- [网络问题,截图以后再传]本实验是设计性实验。目的在于使用关系数据库标准语言SQL,掌握视图和索引的操作。
- ASP.net在页面所有内容生成后、输出内容前对页面内容进行操作
- VFW中VCM的基本操作过程及相关函数