[原创]喷气式发动机模拟(OpenGL)-->starrysky转移
<P>[attach]3417[/attach]最近看到不少学弟学妹们为了学习OpenGL而忙的一塌糊涂,就把去年我做的一个程序发出来
给大家共同学习一下。看到这个程序,我心里既高兴又痛苦,痛并着快乐吧,快乐的是这个
程序是我一手做出来的,不骗你们,里面所有的程序代码全是我一个人写的,让我相当有成就感。
痛苦的是,和我一组的其他几位同学没几个真正关心这个程序(程序占总分40分啊,还有额外的加分),只是在最后几个星期假情假意做了个文档
以示自己尽了分力,个别的重头到尾问都没问一句,挂个名而已。后来程序被老师看好,说是要进什么国家库,于是又到外面炫耀。
唉,要不是我很想把程序给做出来,看看效果,我真的不想做了,大不了一齐挂了,明年都重修去。
我不图名利,但我怕心寒。
不发牢骚了,言归正传。本程序编译环境:Borland C++build6.0
由于引入了粒子系统(共60000个粒子),而且为了达到很好的效果粒子用的是三棱锥而不是点,所以运算量很大
,对电脑要求有点高,配置不好的电脑可以在头文件中将粒子个数改少一些。由于我将说明文档整和在了程序中,
有大量的图片要处理,所以编译时会很慢(我的电脑要50多秒 CPU p4 2.4G DDR400 512M 七彩虹 Radom9800se)
请耐心等待。
因为不是最终版所以有些BUG没改(编译没有问题,只是某些功能无法实现):
程序中由于按钮控制与键盘有冲突,所以键盘控制部分的语句不能被执行。只要在按钮函数中的开头和结尾加上2个函数就能解决.具体函数现在忘了,具体方法是先让按钮判别为无,再在点击按钮时激活按钮,按钮函数执行完时再判别为无,过几天再发出来。
有时候运行程序时看不到图形,但将窗口还原再最大化就又出现了(我的机子上没出现过这个问题,但在比较差的机子上出现过,估计是显卡问题,刷新不够)。这是因为在TFormMain(TComponent* Sender)中少了几句话,没有重建窗口,请大家参考紧跟着的FormResize(TObject *Sender)后自行添加。自己不试试是不会记住的。
因为音乐打包比较大,所以把音乐删除了,但保留了音乐控制语句,请大家自行添加.
还有什么问题的话请指出。
附件中包括完整源代码和一个已经编译好的可执行文件,直接运行可执行文件就可以看到效果了。注意,源代码不能用VC++6.0直接运行,因为格式不同,要修改一些地方才可以。</P>
<P>下面我把主要的头文件和函数发出来
//Unit1.h
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#define Max 20000 //粒子数1 有3种不同的粒子
#define Max1 20000 //粒子数2
#define Max2 20000 //粒子数3
//--------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Menus.hpp>
#include <gl\gl.h>
#include <gl\glu.h>
#include <math.h>
//---------------------------------------------------------------------------
typedef struct //粒子系统所用的结构体
{
bool active;
GLfloat life;
GLfloat fade;
GLfloat r;
GLfloat g;
GLfloat b;
GLfloat x;
GLfloat y;
GLfloat z;
GLfloat xi;
GLfloat yi;
GLfloat zi;
GLfloat xg;
GLfloat yg;
GLfloat zg;
} particles;</P>
<P>//---------------------------------------------------------------------
class TFormMain : public TForm
{
__published: // IDE-managed Components
TPanel *Control_Zone;
TButton *Button5;
TButton *Button6;
TButton *Button7;
TButton *Button8;
TButton *Button9;
TButton *Button10;
TButton *Button11;
TTimer *Timer1;
TButton *Button12;
TStaticText *StaticText5;
TStaticText *StaticText7;
TStaticText *StaticText8;
TStaticText *StaticText9;
TStaticText *StaticText10;
TStaticText *StaticText11;
TStaticText *StaticText12;
TStaticText *StaticText13;
TButton *Button13;
TStaticText *StaticText14;
TStaticText *StaticText15;
TStaticText *StaticText16;
TButton *Button14;
TButton *Button15;
TMainMenu *MainMenu1;
TMenuItem *File1;
TMenuItem *Exit1;
TMenuItem *Help2;
TMenuItem *About2;
TMenuItem *SearchforHelpOn2;
TMenuItem *Contents2;
TMenuItem *File2;
TMenuItem *PrintSetup1;
TMenuItem *N2;
TMenuItem *SaveAs1;
TMenuItem *N1;
TMenuItem *N3;
TMenuItem *N4;
TStaticText *StaticText6;
TLabel *Label1;
TButton *Button1;
TButton *Button2;
TButton *Button3;
TButton *Button4;
TButton *Button16;
TButton *Button17;</P>
<P> void __fastcall FormResize( TObject *Sender);
void __fastcall FormCreate( TObject *Sender);
void __fastcall FormKeyDown( TObject *Sender, WORD &Key, TShiftState Shift);
void __fastcall FormMouseMove( TObject *Sender, TShiftState Shift, int X,int Y);
void __fastcall FormMouseDown( TObject *Sender, TMouseButton Button,TShiftState Shift, int X, int Y );
void __fastcall FormMouseUp( TObject *Sender, TMouseButton Button,TShiftState Shift, int X, int Y );
void __fastcall FormMouseWheelDown( TObject *Sender, TShiftState Shift, TPoint &MousePos, bool &Handled );
void __fastcall FormMouseWheelUp( TObject *Sender, TShiftState Shift, TPoint &MousePos, bool &Handled );
void __fastcall Button1Click(TObject *Sender);</P>
<P> void __fastcall Button5Click(TObject *Sender);
void __fastcall Button6Click(TObject *Sender);
void __fastcall Button7Click(TObject *Sender);
void __fastcall Button8Click(TObject *Sender);
void __fastcall Button9Click(TObject *Sender);
void __fastcall Button10Click(TObject *Sender);</P>
<P>
void __fastcall Timer1Timer(TObject *Sender);
void __fastcall Button12Click(TObject *Sender);
void __fastcall Button11Click(TObject *Sender);
void __fastcall Button13Click(TObject *Sender);
void __fastcall Button14Click(TObject *Sender);
void __fastcall Button15Click(TObject *Sender);
void __fastcall Exit1Click(TObject *Sender);
void __fastcall SaveAs1Click(TObject *Sender);
void __fastcall PrintSetup1Click(TObject *Sender);
void __fastcall Contents2Click(TObject *Sender);
void __fastcall N1Click(TObject *Sender);
void __fastcall SearchforHelpOn2Click(TObject *Sender);
void __fastcall About2Click(TObject *Sender);
void __fastcall N3Click(TObject *Sender);
void __fastcall N4Click(TObject *Sender);</P>
<P>
void __fastcall Button2Click(TObject *Sender);
void __fastcall Button17Click(TObject *Sender);
void __fastcall Button4Click(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
void __fastcall Button16Click(TObject *Sender);</P>
<P>private: // User declarations
HDC hdc;
float w, h;
int PixelFormat,x,y;
int I,XX;
float zoom,M,J,K,n,N,V,Angle,L,O,P;
HGLRC hrc;
GLuint list_of_objects,waike;
Graphics::TBitmap* bitmap;
BOOL Left_Button_Down,inclined,key_and_mouse_down;</P>
<P> int loop;</P>
<P>public: // User declarations
__fastcall TFormMain(TComponent* Sender);
void __fastcall IdleLoop(TObject*, bool&);
void __fastcall SetPixelFormatDescriptor();
void __fastcall SetupLighting();
void __fastcall SetupTextures();
void __fastcall FormPaint( TObject *Sender );
void __fastcall FormDestroy( TObject *Sender );</P>
<P> void __fastcall Prepare_All();
void __fastcall Prepare_Wolun1();
void __fastcall Prepare_Top();
void __fastcall Prepare_FireRoom();
void __fastcall Prepare_Wolun2();
void __fastcall Prepare_WeiPen();
void __fastcall Prepare_Waike1();
void __fastcall Prepare_Waike2();
void __fastcall Prepare_Waike3();
void __fastcall Prepare_Smoke1();
void __fastcall Prepare_Smoke2();
void __fastcall Prepare_Smoke3();
void __fastcall Prepare_Waike11();
void __fastcall Prepare_Waike21();
void __fastcall Prepare_Waike31();
void __fastcall Normal(float*p1,float*p2,float*p3,float*n);
void __fastcall Draw_Out_All();
void __fastcall Draw_Out_Wolun1();
void __fastcall Draw_Out_Top();
void __fastcall Draw_Out_FireRoom();
void __fastcall Draw_Out_Wolun2();
void __fastcall Draw_Out_WeiPen();
void __fastcall Draw_Out_Waike1();
void __fastcall Draw_Out_Waike2();
void __fastcall Draw_Out_Waike3();
void __fastcall Draw_Out_Waike11();
void __fastcall Draw_Out_Waike21();
void __fastcall Draw_Out_Waike31();
void __fastcall polarView();
void __fastcall Draw_Out_Smoke1();
void __fastcall Draw_Out_Smoke2();
void __fastcall Draw_Out_Smoke3();
void __fastcall ShowM();
particles particle[Max];
particles particle1[Max]; particles particle2[Max];
};
//---------------------------------------------------------------------------
extern PACKAGE TFormMain *FormMain;
//---------------------------------------------------------------------------
#endif
//Unit1.cpp
//------------------------------------------------------------------------------
#include "stdio.h"
#include <vcl.h>
#include "Unit1.h"
#include "Unit2.h"
#include "Unit6.h"
#include "Unit12.h"
#include "Unit14.h"
#include "Unit15.h"
#include "math.h"
//---------------------------------------------------------------------------
#pragma hdrstop
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormMain *FormMain;
//------------------------------------------------------------------------------</P>
<P>//---------------------------------------------------------------------------
GLfloat Throttle=5;
GLfloat glow=.4;
GLfloat glowp=0;
//------------------------------------------------------
__fastcall TFormMain::TFormMain(TComponent* Sender) //初始化窗口
: TForm(Sender)
{
hdc = GetDC(Handle);
Control_Zone->Top = 100;
Control_Zone->Left =3* FormMain->Width/4 + 1;
Control_Zone->Width = FormMain->Width/4 - 32;
Control_Zone->Height = FormMain->Height -32;</P>
<P>
Application->OnIdle = IdleLoop;
Left_Button_Down = FALSE;
key_and_mouse_down = FALSE;
inclined = TRUE;//FALSE;
zoom = 0.99;
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::FormResize(TObject *Sender) //重置窗口
{
Control_Zone->Top = 0;
Control_Zone->Left =ClientWidth-150; //3*ClientWidth/4+
Control_Zone->Width = 150; //ClientWidth/4-
Control_Zone->Height= ClientHeight;</P>
<P> float nRange =75.0;
w = 3*ClientWidth/4-1;
h = ClientHeight;
if( h==0 ) h = 1;</P>
<P> glViewport(0, 0, w, h);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();</P>
<P> if ( w<=h ) glOrtho( -nRange, nRange, -nRange*h/w,nRange*h/w,-nRange,nRange );
else glOrtho( -nRange*w/h,nRange*w/h,-nRange, nRange, -nRange,nRange );</P>
<P> glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
inclined = TRUE;
key_and_mouse_down = FALSE;
}
void __fastcall TFormMain::IdleLoop(TObject*, bool& done) //系统空闲的时候做什么
{
done = false;</P>
<P> if( inclined==FALSE )
{
glRotatef( 15.0, 1.0, 0.0, 0.0 );
glRotatef( -45,0.0,1.0, 0.0 );
inclined = TRUE;
}
if( key_and_mouse_down==FALSE )
glRotatef( 0.05, 0,1.0, 0.0);</P>
<P> Draw_Out_All();</P>
<P>
SwapBuffers(hdc);
}
//------------------------------------------------------------------------------
void __fastcall TFormMain::SetPixelFormatDescriptor()
{
PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR),1,
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,24,
0,0,0,0,0,0,
0,0,
0,0,0,0,0,
32,
0,
0,
PFD_MAIN_PLANE,
0,
0,0,0
};
PixelFormat = ChoosePixelFormat(hdc, &pfd);
SetPixelFormat( hdc, PixelFormat, &pfd );
}
void __fastcall TFormMain::SetupLighting() //设置光源
{
float MaterialAmbient[] = { 0.6, 0.6, 0.6, 1.0 };
float MaterialDiffuse[] = { 0.8, 0.8, 0.8, 1.0 };
float MaterialSpecular[] = { 1.0, 1.0, 1.0, 1.0 };
float MaterialShininess[] = { 80.0 };
glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT, MaterialAmbient );
glMaterialfv( GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialDiffuse );
glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, MaterialSpecular );
glMaterialfv( GL_FRONT_AND_BACK, GL_SHININESS, MaterialShininess);</P>
<P>
float AmbientLightPosition[] = { 0, 0, 30.0, 0.0 };
float LightAmbient[] = { 0.5, 0.5, 0.5, 1.0 };
glLightfv(GL_LIGHT0, GL_POSITION, AmbientLightPosition);</P>
<P> glLightModelfv(GL_LIGHT_MODEL_AMBIENT, LightAmbient);
glLightModelf(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE); //双面反光</P>
<P>
glEnable( GL_LIGHTING );
glEnable( GL_LIGHT0 );
glEnable( GL_COLOR_MATERIAL );</P>
<P>
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );</P>
<P> glShadeModel( GL_SMOOTH );
glEnable(GL_POLYGON_SMOOTH);
}
void __fastcall TFormMain::FormPaint( TObject *Sender )
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glFlush();
}</P>
<P>void __fastcall TFormMain::FormDestroy( TObject *Sender )
{</P>
<P>}
void __fastcall TFormMain::FormCreate(TObject *Sender)
{
hdc = GetDC( Handle );
SetPixelFormatDescriptor();</P>
<P> hrc = wglCreateContext( hdc );
if( hrc == NULL ) ShowMessage("对不起,GL设备描述表是空的。");
if( wglMakeCurrent(hdc, hrc) == false ) ShowMessage("对不起 MakeCurrent() 执行不了。");
w = ClientWidth;
h = ClientHeight;</P>
<P> glEnable( GL_DEPTH_TEST );
glDisable( GL_CULL_FACE );
glClearColor(0.1f,0.1f, 0.3f, 0.0f);
SetupLighting();
//**********************************
Control_Zone->Top = 0;
Control_Zone->Left =ClientWidth-150; //3*ClientWidth/4+
Control_Zone->Width = 150; // ClientWidth/4-
Control_Zone->Height= ClientHeight;</P>
<P> float nRange =75.0;
w = 3*ClientWidth/4-1;
h = ClientHeight;
if( h==0 ) h = 1;</P>
<P> glViewport(0, 0, w, h);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();</P>
<P> if ( w<=h ) glOrtho( -nRange, nRange, -nRange*h/w,nRange*h/w,-nRange,nRange );
else glOrtho( -nRange*w/h,nRange*w/h,-nRange, nRange, -nRange,nRange );</P>
<P> glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
inclined = TRUE;
key_and_mouse_down = FALSE;
//**********************************
Prepare_All();
Prepare_Smoke1();
Prepare_Smoke2();
Prepare_Smoke3();
ShowM();
}
//---------------------------------------------------------------------------
</P>
[align=right][color=#000066][此贴子已经被作者于2005-10-20 10:27:41编辑过][/color][/align]
<P>void __fastcall TFormMain::FormKeyDown(TObject *Sender, WORD &Key,TShiftState Shift) //键盘控制,</P><P>{
if( Key == VK_UP )
{
key_and_mouse_down=TRUE;
glRotatef(-5, 1.0, 0.0, 0.0);
}
if( Key == VK_DOWN )
{
key_and_mouse_down = TRUE;
glRotatef( 5, 1.0, 0.0, 0.0);
}
if( Key == VK_LEFT )
{
key_and_mouse_down = TRUE;
glRotatef(-5, 0.0, 1.0, 0.0);
}
if( Key == VK_RIGHT )
{
key_and_mouse_down = TRUE;
glRotatef( 5, 0.0, 1.0, 0.0);
}
if( Key == VK_ESCAPE )
{
glLoadIdentity();
glRotatef( 15.0, 1.0, 0.0, 0.0 );
glRotatef( -45.0, 0.0, 1.0, 0.0 );
inclined = TRUE;
key_and_mouse_down = FALSE;
}
if( Key == VK_ADD )
{
glScalef(1/zoom,1/zoom,1/zoom);
}
if( Key == VK_SUBTRACT )
{
glScalef(zoom,zoom,zoom);
}
}</P><P>
void __fastcall TFormMain::FormMouseDown(TObject *Sender,TMouseButton Button, TShiftState Shift, int X, int Y)//鼠标控制
{
if( Button==mbLeft )
{
Left_Button_Down = TRUE;
key_and_mouse_down = TRUE;
x = X;
y = Y;
}
else if( Button==mbRight )
{
glLoadIdentity();
glRotatef( 30, 1.0, 0.0, 0.0 );
glRotatef( 15, 0.0, 1.0, 0.0 );
inclined = TRUE;</P><P> Left_Button_Down = FALSE;
key_and_mouse_down = FALSE;
}
else
Left_Button_Down = FALSE;
}
void __fastcall TFormMain::FormMouseUp(TObject *Sender,TMouseButton Button, TShiftState Shift, int X, int Y)
{
Left_Button_Down = FALSE;
}
void __fastcall TFormMain::FormMouseMove(TObject *Sender,TShiftState Shift, int X, int Y)
{
if( Left_Button_Down==TRUE )
{
if( x != X )
glRotatef( (X-x)/4, 0.0, 1.0, 0.0);
if( y != Y )
glRotatef( (Y-y)/4, 1.0, 0.0, 0.0);
x = X;
y = Y;
}
}
void __fastcall TFormMain::FormMouseWheelDown(TObject *Sender,TShiftState Shift, TPoint &MousePos, bool &Handled)
{
glScalef( zoom,zoom,zoom );
}
void __fastcall TFormMain::FormMouseWheelUp(TObject *Sender,TShiftState Shift, TPoint &MousePos, bool &Handled)
{
glScalef( 1/zoom,1/zoom,1/zoom );
}</P><P>void __fastcall TFormMain::Normal( float*p1,float*p2,float*p3,float*n ) //三维坐标转置矩阵
{
float A[3], B[3], l;
A[0] = p1[0] - p2[0];
A[1] = p1[1] - p2[1];
A[2] = p1[2] - p2[2];</P><P> B[0] = p3[0] - p2[0];
B[1] = p3[1] - p2[1];
B[2] = p3[2] - p2[2];</P><P> n[0] = B[1]*A[2] - B[2]*A[1];
n[1] = B[2]*A[0] - B[0]*A[2];
n[2] = B[0]*A[1] - B[1]*A[0];</P><P> l = sqrt(n[0]*n[0] + n[1]*n[1] + n[2]*n[2]);
if(l!=0)
{
n[0]=n[0]/l;
n[1]=n[1]/l;
n[2]=n[2]/l;
}
}
//----
//------------------------------------------------------------------------------
void __fastcall TFormMain::Prepare_All() //做好准备工作 ,建立所有静态物体的模型
{
list_of_objects = glGenLists(6);
Prepare_Wolun1();
Prepare_Top();
Prepare_FireRoom();
Prepare_Wolun2();
Prepare_WeiPen();
waike=glGenLists(3);
Prepare_Waike1();
Prepare_Waike2();
Prepare_Waike3();
Prepare_Waike11();
Prepare_Waike21();
Prepare_Waike31();
}</P> <P>// 以下是 Prepare_All()的子函数</P><P>
void __fastcall TFormMain::Prepare_Wolun1()
{</P><P> GLUquadricObj *quadObj;
glNewList(list_of_objects,GL_COMPILE);
int n;
for(n=0;n<72;n++)
{
GLfloat p1[]={0,0,0};
GLfloat p2[]={-0.5,15*cos(3.141592653*(n+1)/36),15*sin(3.141592653*(n+1)/36)} ;
GLfloat p3[]={0.5,15*cos(3.141592653*n/36),15*sin(3.141592653*n/36)};</P><P> GLfloat m[3];GLfloat n[3];
Normal(p1,p2,p3,m);
Normal(p3,p2,p1,n);
glBegin(GL_POLYGON);
glColor3f(0.8,0.8,0.8);
glNormal3f(m[0],m[1],m[2]);
glVertex3f(p1[0],p1[1],p1[2]);
glVertex3f(p2[0],p2[1],p2[2]);
glVertex3f(p3[0],p3[1],p3[2]);
glEnd();
};
glPushMatrix();
glColor3f(0.3,0.3,0.3);
glTranslatef(-0.25,0,0);
glRotatef( -90.0,0.0,1.0, 0.0 );
quadObj=gluNewQuadric();
gluQuadricNormals(quadObj,GLU_SMOOTH);
gluCylinder(quadObj,7.5,2.8,1,36,2);
glPopMatrix();</P><P> glPushMatrix();
glColor3f(0.3,0.3,0.3);
glTranslatef(1.25,0,0);
glRotatef(-90.0,0.0,1.0, 0.0 );
quadObj=gluNewQuadric();
gluQuadricNormals(quadObj,GLU_SMOOTH);
gluCylinder(quadObj,2.8,7.5,1,36,2);
glPopMatrix();</P><P> glPushMatrix();
glColor3f(0.3,0.3,0.3);
glTranslatef(3.5,0,0);
glRotatef(-90.0,0.0,1.0, 0.0 );
quadObj=gluNewQuadric();
gluQuadricNormals(quadObj,GLU_SMOOTH);
gluCylinder(quadObj,2.8,2.8,10,36,2);
glPopMatrix();</P><P>
glEndList();
}</P><P> void __fastcall TFormMain:: Prepare_Top()
{
GLUquadricObj *quadObj;
glNewList(list_of_objects+1,GL_COMPILE);
glPushMatrix();
glColor3f(0.3,0.3,0.3);
glTranslatef(1.25,0,0);
glRotatef(-90.0,0.0,1.0, 0.0 );
quadObj=gluNewQuadric();
gluQuadricNormals(quadObj,GLU_SMOOTH);
gluCylinder(quadObj,4.5,2.8,10,36,2);
gluCylinder(quadObj,4.5,0,0,36,2);
glColor3f(0.45,0.45,0.45);
gluCylinder(quadObj,17,17,7,36,2);
gluCylinder(quadObj,16,16,7,36,2);
gluCylinder(quadObj,17,16,0,36,2);
//------------------------------------
glColor3f(0.4,0.4,0.4);
int n;
for(n=0;n<12;n++)
{
GLfloat p1[]={0,0,0.1};
GLfloat p2[]={0,0,5};
GLfloat p3[]={16.8*cos(3.141592653/54+3.141592653*n/6),16.8*sin(3.141592653/54+3.141592653*n/6),0.1} ;
GLfloat p4[]={16.8*cos(3.141592653/54+3.141592653*n/6),16.8*sin(3.141592653/54+3.141592653*n/6),5};
GLfloat p5[]={16.8*cos(-3.141592653/54+3.141592653*n/6),16.8*sin(-3.141592653/54+3.141592653*n/6),0.1} ;
GLfloat p6[]={16.8*cos(-3.141592653/54+3.141592653*n/6),16.8*sin(-3.141592653/54+3.141592653*n/6),5};
GLfloat m[3];GLfloat n[3];</P><P> Normal(p1,p2,p3,m);
glBegin(GL_POLYGON);
glNormal3f(m[0],m[1],m[2]);
glVertex3f(p1[0],p1[1],p1[2]);
glVertex3f(p2[0],p2[1],p2[2]);
glVertex3f(p4[0],p4[1],p4[2]);
glVertex3f(p3[0],p3[1],p3[2]);
glEnd();</P><P> Normal(p1,p2,p5,m);
glBegin(GL_POLYGON);
glNormal3f(m[0],m[1],m[2]);
glVertex3f(p1[0],p1[1],p1[2]);
glVertex3f(p2[0],p2[1],p2[2]);
glVertex3f(p6[0],p6[1],p6[2]);
glVertex3f(p5[0],p5[1],p5[2]);
glEnd();</P><P> Normal(p1,p3,p5,m);
glBegin(GL_POLYGON);
glNormal3f(m[0],m[1],m[2]);
glVertex3f(p1[0],p1[1],p1[2]);
glVertex3f(p3[0],p3[1],p3[2]);
glVertex3f(p5[0],p5[1],p5[2]);
glEnd();</P><P> Normal(p4,p2,p6,m);
glBegin(GL_POLYGON);
glNormal3f(m[0],m[1],m[2]);
glVertex3f(p2[0],p2[1],p2[2]);
glVertex3f(p6[0],p6[1],p6[2]);
glVertex3f(p4[0],p4[1],p4[2]);
glEnd();</P><P> };
//---------------------------------------------------------------------
glColor3f(0.5,0.5,0.5);
glTranslatef(0,0,7.0);
gluCylinder(quadObj,17,16,0,36,2);
glTranslatef(0,0,3.0);
glColor3f(0.3,0.3,0.3);
gluQuadricDrawStyle(quadObj,GLU_FILL);
gluSphere(quadObj,2.8,72,72);
glPopMatrix();</P><P> glEndList();
}</P><P> void __fastcall TFormMain:: Prepare_FireRoom()
{
GLUquadricObj *quadObj;int n;
glNewList(list_of_objects+2,GL_COMPILE);
glPushMatrix();
glColor3f(0.3,0.3,0.3);
glTranslatef(-7.25,0,0);
glRotatef( 90.0,0.0,1.0, 0.0 );
quadObj=gluNewQuadric();
gluQuadricNormals(quadObj,GLU_SMOOTH);
gluCylinder(quadObj,2.8,2.8,34,36,2);
glTranslatef(0,0,5);
glColor3f(0.4,0.4,0.6);
gluCylinder(quadObj,2.8,3.5,0,36,2);
gluCylinder(quadObj,3.5,3.5,20,36,2);
glTranslatef(0,0,20);
gluCylinder(quadObj,2.8,3.5,0,36,2);
glPopMatrix();
//---------------------------------------</P><P> glPushMatrix();
glColor3f(0.3,0.3,0.3);
glRotatef( 90.0,0.0,1.0, 0.0 );
gluCylinder(quadObj,8,8,20,36,2);
glTranslatef(0,0,-4);
gluCylinder(quadObj,10,8,4,36,2);
gluCylinder(quadObj,10,14,0,36,2);
gluCylinder(quadObj,14,16,4,36,2);
glColor3f(1,1,1);
for (n=0;n<12;n++)
{
glTranslatef(11*sin(3.141592653*n/6),11*cos(3.141592653*n/6),0.01);
gluCylinder(quadObj,1,1.5,5,36,2);
glTranslatef(-11*sin(3.141592653*n/6),-11*cos(3.141592653*n/6),-0.01);
}
glColor3f(0.3,0.3,0.3);
glTranslatef(0,0,4);
gluCylinder(quadObj,16,16,20,36,2);
glTranslatef(0,0,20);
gluCylinder(quadObj,8,10,4,36,2);
gluCylinder(quadObj,16,14,4,36,2);
glPopMatrix();
glEndList();
}
void __fastcall TFormMain:: Prepare_Wolun2()</P><P>{
GLUquadricObj *quadObj;
glNewList(list_of_objects+3,GL_COMPILE);
int n1;
for(n1=0;n1<36;n1++)
{
GLfloat p1[]={0,0,0};
GLfloat p2[]={-0.7,17*cos(3.141592653*(n1+1)/18),17*sin(3.141592653*(n1+1)/18)} ;
GLfloat p3[]={0.7,17*cos(3.141592653*n1/18),17*sin(3.141592653*n1/18)};</P><P> GLfloat m[3];
Normal(p1,p2,p3,m);
glBegin(GL_POLYGON);
glColor3f(0.8,0.8,0.8);
glNormal3f(m[0],m[1],m[2]);
glVertex3f(p1[0],p1[1],p1[2]);
glVertex3f(p2[0],p2[1],p2[2]);
glVertex3f(p3[0],p3[1],p3[2]);
glEnd();
};
glPushMatrix();
glColor3f(0.3,0.3,0.3);
glTranslatef(-0.35,0,0);
glRotatef( -90.0,0.0,1.0, 0.0 );
quadObj=gluNewQuadric();
gluQuadricNormals(quadObj,GLU_SMOOTH);
gluCylinder(quadObj,8.5,2.8,1,36,2);
glPopMatrix();</P><P> glPushMatrix();
glColor3f(0.3,0.3,0.3);
glTranslatef(1.35,0,0);
glRotatef(-90.0,0.0,1.0, 0.0 );
quadObj=gluNewQuadric();
gluQuadricNormals(quadObj,GLU_SMOOTH);
gluCylinder(quadObj,2.8,8.5,1,36,2);
glPopMatrix();</P><P> glPushMatrix();
glColor3f(0.3,0.3,0.3);
glTranslatef(3.5,0,0);
glRotatef(-90.0,0.0,1.0, 0.0 );
quadObj=gluNewQuadric();
gluQuadricNormals(quadObj,GLU_SMOOTH);
gluCylinder(quadObj,2.8,2.8,10,36,2);
glPopMatrix();</P><P> glPushMatrix();
glRotatef(-90.0,0.0,1.0,0.0 );
glTranslatef(0,0,2.5);
quadObj=gluNewQuadric();
gluQuadricNormals(quadObj,GLU_SMOOTH);
gluCylinder(quadObj,4,0,0,36,2);
glTranslatef(0,0,-1);
gluCylinder(quadObj,4,4,1,36,2);</P><P> gluCylinder(quadObj,4,5.5,0,36,2);
glTranslatef(0,0,-1);
gluCylinder(quadObj,5.5,5.5,1,36,2);
gluCylinder(quadObj,5.5,7,0,36,2);</P><P> glTranslatef(0,0,-1);
gluCylinder(quadObj,7,7,1,36,2);
glPopMatrix();</P><P> glEndList();
}</P><P> void __fastcall TFormMain:: Prepare_WeiPen()
{
GLUquadricObj *quadObj;
glColor3f(0.3,0.3,0.3);
glNewList(list_of_objects+4,GL_COMPILE);
glPushMatrix();
glRotatef(90.0,0.0,1.0,0.0 );
glTranslatef(0,0,30);
quadObj=gluNewQuadric();
gluQuadricNormals(quadObj,GLU_SMOOTH);
gluCylinder(quadObj,2.8,2.8,5,36,2);
glTranslatef(0,0,5);
gluCylinder(quadObj,2.8,10,0,36,2);
gluCylinder(quadObj,10,0,17,36,2);
glPopMatrix();
glEndList();
}
void __fastcall TFormMain:: Prepare_Waike1()
{</P><P> GLUquadricObj *quadObj;
glNewList(waike,GL_COMPILE);
glPushMatrix();
glRotatef(90.0,0.0,1.0,0.0 );
glTranslatef(0,0,-35);
quadObj=gluNewQuadric();
gluQuadricNormals(quadObj,GLU_SMOOTH);
glColor3f(0.4,0.4,0.4);
gluCylinder(quadObj,16,16,5,36,2);
glTranslatef(0,0,5);
gluCylinder(quadObj,16,16.5,1,36,2);
gluCylinder(quadObj,16.5,16.5,4,36,2);</P><P> glTranslatef(0,0,4);
glColor3f(0.2,0.2,0.7);
gluCylinder(quadObj,16.5,16,0.5,36,2);
gluCylinder(quadObj,16,16,0.5,36,2);
glTranslatef(0,0,0.5);
gluCylinder(quadObj,16,16.5,0.5,36,2);</P><P> glColor3f(0.4,0.4,0.4);
gluCylinder(quadObj,16.5,16.5,4,36,2);</P><P> glTranslatef(0,0,4);
glColor3f(0.2,0.2,0.7);
gluCylinder(quadObj,16.5,16,0.5,36,2);</P><P> glTranslatef(0,0,0.5);
gluCylinder(quadObj,16,16.5,0.5,36,2);</P><P> glColor3f(0.4,0.4,0.4);
gluCylinder(quadObj,16.5,16.5,4,36,2);</P><P> glTranslatef(0,0,4);
glColor3f(0.2,0.2,0.7);
gluCylinder(quadObj,16.5,16,0.5,36,2);
glTranslatef(0,0,0.5);
gluCylinder(quadObj,16,16.5,0.5,36,2);</P><P> glColor3f(0.4,0.4,0.4);
gluCylinder(quadObj,16.5,16.5,4,36,2);</P><P> glTranslatef(0,0,4);
glColor3f(0.2,0.2,0.7);
gluCylinder(quadObj,16.5,16,0.5,36,2);
glTranslatef(0,0,0.5);
gluCylinder(quadObj,16,16.5,0.5,36,2);</P><P> glColor3f(0.4,0.4,0.4);
gluCylinder(quadObj,16.5,16.5,4,36,2);</P><P> glTranslatef(0,0,4);
gluCylinder(quadObj,16.5,15,1,36,2);</P><P>
glPopMatrix();
glEndList();
}
void __fastcall TFormMain:: Prepare_Waike2()
{
GLUquadricObj *quadObj;
glNewList(waike+1,GL_COMPILE);
glPushMatrix();
quadObj=gluNewQuadric();
gluQuadricNormals(quadObj,GLU_SMOOTH);
glColor3f(0.3,0.3,0.7);
glRotatef(90.0,0.0,1.0,0.0 );
glTranslatef(0,0,-7);
gluCylinder(quadObj,15,15,4,36,2);
glTranslatef(0,0,4);
gluCylinder(quadObj,15,16.5,2,36,2);
glTranslatef(0,0,2);
gluCylinder(quadObj,16.5,17,2,36,2);
glTranslatef(0,0,2);
gluCylinder(quadObj,17,17,20,36,2);
glTranslatef(0,0,20);
gluCylinder(quadObj,17,16.5,2,36,2);
glTranslatef(0,0,2);
gluCylinder(quadObj,16.5,15,2,36,2);
gluCylinder(quadObj,15,15,3,36,2);
glPopMatrix();
glEndList();
}</P><P> </P> void __fastcall TFormMain:: Prepare_Waike3()
{<P> GLUquadricObj *quadObj;
glNewList(waike+2,GL_COMPILE);
glPushMatrix();
quadObj=gluNewQuadric();
gluQuadricNormals(quadObj,GLU_SMOOTH);
glColor3f(0.7,0.7,0.7);
glRotatef(90.0,0.0,1.0,0.0 );
glTranslatef(0,0,26);
gluCylinder(quadObj,15,18,0,36,2);
gluCylinder(quadObj,18,18,0.5,36,2);
glTranslatef(0,0,0.5);
gluCylinder(quadObj,18,17.3,1,36,2);
glTranslatef(0,0,1);
gluCylinder(quadObj,17.3,17.8,3,36,2);
glTranslatef(0,0,3);
gluCylinder(quadObj,17.8,17.8,4.5,36,2);
glTranslatef(0,0,4.5);
gluCylinder(quadObj,12,19,0,36,2);
glColor3f(0.9,0.9,0.9);
gluCylinder(quadObj,19,19,1,36,2);
gluCylinder(quadObj,12,12,1,36,2);
glTranslatef(0,0,1);
gluCylinder(quadObj,12,19,0,36,2);
gluCylinder(quadObj,18.5,15.5,15,36,2);
gluCylinder(quadObj,17.5,14.5,15,36,2);
glColor3f(0.1,0.1,0.1);
glTranslatef(0,0,15);
gluCylinder(quadObj,14.5,15.5,0,36,2);
gluCylinder(quadObj,15.5,11,12,36,2);
gluCylinder(quadObj,14.5,10,12,36,2);
glTranslatef(0,0,12);
gluCylinder(quadObj,11,10,0,36,2);
glColor3f(0.3,0.3,0.3);
glPopMatrix();
glEndList();
}
void __fastcall TFormMain:: Prepare_Waike11()
{</P><P> GLUquadricObj *quadObj;
glNewList(waike+3,GL_COMPILE);
glPushMatrix();
glRotatef(90.0,0.0,1.0,0.0 );
glTranslatef(0,0,-35);
quadObj=gluNewQuadric();
gluQuadricNormals(quadObj,GLU_SMOOTH);
glColor3f(0.6,0.6,0.6);
gluCylinder(quadObj,16,16,5,36,2);
glTranslatef(0,0,5);
gluCylinder(quadObj,16,16.5,1,36,2);
gluCylinder(quadObj,16.5,16.5,4,36,2);</P><P> glTranslatef(0,0,4);
glColor3f(0.8,0.8,0.3);
gluCylinder(quadObj,16.5,16,0.5,36,2);
gluCylinder(quadObj,16,16,0.5,36,2);
glTranslatef(0,0,0.5);
gluCylinder(quadObj,16,16.5,0.5,36,2);</P><P> glColor3f(0.6,0.6,0.6);
gluCylinder(quadObj,16.5,16.5,4,36,2);</P><P> glTranslatef(0,0,4);
glColor3f(0.8,0.8,0.3);
gluCylinder(quadObj,16.5,16,0.5,36,2);</P><P> glTranslatef(0,0,0.5);
gluCylinder(quadObj,16,16.5,0.5,36,2);</P><P> glColor3f(0.6,0.6,0.6);
gluCylinder(quadObj,16.5,16.5,4,36,2);</P><P> glTranslatef(0,0,4);
glColor3f(0.8,0.8,0.3);
gluCylinder(quadObj,16.5,16,0.5,36,2);
glTranslatef(0,0,0.5);
gluCylinder(quadObj,16,16.5,0.5,36,2);</P><P> glColor3f(0.6,0.6,0.6);
gluCylinder(quadObj,16.5,16.5,4,36,2);</P><P> glTranslatef(0,0,4);
glColor3f(0.8,0.8,0.3);
gluCylinder(quadObj,16.5,16,0.5,36,2);
glTranslatef(0,0,0.5);
gluCylinder(quadObj,16,16.5,0.5,36,2);</P><P> glColor3f(0.6,0.6,0.6);
gluCylinder(quadObj,16.5,16.5,4,36,2);</P><P> glTranslatef(0,0,4);
gluCylinder(quadObj,16.5,15,1,36,2);</P><P>
glPopMatrix();
glEndList();
}
void __fastcall TFormMain:: Prepare_Waike21()
{
GLUquadricObj *quadObj;
glNewList(waike+4,GL_COMPILE);
glPushMatrix();
quadObj=gluNewQuadric();
gluQuadricNormals(quadObj,GLU_SMOOTH);
glColor3f(0.7,0.7,0.3);
glRotatef(90.0,0.0,1.0,0.0 );
glTranslatef(0,0,-7);
gluCylinder(quadObj,15,15,4,36,2);
glTranslatef(0,0,4);
gluCylinder(quadObj,15,16.5,2,36,2);
glTranslatef(0,0,2);
gluCylinder(quadObj,16.5,17,2,36,2);
glTranslatef(0,0,2);
gluCylinder(quadObj,17,17,20,36,2);
glTranslatef(0,0,20);
gluCylinder(quadObj,17,16.5,2,36,2);
glTranslatef(0,0,2);
gluCylinder(quadObj,16.5,15,2,36,2);
gluCylinder(quadObj,15,15,3,36,2);
glPopMatrix();
glEndList();
}</P><P> void __fastcall TFormMain:: Prepare_Waike31()
{</P><P> GLUquadricObj *quadObj;
glNewList(waike+5,GL_COMPILE);
glPushMatrix();
quadObj=gluNewQuadric();
gluQuadricNormals(quadObj,GLU_SMOOTH);
glColor3f(0.3,0.7,0.3);
glRotatef(90.0,0.0,1.0,0.0 );
glTranslatef(0,0,26);
gluCylinder(quadObj,15,18,0,36,2);
gluCylinder(quadObj,18,18,0.5,36,2);
glTranslatef(0,0,0.5);
gluCylinder(quadObj,18,17.3,1,36,2);
glTranslatef(0,0,1);
gluCylinder(quadObj,17.3,17.8,3,36,2);
glTranslatef(0,0,3);
gluCylinder(quadObj,17.8,17.8,4.5,36,2);
glTranslatef(0,0,4.5);
gluCylinder(quadObj,12,19,0,36,2);
glColor3f(0.1,0.9,0.1);
gluCylinder(quadObj,19,19,1,36,2);
gluCylinder(quadObj,12,12,1,36,2);
glTranslatef(0,0,1);
gluCylinder(quadObj,12,19,0,36,2);
gluCylinder(quadObj,18.5,15.5,15,36,2);
gluCylinder(quadObj,17.5,14.5,15,36,2);
glColor3f(0.1,0.7,0.1);
glTranslatef(0,0,15);
gluCylinder(quadObj,14.5,15.5,0,36,2);
gluCylinder(quadObj,15.5,11,12,36,2);
gluCylinder(quadObj,14.5,10,12,36,2);
glTranslatef(0,0,12);
gluCylinder(quadObj,11,10,0,36,2);
glPopMatrix();
glEndList();
}</P> <P>//------------------------------------------------------------------------------
void __fastcall TFormMain::Draw_Out_All() //控制画图的函数,相当于装配工,按要求画出需要的图形,参数由按钮控制
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );</P><P>
if(K==0){ //音乐开关</P><P> }
//粒子开关
if(J==0){
if(N==0.5&&I!=10) {
if(M==0)
{
Draw_Out_Smoke2();
Draw_Out_Smoke1();
Draw_Out_Smoke3();
}
else if((M==1&&I==5)||(M==1&&I==6))
{
glPushMatrix();
glTranslatef(26,0,0);
Draw_Out_Smoke2();
Draw_Out_Smoke1();
Draw_Out_Smoke3();
glPopMatrix();
}
else if((M==1&&I==8)||(M==1&&I==7)||(M==1&&I==9))
{
glPushMatrix();
glTranslatef(-5,0,0);
Draw_Out_Smoke2();
Draw_Out_Smoke1();
Draw_Out_Smoke3();
glPopMatrix();
}
else if((M==1&&I==11)||(M==1&&I==12))
{
glPushMatrix();
glTranslatef(-30,0,0);
Draw_Out_Smoke2();
Draw_Out_Smoke1();
Draw_Out_Smoke3();
glPopMatrix();
}
else if((M==1&&I==0)||(M==1&&I==1))
{</P><P> Draw_Out_Smoke2();
Draw_Out_Smoke1();
Draw_Out_Smoke3();</P><P> }
}
}</P><P> if(I==0)
{ Draw_Out_Top();
Draw_Out_Wolun1();
Draw_Out_FireRoom();
Draw_Out_Wolun2();
Draw_Out_WeiPen();
Draw_Out_Waike1();
Draw_Out_Waike2();
Draw_Out_Waike3();</P><P>
}</P><P> if(I==1)
{
Draw_Out_Wolun1();
GLdouble equ[4]={0,0,-1,0} ;
glClipPlane(GL_CLIP_PLANE0,equ);
glEnable(GL_CLIP_PLANE0);
Draw_Out_FireRoom();
glDisable(GL_CLIP_PLANE0);
GLdouble equ1[4]={0,-1,0,0} ;
glClipPlane(GL_CLIP_PLANE1,equ1);
glEnable(GL_CLIP_PLANE1);
Draw_Out_FireRoom();
glDisable(GL_CLIP_PLANE1);
Draw_Out_Wolun2();
Draw_Out_WeiPen();
Draw_Out_Top();
}</P><P> if(I==5){ //第一
if (M==0)
{
Draw_Out_Top();
Draw_Out_Wolun1();
Draw_Out_FireRoom();
Draw_Out_Wolun2();
Draw_Out_WeiPen();
Draw_Out_Waike2();
Draw_Out_Waike3();
//*************************************************change color
if(L==1)
Draw_Out_Waike11();
else if(L==0)
Draw_Out_Waike1();
}
else if(M==1)
{
glPushMatrix();
glTranslatef(26,0,0);
Draw_Out_Wolun1();
Draw_Out_Top();
Draw_Out_Waike1();glPopMatrix();
}
}</P><P>
if(I==6){
if (M==0)
{
Draw_Out_Wolun1();
Draw_Out_FireRoom();
Draw_Out_Wolun2();
Draw_Out_WeiPen();
Draw_Out_Waike2();
Draw_Out_Waike3();
Draw_Out_Top();</P><P> }
else if(M==1)
{
glPushMatrix();
glTranslatef(26,0,0);
Draw_Out_Wolun1();
Draw_Out_Top();
glPopMatrix();
}
}</P><P> if(I==7){ //燃烧室
if (M==0)
{
Draw_Out_Top();
Draw_Out_Waike1();
Draw_Out_Wolun1();
Draw_Out_FireRoom();
Draw_Out_WeiPen();
Draw_Out_Wolun2();
Draw_Out_Waike3();
if(O==1)
Draw_Out_Waike21();
else if(O==0)
Draw_Out_Waike2();
}
else if(M==1)
{ glPushMatrix();
glTranslatef(-5,0,0);
Draw_Out_FireRoom();
Draw_Out_Waike2();
glPopMatrix();
}
}
if(I==8){
if (M==0)
{
Draw_Out_Top();
Draw_Out_Waike1();
Draw_Out_Wolun1();
Draw_Out_WeiPen();
Draw_Out_Wolun2();
Draw_Out_Waike3();
//*************************************************change color
GLdouble equ[4]={0,0,-1,0} ;
glClipPlane(GL_CLIP_PLANE0,equ);
glEnable(GL_CLIP_PLANE0);
Draw_Out_FireRoom();
glDisable(GL_CLIP_PLANE0);
GLdouble equ1[4]={0,-1,0,0} ;
glClipPlane(GL_CLIP_PLANE1,equ1);
glEnable(GL_CLIP_PLANE1);
Draw_Out_FireRoom();
glDisable(GL_CLIP_PLANE1);
//*************************************************************************************//*****
}
else if(M==1)
{
glPushMatrix();
glTranslatef(-5,0,0);
GLdouble equ[4]={0,0,-1,0} ;
glClipPlane(GL_CLIP_PLANE0,equ);
glEnable(GL_CLIP_PLANE0);
Draw_Out_FireRoom();
glDisable(GL_CLIP_PLANE0);
GLdouble equ1[4]={0,-1,0,0} ;
glClipPlane(GL_CLIP_PLANE1,equ1);
glEnable(GL_CLIP_PLANE1);
Draw_Out_FireRoom();
glDisable(GL_CLIP_PLANE1);
glPopMatrix();
}
}
if(I==9){ //切割
if (M==0)
{
Draw_Out_Top();
Draw_Out_Waike1();
Draw_Out_Wolun1();
Draw_Out_WeiPen();
Draw_Out_Wolun2();
Draw_Out_Waike3();
GLdouble equ[4]={0,0,-1,0} ;
glClipPlane(GL_CLIP_PLANE0,equ);
glEnable(GL_CLIP_PLANE0);
Draw_Out_FireRoom();
Draw_Out_Waike2();
glDisable(GL_CLIP_PLANE0);
}
else if(M==1)
{ glPushMatrix();
glTranslatef(-5,0,0);
GLdouble equ[4]={0,0,-1,0} ;
glClipPlane(GL_CLIP_PLANE0,equ);
glEnable(GL_CLIP_PLANE0);
Draw_Out_FireRoom();
Draw_Out_Waike2();
glDisable(GL_CLIP_PLANE0);
glPopMatrix();
}
}
if(I==10){
glPushMatrix();
glTranslatef(-5,0,0); //特写
GLdouble equ[4]={0,0,-1,0} ;
glClipPlane(GL_CLIP_PLANE0,equ);
glEnable(GL_CLIP_PLANE0);
Draw_Out_FireRoom();
Draw_Out_Waike2();
glDisable(GL_CLIP_PLANE0);
Draw_Out_Smoke3();
glPopMatrix();</P><P> }</P><P> if(I==11){ //第二 轴流压缩室
if (M==0)
{
Draw_Out_Top();
Draw_Out_Wolun1();
Draw_Out_FireRoom();
Draw_Out_Wolun2();
Draw_Out_WeiPen();
Draw_Out_Waike1();
Draw_Out_Waike2();
//*************************************************change color
if(P==1)
Draw_Out_Waike31();
else if(P==0)
Draw_Out_Waike3();
}
else if(M==1)
{ glPushMatrix();
glTranslatef(-30,0,0);
Draw_Out_WeiPen();
Draw_Out_Waike3();
Draw_Out_Wolun2();
glPopMatrix();
}
}</P><P> if(I==12){
if (M==0)
{
Draw_Out_Top();
Draw_Out_Waike1();
Draw_Out_Wolun1();
Draw_Out_FireRoom();
Draw_Out_Waike2();
//*************************************************change color
Draw_Out_Wolun2();
Draw_Out_WeiPen();
}
else if(M==1)
{ glPushMatrix();
glTranslatef(-30,0,0);
Draw_Out_Wolun2();
Draw_Out_WeiPen();
glPopMatrix();</P><P> }</P><P> }</P><P> if(I==13)
{
Close();
}
glFlush();
SwapBuffers(hdc);
}</P><P>void __fastcall TFormMain::Draw_Out_Wolun1()
{</P><P>
glPushMatrix();
n+=N;
polarView();
glTranslatef(-28,0,0);
glCallList(list_of_objects);
glTranslatef(4,0,0);
glCallList(list_of_objects);
glTranslatef(3.5,0,0);
glCallList(list_of_objects);
glTranslatef(3,0,0);
glCallList(list_of_objects);
glTranslatef(2.5,0,0);
glCallList(list_of_objects);
glTranslatef(2,0,0);
glCallList(list_of_objects);
glTranslatef(1.75,0,0);
glCallList(list_of_objects);
glTranslatef(1.5,0,0);
glCallList(list_of_objects);
glPopMatrix();
}
void __fastcall TFormMain::Draw_Out_Top()
{</P><P> glPushMatrix();
glTranslatef(-36,0,0);
glCallList(list_of_objects+1);
glPopMatrix();</P><P>
}</P> <P>void __fastcall TFormMain::Draw_Out_FireRoom()
{</P>
<P> glPushMatrix();
glTranslatef(0,0,0);
glCallList(list_of_objects+2);
glPopMatrix();</P>
<P>
}</P>
<P> void __fastcall TFormMain::Draw_Out_Wolun2()
{</P>
<P> glPushMatrix();
n+=N;
polarView();
glTranslatef(30,0,0);
glCallList(list_of_objects+3);
glTranslatef(4,0,0);
glCallList(list_of_objects+3);
glPopMatrix();</P>
<P>
}</P>
<P> void __fastcall TFormMain::Draw_Out_WeiPen()
{</P>
<P> glPushMatrix();
glTranslatef(5,0,0);
glCallList(list_of_objects+4);
glPopMatrix();</P>
<P> }
void __fastcall TFormMain::Draw_Out_Waike1()
{</P>
<P> glPushMatrix();
glCallList(waike);
glPopMatrix();</P>
<P> }</P>
<P>
void __fastcall TFormMain::Draw_Out_Waike2()
{</P>
<P> glPushMatrix();
glCallList(waike+1);
glPopMatrix();</P>
<P> }</P>
<P> void __fastcall TFormMain::Draw_Out_Waike3()
{</P>
<P> glPushMatrix();
glTranslatef(0,0,0);
glCallList(waike+2);
glPopMatrix();</P>
<P> }
void __fastcall TFormMain::Draw_Out_Waike11()
{</P>
<P> glPushMatrix();
glCallList(waike+3);
glPopMatrix();</P>
<P> }</P>
<P>
void __fastcall TFormMain::Draw_Out_Waike21()
{</P>
<P> glPushMatrix();
glCallList(waike+4);
glPopMatrix();</P>
<P> }</P>
<P> void __fastcall TFormMain::Draw_Out_Waike31()
{</P>
<P> glPushMatrix();
glTranslatef(0,0,0);
glCallList(waike+5);
glPopMatrix();</P>
<P> }</P>
<P>
void __fastcall TFormMain::Button1Click(TObject *Sender)
{
key_and_mouse_down=TRUE;
glRotatef(-5, 1.0, 0.0, 0.0);
}</P>
<P>void __fastcall TFormMain::Button5Click(TObject *Sender) //第一轴流压缩室
{
I=5;
if(L==0)
L=1;
else
L=0;</P>
<P>}
//---------------------------------------------------------------------------</P>
<P>void __fastcall TFormMain::Button6Click(TObject *Sender)
{
I=6;
}
//---------------------------------------------------------------------------</P>
<P>void __fastcall TFormMain::Button7Click(TObject *Sender) // 燃烧室
{
I=7;
if(O==0)
O=1;
else
O=0;
}
//---------------------------------------------------------------------------</P>
<P>void __fastcall TFormMain::Button8Click(TObject *Sender)
{
I=8;
}
//---------------------------------------------------------------------------</P>
<P>void __fastcall TFormMain::Button9Click(TObject *Sender)
{
I=9;
}
//---------------------------------------------------------------------------</P>
<P>void __fastcall TFormMain::Button10Click(TObject *Sender)
{
I=10;
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::Button11Click(TObject *Sender)
{
I=11;
if(P==0)
P=1;
else
P=0;
}
//---------------------------------------------------------------------------</P>
<P>void __fastcall TFormMain::Button12Click(TObject *Sender)
{
I=12;
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::Button13Click(TObject *Sender)
{
I=13;
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::Button14Click(TObject *Sender)
{
I=0;
}
//---------------------------------------------------------------------------</P>
<P>void __fastcall TFormMain::Button15Click(TObject *Sender)
{
I=1;
}
//---------------------------------------------------------------------------</P>
<P>void __fastcall TFormMain::Timer1Timer(TObject *Sender)
{</P>
<P>
Timer1->Interval=10;</P>
<P> Draw_Out_Wolun1();
Draw_Out_Wolun2();
Yield();
Timer1->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::polarView()
{
glRotatef(n,1.0,0.0,0.0 );
}</P>
[align=right][color=#000066][此贴子已经被作者于2005-10-20 10:22:25编辑过][/color][/align]
<P>//-----------粒子系统-------------------------------------------------
void __fastcall TFormMain::Prepare_Smoke1() ///********************************************
{</P><P>
for (loop=0;loop<Max;loop++)
{</P><P> particle[loop].active=true;
particle[loop].life=1.0f;
particle[loop].fade=0.075f;
particle[loop].z= 3;
V = (GLfloat((rand()%5))+2)/5;
Angle = GLfloat(rand()%360);
particle[loop].zg = .15;
particle[loop].xi = sin(3.141592653*Angle/180) * V;
particle[loop].yi = cos(3.141592653*Angle/180) * V;
particle[loop].zi = ((rand()%10)-5)/5;
}</P><P>}
void __fastcall TFormMain::Draw_Out_Smoke1()
{
glPushMatrix();
glColor4f(1,1,1,0.5);
glRotatef(90,0.0,1.0,0.0 ) ;
glTranslatef(0,0,60);
//****************************************
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
GLfloat exhaust_r, exhaust_g, exhaust_b;
exhaust_r = 1;
exhaust_g = 0.6;
exhaust_b = 0;</P><P> //*******************************************
for (loop=0;loop<Max;loop++)
{
GLfloat x=particle[loop].x;
GLfloat y=particle[loop].y;
GLfloat z=particle[loop].z;</P><P> glColor4f(particle[loop].r,particle[loop].g,particle[loop].b,particle[loop].life/2);
glBegin(GL_TRIANGLE_STRIP);
glVertex3f(x,y,z+0.5f);
glVertex3f(x-0.5f,y-0.35f,z-0.35);
glVertex3f(x+0.5f,y-0.9f,z-0.35);
glVertex3f(x,y+0.5,z-0.35);
glVertex3f(x,y,z+0.5f);
glVertex3f(x-0.5f,y-0.35f,z-0.35);
glEnd();</P><P> particle[loop].x+=particle[loop].xi/80;
particle[loop].y+=particle[loop].yi/80;
particle[loop].z+=particle[loop].zi/70;
particle[loop].xi*=1;
particle[loop].yi*=1;
particle[loop].zi*=1;
particle[loop].zi+=particle[loop].zg;
particle[loop].life-=particle[loop].fade;
if(particle[loop].y*particle[loop].y+particle[loop].x*particle[loop].x>81)
{
particle[loop].r=exhaust_r;
particle[loop].g=exhaust_g;
particle[loop].b=exhaust_b;</P><P> particle[loop].life=1.0f;
particle[loop].fade=GLfloat(rand()%100)/7500+0.0075f;</P><P> particle[loop].z= 3.f;
V = (GLfloat((rand()%5))+2)/5;
Angle = GLfloat(rand()%360);</P><P> particle[loop].xi = sin(3.141592653*Angle/180) * V;
particle[loop].yi = cos(3.141592653*Angle/180) * V;
particle[loop].zi = ((rand()%10)-5)/5+ Throttle*8;
}</P><P> if (particle[loop].life<0.05f)
{
particle[loop].r=exhaust_r;
particle[loop].g=exhaust_g;
particle[loop].b=exhaust_b;</P><P> particle[loop].life=1.0f;
particle[loop].fade=GLfloat(rand()%100)/7500+0.0075f;
particle[loop].z= 3.f;
V = (GLfloat((rand()%5))+2)/5;
Angle = GLfloat(rand()%360);
particle[loop].xi = sin(3.141592653*Angle/180) * V;
particle[loop].yi = cos(3.141592653*Angle/180) * V;
particle[loop].zi = ((rand()%10)-5)/5+ Throttle*8;
}
} glPopMatrix();
glDisable(GL_BLEND);
glColor4f(0.3,0.3,0.3,0);
}</P><P> void __fastcall TFormMain::Prepare_Smoke2() ///********************************************
{</P><P>
for (loop=0;loop<Max;loop++)
{</P><P> particle1[loop].active=true;
particle1[loop].life=1.0f;
particle1[loop].fade=1;
particle1[loop].z= 3;
V = (GLfloat((rand()%5))+2)/5;
Angle = GLfloat(rand()%360);
particle1[loop].zg = .15;
particle1[loop].xi = sin(3.141592653*Angle/180) * V;
particle1[loop].yi = cos(3.141592653*Angle/180) * V;
particle1[loop].zi = ((rand()%10)-5)/5;
}</P><P>}
void __fastcall TFormMain::Draw_Out_Smoke2()
{
glPushMatrix();
glColor4f(1,1,1,0.5);
glRotatef(90,0.0,1.0,0.0 ) ;
glTranslatef(0,0,-60);
//****************************************
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
GLfloat exhaust_r, exhaust_g, exhaust_b;
exhaust_r = 0.9;
exhaust_g = 0.9;
exhaust_b = 0.9;</P><P> //*******************************************
for (loop=0;loop<Max;loop++)
{
GLfloat x=particle1[loop].x;
GLfloat y=particle1[loop].y;
GLfloat z=particle1[loop].z;</P><P> glColor4f(particle1[loop].r,particle1[loop].g,particle1[loop].b,1-particle1[loop].life);
glBegin(GL_TRIANGLE_STRIP);
glVertex3f(x,y,z+0.3f);
glVertex3f(x-0.3f,y-0.10f,z-0.10);
glVertex3f(x+0.3f,y-0.3f,z-0.10);
glVertex3f(x,y+0.3,z-0.10);
glVertex3f(x,y,z+0.3f);
glVertex3f(x-0.3f,y-0.10f,z-0.10);
glEnd();</P><P> particle1[loop].x+=particle1[loop].xi/40;
particle1[loop].y+=particle1[loop].yi/40;
particle1[loop].z+=particle1[loop].zi/76;
particle1[loop].xi*=1;
particle1[loop].yi*=1;
particle1[loop].zi*=1;
particle1[loop].zi+=particle1[loop].zg;
particle1[loop].life-=particle1[loop].fade;
if(particle1[loop].y*particle1[loop].y+particle1[loop].x*particle1[loop].x>210.25)
{
particle1[loop].r=exhaust_r;
particle1[loop].g=exhaust_g;
particle1[loop].b=exhaust_b;</P><P> particle1[loop].life=1.0f;
particle1[loop].fade=GLfloat(rand()%100)/7500+0.01f;</P><P> particle1[loop].z= 3.f;
V = (GLfloat((rand()%5))+2)/5;
Angle = GLfloat(rand()%360);</P><P> particle1[loop].xi = sin(3.141592653*Angle/180) * V;
particle1[loop].yi = cos(3.141592653*Angle/180) * V;
particle1[loop].zi = ((rand()%10)-5)/5+ Throttle*8;
}</P><P> if (particle1[loop].life<0.05f)
{
particle1[loop].r=exhaust_r;
particle1[loop].g=exhaust_g;
particle1[loop].b=exhaust_b;</P><P> particle1[loop].life=1.0f;
particle1[loop].fade=GLfloat(rand()%100)/7500+0.0075f;
particle1[loop].z= 3.f;
V = (GLfloat((rand()%5))+2)/5;
Angle = GLfloat(rand()%360);
particle1[loop].xi = sin(3.141592653*Angle/180) * V;
particle1[loop].yi = cos(3.141592653*Angle/180) * V;
particle1[loop].zi = ((rand()%10)-5)/5+ Throttle*8;
}
} glPopMatrix();
glDisable(GL_BLEND);
glColor4f(0.3,0.3,0.3,0);
}</P><P> void __fastcall TFormMain::Prepare_Smoke3()
{
int n1;
for(n1=0;n1<12;n1++){
for (loop=n*Max2/12;loop<(n+1)*Max2/12;loop++)
{</P><P>
particle2[loop].active=true;
particle2[loop].life=1.0f;
particle2[loop].fade=1;
particle2[loop].x=sin(n1*3.141592653/6)*(10+(rand()%40)/10);
particle2[loop].y=cos(n1*3.141592653/6)*(10+(rand()%40)/10);
particle2[loop].z= 3;
V = (GLfloat((rand()%5))+2)/5;
Angle = GLfloat(rand()%360);
particle2[loop].zg = .15;
particle2[loop].xi = sin(3.141592653*Angle/180) * V;
particle2[loop].yi = cos(3.141592653*Angle/180) * V;
particle2[loop].zi = ((rand()%10)-5)/5;
}
}</P><P>}
void __fastcall TFormMain::Draw_Out_Smoke3()
{
glPushMatrix();
glColor4f(1,0,0,0.5);
glRotatef(90,0.0,1.0,0.0 ) ;
glTranslatef(0,0,-2);
//****************************************
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
GLfloat exhaust_r, exhaust_g, exhaust_b;
exhaust_r = 0.9;
exhaust_g = 0.4;
exhaust_b = 0;</P><P> //*******************************************
for (loop=0;loop<Max2;loop++)
{
GLfloat x=particle2[loop].x;
GLfloat y=particle2[loop].y;
GLfloat z=particle2[loop].z;</P><P> glColor4f(particle2[loop].r,particle2[loop].g,particle2[loop].b,0.7);
glBegin(GL_TRIANGLE_STRIP);
glVertex3f(x,y,z+0.5f);
glVertex3f(x-0.5f,y-0.350f,z-0.35);
glVertex3f(x+0.5f,y-0.5f,z-0.35);
glVertex3f(x,y+0.5,z-0.35);
glVertex3f(x,y,z+0.5f);
glVertex3f(x-0.5f,y-0.35f,z-0.35);
glEnd();</P><P> particle2[loop].x+=particle2[loop].xi/40;
particle2[loop].y+=particle2[loop].yi/40;
particle2[loop].z+=particle2[loop].zi/38;</P><P> particle2[loop].zi+=particle2[loop].zg;
particle2[loop].life-=particle2[loop].fade;</P><P> if(particle2[loop].y*particle2[loop].y+particle2[loop].x*particle2[loop].x>225||
particle2[loop].y*particle2[loop].y+particle2[loop].x*particle2[loop].x<64)
{</P><P> int n1;
n1= rand()%12;
particle2[loop].life=1.0f;
particle2[loop].fade=1;
particle2[loop].x=sin(n1*3.141592653/6)*(10+(rand()%40)/10);
particle2[loop].y=cos(n1*3.141592653/6)*(10+(rand()%40)/10);
particle2[loop].z= 3;
V = (GLfloat((rand()%5))+2)/5;
Angle = GLfloat(rand()%360);
particle2[loop].zg = .15;
particle2[loop].xi = sin(3.141592653*Angle/180) * V;
particle2[loop].yi = cos(3.141592653*Angle/180) * V;
particle2[loop].zi = ((rand()%10)-5)/5;</P><P> }
if (particle2[loop].life<0.38f)
{
particle2[loop].x*=0.97;
particle2[loop].y*=0.97;</P><P> }</P><P> if (particle2[loop].life<0.05f)
{
particle2[loop].r=exhaust_r;
particle2[loop].g=exhaust_g;
particle2[loop].b=exhaust_b;</P><P> particle2[loop].life=1.0f;
particle2[loop].fade=GLfloat(rand()%100)/7500+0.0075f;
particle2[loop].z= 3.f;
V = (GLfloat((rand()%5))+2)/5;
Angle = GLfloat(rand()%360);
particle2[loop].xi = sin(3.141592653*Angle/180) * V;
particle2[loop].yi = cos(3.141592653*Angle/180) * V;
particle2[loop].zi = ((rand()%10)-5)/5+ Throttle*3.2;
}</P><P>
} glPopMatrix();
glDisable(GL_BLEND);
glColor4f(0.3,0.3,0.3,0);
}</P> <P>[em03]</P>
<P>上传有大小限制,附件内容有变化,删除了文档和音乐以及大部分的控置语句和全部的按钮,修正了全部的BUG.<br>保留了粒子效果,是个简化版(好像简的太多了),原来那个有90多M,压缩后6.5M,现在只有400多k了,压缩后200多K。<br>对电脑的要求降低了很多,编译的很快.但程序的功能减少了不少<br>欢迎大家讨论</P>
[align=right][color=#000066][此贴子已经被作者于2007-9-23 17:19:49编辑过][/color][/align]
发个截图给大家看看
[IMG]C:\Documents and Settings\starrysky\My Documents\My Pictures\1.jpg[/IMG] [IMG]C:\Documents and Settings\starrysky\My Documents\My Pictures\3.jpg[/IMG]
[align=right][color=#000066][此贴子已经被作者于2005-10-20 10:14:52编辑过][/color][/align]
晕了。太强了。。。。。 谢谢版主的支持![em01] 看了楼主前面所言。我也深有感触。我们一组10个人。要求大家合作共同开发一个项目。我是组长。我们组的人没一个关心的。我也是一个人把全部代码写完。最郁闷的时候我没学过vb6.0。他们要我用vb6.0来做。后来只好去问老师。在老师的大力帮助下才弄好基本功能。不过我不管了。11月5号要考软设。现在都忙着复习。这个论坛我也比较少上了。不过看了你做的这个。真的感觉到编程人员的痛苦。 呵呵,我也是,OpenGL我是用了6个星期学会的,那段日子天天饿肚子,要么吃泡面,要么就不吃。辛辛苦苦做出来的东西自己是有感情的,虽然心里愤愤不平,但真正完成那天还是挺心慰的,毕竟花了那么大的功夫,这就是做程序的快乐吧。不为别的,为自己的程序而快乐,而骄傲! 厉害啊,俺也要好好向你学习了。[em04] <P>[em04]</P>
<P>厉害呀。我也费了好大劲学习OpenGL,头开始我用的是C编的OpenGL,但不会VC编界面,所以就改用VB,呵呵,VB我比较熟悉一些,接着就开始绘图,总之,是一言难尽,<BR>现在的OpenGL基本上都是用BC,VC,Delphi,用VB的太少,<BR>至今还有一些问题还没搞清楚,呵呵,努力中。。。</P> 想学direct,opengl书太少了。 <P>支持SKY!!!!特棒~~</P>[em22] 我下了,怎么都是一些三角形在乱飞啊 ? <P>在C++中怎么样建一个多文件头的文档啊????<BR></P>[em13][em13][em13]
