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

OpenGL学习入门之3D光照机器人相关推荐

  1. 【OpenGL学习笔记⑥】——3D变换【旋转的正方体 实现地月系统 旋转+平移+缩放】

    ✈️ 文章目录 零. 成果预览图 一.3D立方体的顶点数组 二.纹理旋转 三.纹理缩放 四.画n个3D图形 五.轨道的数学公式 六.深度缓冲(Z 缓冲) 七.完整代码 八.参考附录: 神器的正方体 ☁ ...

  2. C++ OpenGL学习——入门篇

    本文参考自 opengl学习网站 opengl学习网站中文版 一.什么是OpenGL OpenGL主流上被认为是一个API(一个应用程序程序接口),提供了大量的函数,使用这些函数可以操作图形和图像.但 ...

  3. OpenGL学习入门之VS2010环境配置 [转]

    OpenGL开发环境简介 基于OpenGL标准开发的应用程序运行时需有动态链接库OpenGL32.DLL.Glu32.DLL,这两个文件在安装Windows NT时已自动装载到C:\WINDOWS\S ...

  4. OpenGL学习——入门篇 第三章 四个变换及模拟地球公转

    一.四个变换 1.1 视图变换:不同位置观察它: 涉及函数: glMatrixMode(GL_MODELVIEW);//设置当前操作的矩阵为"模型视图矩阵" glLoadIdent ...

  5. OpenGL学习笔记(5)3D基本概念

    这次介绍的都是一些比较枯燥的概念.在现实生活中都非常真实,为了避免枯燥,我们还是讲点大家都经历过的事情 视图变换 拍照: 第一步先选景(模型) 选好景之后你就需要挑一个好的位置(视图)来拍 挑好位置以 ...

  6. OpenGL编程入门学习

    OpenGL编程入门学习  非常详细的教程,很适合初学者 本文转自:http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html === ...

  7. 【OpenGL学习笔记⑧】——键盘控制正方体+光源【冯氏光照模型 光照原理 环境光照+漫反射光照+镜面光照】

    ✅ 重点参考了 LearnOpenGL CN 的内容,但大部分知识内容,小编已作改写,以方便读者理解. 文章目录 零. 成果预览图 一. 光照原理与投光物的配置 1.1 光照原理 1.2 投光物 二. ...

  8. 从0开始的OpenGL学习(八)-显示3D立方体

    本文主要解决的问题是: 如何在OpenGL中显示一个3D盒子? 欢迎来到3D世界! 学了这么多东西,还只能画一些三角形和矩形,是不是感觉特别憋屈?"我是来学3D的,为啥到现在还都是2D的图片 ...

  9. 计算机图形学——OpenGL学习系列之绘制3D下的小桌子

    计算机图形学--OpenGL学习系列之绘制3D下的小桌子 做的一个小练习,主要用到了几何变换还有gl自带的一个绘制立方体的函数,顺便体会一下glPush和glPop的用法.另外,从2D到3D,开心到飞 ...

最新文章

  1. asp.net 2.0 中引用Web.config内的连接字符串的方法
  2. 做红颜知己就要恪守界限
  3. [译]GC专家系列1:理解Java垃圾回收
  4. 珍爱生命,远离大厂政治斗争
  5. Maven核心概念(转)
  6. python基础教程电子版-Python基础教程(第2版 修订版) pdf
  7. 正则表达式 10. 分组可选
  8. 阿里云开发-身份证图像识别(SpringBoot)
  9. (四)、Redis删除策略---Redis设计与实现读书笔记
  10. c语言超市收银台程序,超市收银电脑操作流程
  11. js如何直接打开百度地图app进行导航
  12. highcharts向下钻取饼图
  13. P2825 [HEOI2016/TJOI2016]游戏
  14. 解决fidder一直报“The sever(XXX) presented a certificate that did not validate,....”
  15. 如何伪装成一个服务端开发(五)
  16. 天平游码读数例题_在天平读数时游码要读游码左端对应的刻度______
  17. html 3d坐标,CSS3三维变形,transform,3D,视角知识
  18. 隐马尔可夫模型-三个盒子颜色序列概率计算问题
  19. 3.3 CNN经典网络实现
  20. Zcash 对以太坊来说意味着什么?

热门文章

  1. php的在线问卷调查_php 在线问卷调查程序二
  2. CAD动态块中如何设置翻转?CAD动态块翻转参数设置技巧
  3. JavaScript随手笔记---轮播图(点击切换)
  4. 速盘服务器什么时候停止维护,速盘竟然收集用户数据并上传自己服务器?作者出来澄清。还有干净安全的网盘吗?...
  5. 【跟着达叔学Java】系列文章更新
  6. C# 学习笔记(十)数组练习
  7. 凌汛 php,汛期和凌汛的区别 分别是什么意思
  8. 证券期货行业信息系统运维管理规范
  9. 在添加页眉时 图片没有显示
  10. 打造超级个体,她如何完成逆袭