#include <windows.h>
#include <GL/glaux.h>
#include <GL/glut.h>
#include<stdio.h>
#include"glmap.h"
#include"win.h"
#include"tga.h"
#include"stack.h"
#include"grp2.1.h"
#include<math.h>
/* Declare Windows procedure */
#define WindowWidth 400
#define WindowHeight 400
#define MOVE 2
#define OPEN 3
#define PI 3.14159265357
#define DEG 3.14159265357/180.0000
#define VEL 10
#define BOT -1250
#define TOP 750
#define FLOOR(i) (float)(-1250+(i)*500)
#define TOFLOOR(m) (int)(((int)(m)+1250)/(int)500)
#define BUTTON1 1
#define BUTTON2 2
#define BUTTON3 3
#define BUTTON1U 4
#define BUTTON1D 5
#define BUTTON2U 6
#define BUTTON2D 7
#define BUTTON3U 8
#define BUTTON3D 9
#define BUTTON4U 10
#define BUTTON4D 11
#define BUTTON5U 12
#define BUTTON5D 13
//////////////////当前位置 以及视角旋转
float nnx=0,nny=FLOOR(3)-150,nnz=0,nnr=0,thisr=0;
//////即将到来的电梯
int comingele;
//////本楼层
int thisfloor=2;
/////剩余秒数
float second;
/////是否有按键
int kkflag=0;
void showpanel(HWND h,int mode);
////////按钮的名字
unsigned int buttonname[20]={4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23} ;
/////////纹理序号
GLuint t1;
GLuint t2,t3,t4,water,floortext,iron,copper,sg[10],btup,btdown,upred,downred,blue,mask;
///////图形定点数组类
PointGrp afloor;
PointGrp file;
PointGrp ela,lift[6],cover1,cover2,sign,button[20],panel[20],insidepanel[5],around,roof,cur;
//////四边形定点
Point3D curpt[4]={
{-6,-30,0},
{26,-30,0},
{26,2,0},
{-6,2,0}
};
Point3D floorpt[4]={
{-2000,0,-1500},
{2000,0,-1500},
{2000,0,1500},
{-2000,0,1500}
};
Point3D floorpt1[4]={
{-1750,0,-1500},
{1750,0,-1500},
{1750,0,1500},
{-1750,0,1500}
};
Point3D file1[4]={
{-2000,0,-1500},
{-2000,0,1500},
{2000,0,1500},
{2000,0,-1500}
};
Point3D file2[4]={
{-1750,0,-1500},
{-1750,0,1500},
{1750,0,1500},
{1750,0,-1500}
};
Point3D file3[4]={
{0,0,0},
{0,0,0},
{0,0,0},
{0,0,0}
};
Point3D roof1[5]={
{-1750,0,-1500},
{-1750,0,1500},
{1750,0,1500},
{1750,0,-1500},
{-1750,0,-1500}
};
Point3D roof2[5]={
{0,0,0},
{0,0,0},
{0,0,0},
{0,0,0},
{0,0,0}
};
Point3D filept[4]={
{-2000,-1250,1500},
{-2000,-1250,-1500},
{-2000,1250,-1500},
{-2000,1250,1500}
};
Point3D signpt[4]={
{150,-150,0},
{-150,-150,0},
{-150,150,0},
{150,150,0}
};
Point3D buttonpt[4]={
{50,-50,0},
{-50,-50,0},
{-50,50,0},
{50,50,0}
};
Point3D insidept[4]={
{20,-20,0},
{-20,-20,0},
{-20,20,0},
{20,20,0}
};
//圆参数方程
F(cirx,250*cos(x*DEG));
F(ciry,250*sin(x*DEG));
F(cirx1,245*cos(x*DEG));
F(ciry1,245*sin(x*DEG));
F(pit1,1*cos(x*DEG));
F(pit2,1*sin(x*DEG));
F(myabs,x>0?x:(-x));
/////电梯
typedef struct Elevator
{
float pos;
float des;
int upflag;
int taskflag;
int floornum;
float animbegin;
float animend;
}Elevator;
/////////////电梯结构体
Elevator kkk[4]={{FLOOR(1),BOT,1,0,0},
{FLOOR(2),BOT,5,0,0},
{FLOOR(3),BOT,1,0,0},
{FLOOR(4),BOT,5,0,0}};
/////每个电梯的开门当前帧数
int framenum[4]={0,0,0,0};
/////六个模型播放次序
int frame[11]={0,1,2,3,4,5,4,3,2,1,0};
//////帧数计数
int animtimes[4]={0,0,0,0};
//////////选择机制的buffer
unsigned int selbuffer[255];
/////////电梯按键是否按下标志
int qbuttondown[20]={1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int mflag=0;
void choose(HWND hwnd,int mode,int x,int y)
{
for(int i=0;i<20;i++)
{
if(qbuttondown[i]==0)
{
if(i%2==0)
button[i].text(btdown);
else
button[i].text(btup);
}
else
{
if(i%2==0)
button[i].text(downred);
else
button[i].text(upred);
}
button[i].show();
}
if(!mode)
{
GLint hits;
(void) glRenderMode (GL_SELECT);
glInitNames();
glPushName(5);
for(int i=0;i<20;i++)
{
glLoadName(buttonname[i]);
if(i%2==0)
button[i].text(btdown);
else
button[i].text(btup);
button[i].show();
}
selbuffer[3]=0;
}
}
void showpanel(HWND hwnd,int mode)
{
/////////////////面板显示
if(mode)
{
for(int i=0;i<20;i++)
{
if(qbuttondown[i]==0)
{
if(i%2==0)
panel[i].text(btdown);
else
panel[i].text(btup);
}
else
{
if(i%2==0)
panel[i].text(downred);
else
panel[i].text(upred);
}
panel[i].show();
}
}
if(!mode)
{
GLint hits;
for(int i=0;i<20;i++)
{
glLoadName(buttonname[i]);
if(i%2==0)
panel[i].text(btdown);
else
panel[i].text(btup);
panel[i].show();
}
selbuffer[3]=0;
hits = glRenderMode (GL_RENDER);
}
}
void init()
{
/////////地板
afloor.begin(QUAD);
afloor.settext(STRE);
afloor.quad(floorpt);
afloor.translate(0,-1250,0);
afloor.add();
for(int i=0;i<5;i++)
{
afloor.translate(0,500,0);
afloor.add();
}
afloor.quad(floorpt1);
afloor.translate(0,1250,0);
for(int i=0;i<5;i++)
{
afloor.translate(0,500,0);
afloor.add();
}
afloor.end();
//////////侧面
file.begin(QUAD);
file.quad(filept);
file.add();
file.translate(4000,0,0);
file.add();
file.end();
//////////around
around.settext(TILE);
around.begin(PIPE);
around.quad(file1);
around.translate(0,-1250,0);
around.add();
around.translate(0,2500,0);
around.add();
around.quad(file2);
around.translate(0,1750,0);
around.add();
around.translate(0,2000,0);
around.add();
around.end();
///////////////////////屋顶
roof.begin();
roo
OpenGL 电梯仿真模型
4星 · 超过85%的资源 需积分: 10 150 浏览量
2011-05-21
00:20:25
上传
评论 9
收藏 2.72MB RAR 举报
JinCraft
- 粉丝: 6
- 资源: 20
- 1
- 2
前往页