前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实验7 3D机器人

实验7 3D机器人

作者头像
步行者08
发布2020-10-27 14:55:24
1.3K0
发布2020-10-27 14:55:24
举报
文章被收录于专栏:图形学与OpenGL图形学与OpenGL

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)视点设置函数

代码语言:javascript
复制
void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble atx, GLdouble aty, GLdouble atz, GLdouble upx, GLdouble upy, GLdouble upz,)

(2)正交投影变换设置函数

代码语言:javascript
复制
void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far)

(3)透视投影变换设置函数

代码语言:javascript
复制
void gluPerspective(GLdouble fov, Gldouble aspect, Gldouble near, GLdouble far)

(4)三维基本图形绘制函数 ①立方体绘制函数,其功能为绘制一个边长为size的线框或实体立方体,立方体的中心位于原点。

代码语言:javascript
复制
void gluWireCube(GLdouble size) //线框模型
void gluSolidCube(GLdouble size) //实体模型

②小球绘制函数,其功能为绘制一个半径为Radius的线框或实心小球,小球的中心点位于原点,slices为小球的经线数目,stacks为小球的纬线数目。

代码语言:javascript
复制
gluSphere(GLUquadricObj *obj, Gldouble radius, Glint slices, GLint stacks);

用法示例:

代码语言:javascript
复制
GLUquadricObj *sphere;  //定义二次曲面对象
sphere=gluNewQuadric();  //生成二次曲面对象
gluSphere(sphere,8,50,50);  //半径为8,球心在原点,经线和纬线数目为50的小球

③正八面体绘制函数,其功能是绘制一个线框的或是新的正八面体,其中心位于原点,半径为1。

代码语言:javascript
复制
void gluWireOctahedron(void) //线框模型
void gluSolidOctahedron(void) //实体模型

④正十二面体绘制函数,其功能是绘制一个线框的或实心的正十二面体,其中心位于原点,半径为3的平方根。

代码语言:javascript
复制
void gluWireDodehedron(void) //线框模型
void gluSolidDodehedron(void) //实体模型

⑤正四面体绘制函数,其功能是绘制一个线框的或实心的正四面体,其中心位于原点,半径为3的平方根。

代码语言:javascript
复制
void gluWireTetrahedron(void) //线框模型
void gluSolidTetrahedron(void) //实体模型

4.实验代码:

代码语言:javascript
复制
#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.实验提高

机器人的手和腿分别分为两大模块,中间分别为手关节和腿关节。手和腿的下半部可分别随自己的关节转动,让机器人变得更加灵活。增加一个绘制的面,可用四边形等拼凑而成,机器人在真正的地面走起来,要求两个不同的机器人从不同方向走动。选择合适的观察角度以获得较佳观察效果。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-10-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.实验目的:
  • 2.实验内容:
  • 3.实验原理:
  • 4.实验代码:
  • 5.实验提高
相关产品与服务
图像处理
图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档