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 <GL/glut.h>
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
/*观察变换*/
gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); //指定三维观察参数
glPushMatrix(); //头部
glColor3f(1.0, 1.0, 1.0);
glTranslatef(0.0f, 1.4f, 0.0f);
glutSolidCube(0.5f);
glPopMatrix();
glPushMatrix(); //身体
glColor3f(1.0, 0.0, 0.0);
glTranslatef(0.0f, 0.25f, 0.0f);
glScalef(4.0, 4.0, 0.5);
glutSolidCube(0.5f);
glPopMatrix();
glPushMatrix(); //手臂
glColor3f(1.0, 1.0, 0.0);
glTranslatef(1.25f, 0.5f, 0.0f);
glScalef(1.0, 3.0, 0.5);
glutSolidCube(0.5f);
glPopMatrix();
glPushMatrix();
glColor3f(1.0, 1.0, 0.0);
glTranslatef(-1.25f, 0.5f, 0.0f);
glScalef(1.0, 3.0, 0.5);
glutSolidCube(0.5f);
glPopMatrix();
glPushMatrix(); //腿
glColor3f(0.5, 0.5, 1.5);
glTranslatef(-0.5f, -1.5f, 0.0f);
glScalef(1.0, 3.0, 0.5);
glutSolidCube(0.5f);
glPopMatrix();
glPushMatrix();
glColor3f(0.5, 0.5, 1.5);
glTranslatef(0.5f, -1.5f, 0.0f);
glScalef(1.0, 3.0, 0.5);
glutSolidCube(0.5f);
glPopMatrix();
glFlush();
}
void reshape(GLint newWidth, GLint newHeight)
{
/*视口变换*/
glViewport(0, 0, newWidth, newHeight); //定义视口大小
/*投影变换*/
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
/*透视投影,设置透视观察体*/
glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20);
/*模型变换*/
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitWindowPosition(100, 100);
glutInitWindowSize(500, 500); //设置初始化窗口大小
glutCreateWindow("3D机器人");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
5.实验提高
请给机器人增加一个脖子和两个小手,增加后的结果如下图所示。