实验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.实验提高
机器人的手和腿分别分为两大模块,中间分别为手关节和腿关节。手和腿的下半部可分别随自己的关节转动,让机器人变得更加灵活。增加一个绘制的面,可用四边形等拼凑而成,机器人在真正的地面走起来,要求两个不同的机器人从不同方向走动。选择合适的观察角度以获得较佳观察效果。
- 详解ROC/AUC计算过程
- 汉字数组排序及如何检测汉字
- 简单易学的机器学习算法——主成分分析(PCA)
- 基于Xgboost + LR + Keras 建模评估用户信用状态
- canvas实现拖动页面时显示窗口视频
- 鼠标滚轮事件介绍
- Understanding delete
- objC与js通信实现--WebViewJavascriptBridge
- 简单易学的机器学习算法——岭回归(Ridge Regression)
- QQ空间(日志、说说、个人信息)python爬虫源码(一天可抓取 400 万条数据)
- 文本分类实战: 机器学习vs深度学习算法对比(附代码)
- ReactJS分析之入口函数render
- 简单易学的机器学习算法——SVD奇异值分解
- AngularJS源码分析之依赖注入$injector
- 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 数组属性和方法
- SQL工具集-查询会话等待
- 哈工大李志军操作系统实验1
- 有赞推荐系统关键技术
- 8086汇编格式
- React 中 getDerivedStateFromProps 的三个场景
- Java7的try-with-resources声明(转)
- 聊聊java中的哪些Map:(三)HashMap中的Iterator和Spliterator
- 聊聊java中的哪些Map:(四)LinkedHashMap源码分析
- CGroup 介绍
- 有赞持续集成容器化实践
- 怎么创建一个良好的Git提交信息
- Epoll 如何工作的?
- 用函数式的方式思考——递归
- Linux等待队列原理与实现
- 微信小程序switchTab带参解决方法