OpenGL制作键盘交互的会行走的机器人

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/Tan_HandSome/article/details/83819990

直接上代码

#include<GL\gl.h>
#include<GL\glut.h>
#include<windows.h>
//#pragma comment(lib, "glut32.lib")

#include <iostream>
using namespace std;

GLfloat no_mat[] = { 1.0, 1.0, 0.0, 1.0 };
GLfloat mat_ambient[] = { 1.0, 0.5, 1.0, 1.0 };
GLfloat mat_ambient_color[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_specular[] = { 0.0, 0.6, 0.5, 1.0 };
GLfloat no_shininess[] = { 0.1 };
GLfloat low_shininess[] = { 5.0 };
GLfloat high_shininess[] = { 100.0 };
GLfloat mat_emission[] = { 0.3, 0.2, 0.2, 0.0 };
static int angle = 0, neck = 0, lshoulder = -5, lelbow = -10, rshoulder = 5, relbow = 10,
lhips = 5, rhips = -5, lfoot = 10, rfoot = -10, flagneck = 0, flaglshoulder = 0,
flaglelbow = 0, flagrshoulder = 0, flagrelbow = 0, flaglhips = 0,
flagrhips = 0, flaglfoot = 0, flagrfoot = 0;

void init(void)
{
	GLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 };
	GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
	GLfloat position[] = { 0.0, 5.0, 10.0, 0.0 };
	GLfloat lmodel_ambient[] = { 0.4, 0.4, 0.4, 1.0 };
	GLfloat local_view[] = { 0.0 };

	glClearColor(0, 0, 0, 0);

	glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
	glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
	glLightfv(GL_LIGHT0, GL_POSITION, position);
	glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
	glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view);

	glShadeModel(GL_SMOOTH);
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
}

void draw_body(void)
{
	glPushMatrix();
	glTranslatef(0, 1.5, 0);
	glScalef(0.5, 1, 0.4);
	glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);
	glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
	glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
	glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
	glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
	glutSolidCube(4); ;
	glPopMatrix();
}

void draw_leftshoulder(void)
{
	glPushMatrix();
	glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
	glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
	glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
	glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
	glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
	glTranslatef(1.5, 3, 0);
	glRotatef(lshoulder, 1, 0, 0);

	glTranslatef(0, -0.5, 0);
	glScalef(0.4, 1, 0.5);
	glutSolidCube(2);

	glScalef(1 / 0.4, 1 / 1, 1 / 0.5);
	glTranslatef(0, -1.4, 0);
	glRotatef(lelbow, 1, 0, 0);
	glutWireSphere(0.4, 200, 500);

	glScalef(0.4, 1, 0.5);
	glTranslatef(0, -1.4, 0);
	glutSolidCube(2);

	glPopMatrix();
}

void draw_rightshoulder(void)
{
	glPushMatrix();
	glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
	glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
	glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
	glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
	glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
	glTranslatef(-1.5, 3, 0);
	glRotatef(rshoulder, 1, 0, 0);

	glTranslatef(0, -0.5, 0);
	glScalef(0.4, 1, 0.5);
	glutSolidCube(2);

	glScalef(1 / 0.4, 1 / 1, 1 / 0.5);
	glTranslatef(0, -1.4, 0);
	glRotatef(relbow, 1, 0, 0);
	glutWireSphere(0.4, 200, 500);

	glScalef(0.4, 1, 0.5);
	glTranslatef(0, -1.4, 0);
	glutSolidCube(2);

	glPopMatrix();
}

void draw_head(void)
{
	glPushMatrix();
	glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
	glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
	glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
	glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
	glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);

	glTranslatef(0, 3.5, 0);
	glRotatef(neck, 0, 0, 1);
	glTranslatef(0, 1, 0);
	glutWireSphere(1, 200, 500);

	glPopMatrix();
}

void draw_leye(void)
{
	glPushMatrix();
	/*glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
	glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
	glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
	glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
	glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);*/
	glColor3f(0, 0, 0);
	//glTranslatef(-0.3,4.5,1);
	glTranslatef(-0.2, 4, 0.5);
	glRotatef(neck, 0, 0, 1);
	glTranslatef(-0.2, 0.5, 0.5);
	//glRotatef(neck,0,0,1);
	//glTranslatef(0,1,0);
	glutWireSphere(0.2, 100, 300);

	glPopMatrix();
}

void draw_reye(void)
{
	glPushMatrix();
	glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
	glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
	glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
	glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
	glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);

	glTranslatef(0.2, 4, 0.5);
	glRotatef(neck, 0, 0, 1);
	glTranslatef(0.2, 0.5, 0.5);
	glutWireSphere(0.2, 100, 300);

	glPopMatrix();
}

void draw_mouth(void)
{
	glPushMatrix();
	glColor3f(1, 0, 0);
	//glTranslatef(0,4,1);
	glTranslatef(0, 3.5, 0.5);
	glRotatef(neck, 0, 0, 1);
	glTranslatef(0, 0.5, 0.5);
	glScalef(0.6, 0.4, 0.4);
	//glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);
	//glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
	//glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
	//glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
	//glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
	glutSolidCube(0.6);
	glPopMatrix();
}
void draw_leftfoot(void)
{
	glPushMatrix();
	glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
	glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
	glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
	glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
	glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);

	glTranslatef(-0.6, -0.6, 0);
	glRotatef(lfoot, 1, 0, 0);
	glTranslatef(0, -1, 0);
	glScalef(0.4, 1, 0.5);
	glutSolidCube(2);

	glScalef(1 / 0.4, 1 / 1, 1 / 0.5);
	glTranslatef(0, -1.4, 0);
	glRotatef(lhips, 1, 0, 0);
	glutWireSphere(0.4, 200, 500);

	glScalef(0.4, 1, 0.5);
	glTranslatef(0, -1.4, 0);
	glutSolidCube(2);

	glPopMatrix();
}

void draw_rightfoot(void)
{
	glPushMatrix();
	glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
	glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
	glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
	glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
	glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);

	glTranslatef(0.6, -0.6, 0);
	glRotatef(rfoot, 1, 0, 0);
	glTranslatef(0, -1, 0);
	glScalef(0.4, 1, 0.5);
	glutSolidCube(2);

	glScalef(1 / 0.4, 1 / 1, 1 / 0.5);
	glTranslatef(0, -1.4, 0);
	glRotatef(rhips, 1, 0, 0);
	glutWireSphere(0.4, 200, 500);

	glScalef(0.4, 1, 0.5);
	glTranslatef(0, -1.4, 0);
	glutSolidCube(2);

	glPopMatrix();
}

void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glPushMatrix();

	glRotatef(angle, 0, 1, 0);

	glTranslatef(0, 4, 0);
	draw_body();
	draw_leye();
	draw_reye();
	draw_mouth();
	draw_head();

	draw_leftshoulder();
	draw_rightshoulder();

	draw_leftfoot();
	draw_rightfoot();

	glPopMatrix();
	glutSwapBuffers();
}

void reshape(int w, int h)
{
	glViewport(0, 0, w, h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(74.0f, (GLfloat)w / (GLfloat)h, 1.0f, 1000.0f);
	//glOrtho(-8,8,-8,8,-10,10);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	gluLookAt(0.0, 4.0, 10, 0.0, 4, 0.0, 0.0, 1.0, 0.0);
}

void keyboard(unsigned char key, int x, int y)
{
	switch (key)
	{
		//top
	case 'W':
		//flagrfoot+=5;
		glTranslatef(0.0f, 0.1f, 0.0f);
		glutPostRedisplay();
		break;
		//left
	case 'A':
		glTranslatef(-0.1f, -0.0f, 0.0f);
		if (flaglshoulder)
		{
			lshoulder += 5;
			if (lshoulder >= 60)flaglshoulder = 0;
		}
		else
		{
			lshoulder -= 5;
			if (lshoulder <= -60)flaglshoulder = 1;
		}
		if (flagrshoulder)
		{
			rshoulder -= 5;
			if (rshoulder <= -60)flagrshoulder = 0;
		}
		else
		{
			rshoulder += 5;
			if (rshoulder >= 60)flagrshoulder = 1;
		}
		/* if(flaglelbow)
		{
		lelbow+=5;
		if(lelbow>=60)flaglelbow=0;
		}
		else
		{
		lelbow-=5;
		if(lelbow<=-60)flaglelbow=1;
		}
		if(flagrelbow)
		{
		relbow+=5;
		if(relbow>=60)flagrelbow=0;
		}
		else
		{
		relbow-=5;
		if(relbow<=-60)flagrelbow=1;
		}
		if(flagrhips)
		{
		rhips+=3;
		if(rhips>=60)flagrhips=0;
		}
		else
		{
		rhips-=3;
		if(rhips<=-60)flagrhips=1;
		}
		if(flaglhips)
		{
		lhips+=3;
		if(lhips>=60)flaglhips=0;
		}
		else
		{
		lhips-=3;
		if(lhips<=-60)flaglhips=1;
		}*/
		if (flaglfoot)
		{
			lfoot += 5;
			if (lfoot >= 60)flaglfoot = 0;
		}
		else
		{
			lfoot -= 5;
			if (lfoot <= -60)flaglfoot = 1;
		}
		if (flagrfoot)
		{
			rfoot -= 5;
			if (rfoot <= -60)flagrfoot = 0;
		}
		else
		{
			rfoot += 5;
			if (rfoot >= 60)flagrfoot = 1;
		}

		glutPostRedisplay();
		break;
		//bottom
	case 'S':
		glTranslatef(0.0f, -0.1f, 0.0f);
		glutPostRedisplay();
		break;
		//right
	case 'D':
		glTranslatef(0.1f, 0.0f, 0.0f);
		if (flaglshoulder)
		{
			lshoulder += 5;
			if (lshoulder >= 60)flaglshoulder = 0;
		}
		else
		{
			lshoulder -= 5;
			if (lshoulder <= -60)flaglshoulder = 1;
		}
		if (flagrshoulder)
		{
			rshoulder -= 5;
			if (rshoulder <= -60)flagrshoulder = 0;
		}
		else
		{
			rshoulder += 5;
			if (rshoulder >= 60)flagrshoulder = 1;
		}
		/*if(flaglelbow)
		{
		lelbow+=5;
		if(lelbow>=60)flaglelbow=0;
		}
		else
		{
		lelbow-=5;
		if(lelbow<=-60)flaglelbow=1;
		}
		if(flagrelbow)
		{
		relbow+=5;
		if(relbow>=60)flagrelbow=0;
		}
		else
		{
		relbow-=5;
		if(relbow<=-60)flagrelbow=1;
		}*/
		/*if(flagrhips)
		{
		rhips+=3;
		if(rhips>=60)flagrhips=0;
		}
		else
		{
		rhips-=3;
		if(rhips<=-60)flagrhips=1;
		}
		if(flaglhips)
		{
		lhips+=3;
		if(lhips>=60)flaglhips=0;
		}
		else
		{
		lhips-=3;
		if(lhips<=-60)flaglhips=1;
		}*/
		if (flaglfoot)
		{
			lfoot += 5;
			if (lfoot >= 60)flaglfoot = 0;
		}
		else
		{
			lfoot -= 5;
			if (lfoot <= -60)flaglfoot = 1;
		}
		if (flagrfoot)
		{
			rfoot -= 5;
			if (rfoot <= -60)flagrfoot = 0;
		}
		else
		{
			rfoot += 5;
			if (rfoot >= 60)flagrfoot = 1;
		}
		glutPostRedisplay();
		break;
		//inner
	case 'Q':
		glTranslatef(0.0f, 0.0f, -0.1f);
		if (flaglshoulder)
		{
			lshoulder += 5;
			if (lshoulder >= 60)flaglshoulder = 0;
		}
		else
		{
			lshoulder -= 5;
			if (lshoulder <= -60)flaglshoulder = 1;
		}
		if (flagrshoulder)
		{
			rshoulder -= 5;
			if (rshoulder <= -60)flagrshoulder = 0;
		}
		else
		{
			rshoulder += 5;
			if (rshoulder >= 60)flagrshoulder = 1;
		}
		/*if(flaglelbow)
		{
		lelbow+=5;
		if(lelbow>=60)flaglelbow=0;
		}
		else
		{
		lelbow-=5;
		if(lelbow<=-60)flaglelbow=1;
		}
		if(flagrelbow)
		{
		relbow+=5;
		if(relbow>=60)flagrelbow=0;
		}
		else
		{
		relbow-=5;
		if(relbow<=-60)flagrelbow=1;
		}
		if(flagrhips)
		{
		rhips+=3;
		if(rhips>=60)flagrhips=0;
		}
		else
		{
		rhips-=3;
		if(rhips<=-60)flagrhips=1;
		}
		if(flaglhips)
		{
		lhips+=3;
		if(lhips>=60)flaglhips=0;
		}
		else
		{
		lhips-=3;
		if(lhips<=-60)flaglhips=1;
		}*/
		if (flaglfoot)
		{
			lfoot += 5;
			if (lfoot >= 60)flaglfoot = 0;
		}
		else
		{
			lfoot -= 5;
			if (lfoot <= -60)flaglfoot = 1;
		}
		if (flagrfoot)
		{
			rfoot -= 5;
			if (rfoot <= -60)flagrfoot = 0;
		}
		else
		{
			rfoot += 5;
			if (rfoot >= 60)flagrfoot = 1;
		}
		glutPostRedisplay();

		break;
		//outter
	case 'E':
		glTranslatef(0.0f, 0.0f, 0.1f);
		if (flaglshoulder)
		{
			lshoulder += 5;
			if (lshoulder >= 60)flaglshoulder = 0;
		}
		else
		{
			lshoulder -= 5;
			if (lshoulder <= -60)flaglshoulder = 1;
		}
		if (flagrshoulder)
		{
			rshoulder -= 5;
			if (rshoulder <= -60)flagrshoulder = 0;
		}
		else
		{
			rshoulder += 5;
			if (rshoulder >= 60)flagrshoulder = 1;
		}
		if (flaglfoot)
		{
			lfoot += 5;
			if (lfoot >= 60)flaglfoot = 0;
		}
		else
		{
			lfoot -= 5;
			if (lfoot <= -60)flaglfoot = 1;
		}
		if (flagrfoot)
		{
			rfoot -= 5;
			if (rfoot <= -60)flagrfoot = 0;
		}
		else
		{
			rfoot += 5;
			if (rfoot >= 60)flagrfoot = 1;
		}
		glutPostRedisplay();
		break;
	case '1':
		angle = (angle + 5) % 360;
		glutPostRedisplay();
		break;
	case '2':
		angle = (angle - 5) % 360;
		glutPostRedisplay();
		break;
	case '3':
		if (flagneck)
		{
			neck = neck + 5;
			if (neck >= 30)flagneck = 0;
		}
		else {
			neck = neck - 5;
			if (neck <= -30)flagneck = 1;
		}
		glutPostRedisplay();
		break;
	case '4':
		if (flaglshoulder)
		{
			lshoulder += 5;
			if (lshoulder >= 60)flaglshoulder = 0;
		}
		else
		{
			lshoulder -= 5;
			if (lshoulder <= -60)flaglshoulder = 1;
		}
		glutPostRedisplay();
		break;
	case '5':
		if (flagrshoulder)
		{
			rshoulder += 5;
			if (rshoulder >= 60)flagrshoulder = 0;
		}
		else
		{
			rshoulder -= 5;
			if (rshoulder <= -60)flagrshoulder = 1;
		}
		glutPostRedisplay();
		break;
	case '6':
		if (flaglelbow)
		{
			lelbow += 5;
			if (lelbow >= 60)flaglelbow = 0;
		}
		else
		{
			lelbow -= 5;
			if (lelbow <= -60)flaglelbow = 1;
		}
		glutPostRedisplay();
		break;
	case '7':
		if (flagrelbow)
		{
			relbow += 5;
			if (relbow >= 60)flagrelbow = 0;
		}
		else
		{
			relbow -= 5;
			if (relbow <= -60)flagrelbow = 1;
		}
		glutPostRedisplay();
		break;
	case '8':
		if (flaglhips)
		{
			lhips += 5;
			if (lhips >= 60)flaglhips = 0;
		}
		else
		{
			lhips -= 5;
			if (lhips <= -60)flaglhips = 1;
		}
		glutPostRedisplay();
		break;
	case '9':
		if (flagrhips)
		{
			rhips += 5;
			if (rhips >= 60)flagrhips = 0;
		}
		else
		{
			rhips -= 5;
			if (rhips <= -60)flagrhips = 1;
		}
		glutPostRedisplay();
		break;
	case 'a':
		if (flaglfoot)
		{
			lfoot += 5;
			if (lfoot >= 60)flaglfoot = 0;
		}
		else
		{
			lfoot -= 5;
			if (lfoot <= -60)flaglfoot = 1;
		}
		glutPostRedisplay();
		break;
	case 'b':
		if (flagrfoot)
		{
			rfoot += 5;
			if (rfoot >= 60)flagrfoot = 0;
		}
		else
		{
			rfoot -= 5;
			if (rfoot <= -60)flagrfoot = 1;
		}
		glutPostRedisplay();
		break;
	default:
		break;
	}
}


int main(int argc, char** argv)
{
	printf("按键’W’,'A',’S’,'D'为向上,向左,向下,向右\n");
	printf("按键’Q’,'E'为向前,向后\n");
	printf("按键’1’,’2’为整体旋转\n");
	printf("按键’3’为头部旋转\n");
	printf("按键’4’,’5’,’6’,’7’为手臂旋转\n");
	printf("按键’8’,’9’,’a’,’b’为腿部旋转\n");
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RED);
	glutInitWindowSize(600, 600);
	glutInitWindowPosition(100, 100);
	glutCreateWindow(argv[0]);
	init();
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutKeyboardFunc(keyboard);
	glutMainLoop();
	return 0;
}

效果:立正,面向前方,拿出自信的眼神,爱谁谁的表情,走出六亲不认的步伐。

猜你喜欢

转载自blog.csdn.net/Tan_HandSome/article/details/83819990