zoukankan      html  css  js  c++  java
  • OpenGL学习入门之3D光照机器人

    OpenGL学习入门之3D光照机器人

    // myopengl.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include "StdAfx.h"
    #include<windows.h>
    #include<gl/glut.h>
    #include <iostream>
    using namespace std;
    
    GLfloat no_mat[] = { 0.0, 0.0, 0.0, 1.0 };
    GLfloat mat_ambient[] = { 0.7, 0.7, 0.7, 1.0 };
    GLfloat mat_ambient_color[] = { 0.8, 0.8, 0.2, 1.0 };
    GLfloat mat_diffuse[] = { 0.1, 0.2, 0.8, 1.0 };
    GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
    GLfloat no_shininess[] = { 0.5 };
    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=0,lelbow=0,rshoulder=0,relbow=0,
    		   lhips=0 ,rhips=0,lfoot=0,rfoot=0,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_belly(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_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_belly();
    
    	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();
    	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){
    	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("按键‘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;
    }


     

    文献来源:

    UNDONER(小杰博客) http://blog.csdn.net/undoner

    LSOFT.CN(琅软中国) http://www.lsoft.cn

  • 相关阅读:
    内置对象,监听器,过滤器
    20169201 使用Metaspoit攻击MS08-067实验
    20169201 2016-2017-2《网络攻防》课程总结
    20169201 2016-2017-2 《网络攻防》第十四周作业
    20169201 2016-2017-2 《网络攻防实践》第11周学习总结
    20169201 2016-2017-2 《移动平台开发实践》第10周学习总结
    20169201 2016-2017-2 《网络攻防实践》第10周学习总结
    20169201 实验三 敏捷开发与XP实践报告
    20169201 2016-2017-2 《网络攻防实践》 实验二
    20169201 2016-2017-2 实验一 网络攻防实验环境的搭建与测试
  • 原文地址:https://www.cnblogs.com/wuyida/p/6301093.html
Copyright © 2011-2022 走看看