人走鸟飞之二
来源:互联网 发布:java什么是多态 编辑:程序博客网 时间:2024/06/15 16:40
//相比上一篇,这一个程序增加了视角方面的转换,我们可以从四方区观察这个运动的简单3D世界。写给和我一样的菜鸟。这些代码也比较容易懂的。
#include"stdafx.h"
#define GLUT_DISABLE_ATEXIT_HACK
#include <gl/glut.h>
#include<time.h>
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glut32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glut.lib")
static double angle1; //翅膀的扇动角度
static double angle2; //人腿的旋转角度
static double walk; //人走动的速度
static double fly; //鸟飞的速度
static double d = 0.1; //增量
static double e = 0.1; //增量
static double s = 0.001;//增量
static double f = 0.002;
float g_rotateY = 0.0f; // 绕Y轴旋转变量
float g_posX = 0.0f; //横向位移
float g_posY = 0.0f;
float g_posZ = 0.0f;
int camerdire;
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
}
void cylinder()
{
glPushMatrix();
glTranslatef(0, 0, -0.05);
glScalef(0.05, 0.05, 0.1);
GLUquadricObj *cylinder_obj1;
GLUquadricObj *cylinder_obj2;
//GLUquadricObj *cylinder_obj3;
//然后再初始化
cylinder_obj1 = gluNewQuadric();
cylinder_obj2 = gluNewQuadric();
//cylinder_obj3=gluNewQuadric();
//GL_COLOR_BUFFER_BIT标志用glClearColor设置的颜色清除颜色缓冲区
glColor3f(1.0, 1.0, 0.1); //glColor{34}{b s i f d ub us ui}{v}(....)
//画圆柱体
glPushMatrix();
glRotatef(0, 1.0, 0.0, 0.0);//绕y轴旋转的角度
gluCylinder(cylinder_obj1, 2, 2, 4, 100, 50);
gluDisk(cylinder_obj2, 0, 2, 100, 50);
glPopMatrix();
glPopMatrix();
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glLoadIdentity();
if (camerdire==1) //从左侧观看
gluLookAt(-10.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0); //设置照相机参数,照相机的位置为(0,0,5),指向(0,0,0),向上为(0,1,0)
if (camerdire==0) //从前面观看
gluLookAt(0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0); //设置照相机参数,照相机的位置为(0,0,5),指向(0,0,0),向上为(0,1,0)
if (camerdire==2) //从后面观看
gluLookAt(0.0, 0.0, -10.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0); //设置照相机参数,照相机的位置为(0,0,5),指向(0,0,0),向上为(0,1,0)
//----------------------画出地面-------------------
glPushMatrix();
glTranslatef(-g_posX, g_posY, g_posZ+5);
glTranslatef(-2, 6, -6);
glScalef(3, 1, 2);
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_QUADS);
glVertex3f(2.0f, -1.5f, 2.0f);
glVertex3f(-2.0f, -1.5f, 2.0);
glVertex3f(-2.0f, -1.5f, -2.0);
glVertex3f(2.0f, -1.50f, -2.0);
glEnd();
glPopMatrix();
//----------------------以上画出地面----------
//---------------------以下画出飞鸟
glPushMatrix();
glTranslatef(0, -5, 0.3);
glTranslatef(fly+=f, angle1/80+0.1, 0); //飞鸟身躯的上下起伏,左右移动
//一对翅膀(用两个扁长的立方体表示)
glColor3f(0.7, 0.7, 0.7);
glPushMatrix();
glRotatef(angle1, 0, 0, 1);
glTranslatef(-0.5,0,0);
glScalef(1, 0.05, 0.3);
glutSolidCube(1.0);
glPopMatrix();
glPushMatrix();
glRotatef(-angle1, 0, 0, 1);
glTranslatef(0.5, 0, 0);
glScalef(1, 0.05, 0.3);
glutSolidCube(1.0);
glPopMatrix();
//一个身躯(用一个立方体表示)
glColor3f(1.0, 0.0, 0.0);
glPushMatrix();
glScalef(0.3,0.3,0.3);
glutSolidCube(1.0);
glPopMatrix();
glPopMatrix();
//----------------------以上为飞鸟的动画
glColor3f(0, 1, 0);
//-----------------------下面画出一个人走路
glPushMatrix();
glRotatef(-90, 0, 0, 1);
glTranslatef(-4,walk+=s,0); //两腿的前进
glScalef(2.0, 2.0, 2.0); //调整机器人的大小
//---------------------下面是两腿摆动的动画----------
glPushMatrix();
glColor3f(1.0, 0.0, 1.0);
glRotatef(angle2, 0, 0, 1);
glTranslatef(-0.5, 0, 0);
glScalef(1, 0.05, 0.1);
glutSolidCube(1.0);
glPopMatrix();
glPushMatrix();
glRotatef(180, 0, 0, 1);
glRotatef(-angle2, 0, 0, 1);
glTranslatef(0.5, 0, 0.3);
glScalef(1, 0.05, 0.1);
glutSolidCube(1.0);
glPopMatrix();
cylinder();
glPopMatrix();
//-----------------------以上为人走动的动画--------------
glFlush();
}
void reshape(int w,int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
glMatrixMode(GL_MODELVIEW);
}
void myIdle(void)
{
angle1 -= d;
if (angle1 <-70)
d = -d;
else if (angle1>30)
d = -d;
angle2 -= e;
if (angle2 <-30)
e = -e;
else if (angle2>30)
e = -e;
if (walk <-3)
s = -s;
else if (walk>3)
s = -s;
if (fly < -5)
f = -f;
else if (fly>5)
f = -f;
display();
}
void ProcessSpecialKeyboead(int key, int x, int y)//转换摄像头视角的方向
{
if (key == GLUT_KEY_F1)
{
camerdire = 0;
}
if (key == GLUT_KEY_F2)
{
camerdire = 1;
}
if (key == GLUT_KEY_F3)
{
camerdire = 2;
}
}
void KeyboardFunc(unsigned char key, int x, int y)
{
switch (key)
{
//---------------------控制地面的移动----------------------------
case 'A':
case 'a':
// 向左移动
g_posX -= 0.05f;
if (g_posX < -4.0f)
{
g_posX = -4.0f;
}
break;
case 'D':
case 'd':
// 向右移动
g_posX += 0.05f;
if (g_posX > 4.0f)
{
g_posX = 4.0f;
}
break;
case 'W':
case 'w':
// 向上移动
g_posY -= 0.05f;
break;
case 'S':
case 's':
// 向上移动
g_posY += 0.05f;
break;
case 'F':
case 'f':
// 向前移动
g_posZ -= 0.05f;
break;
case 'B':
case 'b':
// 向前移动
g_posZ += 0.05f;
break;
default:
break;
}
}
int main(int argc, char * *argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(800, 600);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutIdleFunc(myIdle);
glutReshapeFunc(reshape);
glutKeyboardFunc(KeyboardFunc);
glutSpecialFunc(ProcessSpecialKeyboead);
glutMainLoop();
return 0;
}
- 人走鸟飞之二
- 之二
- 赠别 二首之二
- 框架之 hibernate之二
- DoxyGen文档之二
- 感受Longhorn之二
- 揭短之二
- 近日二三事之二
- 成功誓言之二
- delphi2005探讨之二
- [随时感动]之二
- 童年趣事之二
- C#速成(之二)
- Linux常用命令之二
- 皮皮之二
- 关于XFS之二
- STL学习之(二)
- DWR学习 之二
- linux socket 编程之 —— sockaddr与sockaddr_in结构体
- Android NDK开发(三)——常见错误集锦以及LOG使用
- 第四章 存储器管理
- poj2914 全局最小割
- 如何压缩bitmap
- 人走鸟飞之二
- linux上传文件rz命令的安装
- IK分词源码讲解(二)-分词器
- struts2文件上传
- POJ 2411 Mondriaan's Dream(状态压缩)
- 对EXCEL中分类汇总的数据进行复制碰到无法复制的问题
- 在J版的OpenStack上安装Sahara
- 2015春夏品牌男装流行元素系列解析
- ios 学习之 NSPredicate 模糊、精确、查询