实验7 3D机器人

时间:2022-07-28
本文章向大家介绍实验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.实验提高

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