实验7 3D机器人
1.实验目的:
(1) 熟悉视点观察函数的设置和使用。 (2) 熟悉3D图形变换的设置和使用。 (3) 进一步熟悉基本3D图元的绘制。 (4) 体验透视投影和正交投影的不同效果。 (5) 掌握简单机器人编程。
2.实验内容:
(1)简单机器人。设计如图A.7所示。机器人由四大部分组成,即头、身、双手、双腿,分别由立方体经过图形变换而成。头部尺寸,宽为1,高为1,厚为0.5;身体尺寸,宽为4,高为4,厚为0.5;手部尺寸,宽为1,高为3,厚为0.5,手与手心距离2.5,手与肩齐平;腿部尺寸,宽为1,高为3,厚为0.5,脚与身心距离1。 (2)后面附简单机器人框架程序,请填写核心代码。要求如图所示,①双手前后来回摆动;②双腿前后来回摆动;③调整观察角度,以便达到更好的显示效果;④机器人沿着地面走动。
图A.7 简单机器人
3.实验原理:
(1)视点设置函数
void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble atx, GLdouble aty, GLdouble atz, GLdouble upx, GLdouble upy, GLdouble upz,)
(2)正交投影变换设置函数
void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far)
(3)透视投影变换设置函数
void gluPerspective(GLdouble fov, Gldouble aspect, Gldouble near, GLdouble far)
(4)三维基本图形绘制函数 ①立方体绘制函数,其功能为绘制一个边长为size的线框或实体立方体,立方体的中心位于原点。
void gluWireCube(GLdouble size) //线框模型
void gluSolidCube(GLdouble size) //实体模型
②小球绘制函数,其功能为绘制一个半径为Radius的线框或实心小球,小球的中心点位于原点,slices为小球的经线数目,stacks为小球的纬线数目。
gluSphere(GLUquadricObj *obj, Gldouble radius, Glint slices, GLint stacks);
用法示例:
GLUquadricObj *sphere; //定义二次曲面对象
sphere=gluNewQuadric(); //生成二次曲面对象
gluSphere(sphere,8,50,50); //半径为8,球心在原点,经线和纬线数目为50的小球
③正八面体绘制函数,其功能是绘制一个线框的或是新的正八面体,其中心位于原点,半径为1。
void gluWireOctahedron(void) //线框模型
void gluSolidOctahedron(void) //实体模型
④正十二面体绘制函数,其功能是绘制一个线框的或实心的正十二面体,其中心位于原点,半径为3的平方根。
void gluWireDodehedron(void) //线框模型
void gluSolidDodehedron(void) //实体模型
⑤正四面体绘制函数,其功能是绘制一个线框的或实心的正四面体,其中心位于原点,半径为3的平方根。
void gluWireTetrahedron(void) //线框模型
void gluSolidTetrahedron(void) //实体模型
4.实验代码:
#include <glut.h>
void myReshape(int w,int h);
void myInit();
void myDisplay();
void myTime(int value);
int main(int argc, char** argv)
{
char *argv[] = {"hello ", " "};
int argc = 2;
glutInit(&argc, argv); //初始化GLUT库;
//设置深度检测下的显示模式;(缓冲,颜色类型,深度值)
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(600, 500);
glutInitWindowPosition(1024 / 2 - 250, 768 / 2 - 250);
glutCreateWindow("简单机器人"); //创建窗口;
glutReshapeFunc(myReshape);
myInit();
glutDisplayFunc(myDisplay); //用于绘制当前窗口;
glutTimerFunc(100,myTime,10);
glutMainLoop(); //表示开始运行程序,用于程序的结尾;
return 0;
}
void myReshape(int w,int h)
{ glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-10,10,-10*h/w,10*h/w,1,200); //定义三维观察体
//gluPerspective(60,w/h,1,200);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void myInit()
{ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glEnable(GL_POINT_SMOOTH);
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glEnable(GL_POLYGON_SMOOTH);
glLineWidth(3);
glEnable(GL_DEPTH_TEST); //启用深度检测
}
void myTime(int value)
{
//写入代码;
glutPostRedisplay();
glutTimerFunc(100,myTime,10);
}
void myDisplay()
{
// glClear(GL_COLOR_BUFFER_BIT); //清屏
//启用深度检测下的清屏模式glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW); //矩阵模式设置
glLoadIdentity(); //清空矩阵堆栈
gluLookAt(0,0,10,0.0,0.0,0.0,0.0,1.0,0.0); //设置视点
//写入代码;
glPushMatrix();
glColor3f(1,0,0);
//写入代码;
glutSolidCube(1); //绘制立方体身
glPopMatrix();
glPushMatrix();
glColor3f(1,1,0);
//写入代码;
glutSolidCube(1); //绘制立方体头
glPopMatrix();
glPushMatrix();
glColor3f(1,0.5,0.2);
//写入代码;
glutSolidCube(1); //绘制立方体手
glPopMatrix();
glPushMatrix();
glColor3f(1,0.5,0.2);
//写入代码;
glutSolidCube(1); //绘制立方体手
glPopMatrix();
glPushMatrix();
glColor3f(0.5,0.5,1);
//写入代码;
glutSolidCube(1); //绘制立方体腿
glPopMatrix();
glPushMatrix();
glColor3f(0.5,0.5,1);
//写入代码;
glutSolidCube(1); //绘制立方体腿
glPopMatrix();
glutSwapBuffers(); //双缓冲下的刷新方法
}
5.实验提高
机器人的手和腿分别分为两大模块,中间分别为手关节和腿关节。手和腿的下半部可分别随自己的关节转动,让机器人变得更加灵活。增加一个绘制的面,可用四边形等拼凑而成,机器人在真正的地面走起来,要求两个不同的机器人从不同方向走动。选择合适的观察角度以获得较佳观察效果。
- 【Spring实战】—— 13 AspectJ注解切面
- EasyUI日期选择框
- Java基础03 构造器与方法重载
- web.xml is missing and <failOnMissingWebXml> is set to true
- 【Spring实战】—— 11 通过AOP为特定的类引入新的功能
- 使用Maven创建web项目
- 纸上谈兵: 树, 二叉树, 二叉搜索树
- 【Spring实战】—— 9 AOP环绕通知
- 陈辉:蘑菇街技术架构规划与成长
- JavaSE(二)之继承、封装、多态
- 人与人工智能机器人,究竟谁更聪明?
- 【Spring实战】—— 10 AOP针对参数的通知
- 纸上谈兵: AVL树
- 基于配置的Spring AOP
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Flutter通过BasicMessageChannel与Android iOS 的双向通信
- MySQL案例:binlog_row_image如何取舍
- “青柠日报”小程序
- 2020年学习Python-爬取英雄联盟皮肤
- R语言meta分析(10)功能强大的metafor
- Python保留字总结
- Python进阶 | 五分钟带你弄懂迭代器与生成器,夯实代码能力
- [Go]GO语言实战项目-gin框架上传图片文件
- [Go] Golang练习项目-GO语言实现选择排序
- 设计模式~策略模式
- Java单元测试框架(一)——JUnit4
- Java单元测试框架(二)——JUnit5
- 绘制双坐标轴图
- 用箭头和文字来标记重要的点
- 32.Python字符串方法split