CodeForge QQ客服 CodeForge 400电话 客服电话 4006316121
首页 » 源代码 » 喷泉元代码 » penquan.cpp

penquan.cpp ( 文件浏览 )

文件源自:喷泉元代码
  • 吾问无为谓 发布于2014-04-19
  • 浏览次数:6
  • 下载次数:0
  • 下载需 1 积分
  • 侵权举报
			#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <GL/glu.h>
#include <qgl.h>
#include <GL/glut.h>
#include "loadtga.cpp"
#include "3DS.H"

#pragma comment(lib,"winmm.lib")
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )  // 设置入口地址,隐藏控制台窗口
#define PI 3.14159
#define Num 10
#define MAX 1
#define COUNT 3

struct particle
{

  float lifetime;       // 粒子的寿命
  float v;       // 粒子的运动速度
  float d;       // 粒子的运动方向
  float x, y, z; // 粒子的位置坐标
  float xd, zd;  // X 和 Z 方向上的增量
  char type;     // 粒子的状态(移动或淡化)
  float a;       // 粒子淡化的a值
  struct particle *next, *prev;

};
struct point
{
      
  float x, y, z;//三维空间坐标点

};

/**********************************************************************************************************/
GLUquadricObj *obj;     //二次曲面对象
int WindW, WindH;

GLuint COUNTS=8;
GLuint N=4;
GLuint MKEY;
GLuint lighting=0;
float axis=65;
int H=92;

GLuint texture[COUNT];     // 纹理ID
const char *hn[COUNT]={
"particle.tga","background.tga","ground1.tga"
};
float a=0;
struct particle *tn[Num];   
struct particle *sn[MAX];
struct particle *rn[Num];
char temp[128]="FPS: 0.000000";
// 以下是用于计算帧率的变量
int frame_counter=0;
time_t curtime;
clock_t last_time;
float cur_time;
float total_frames;
struct point up, cam;        //  摄像机的位置和向上的方向矢量
        //定义光源
GLfloat global_ambient[]={
0.6f,0.6f,0.6f,0.0f
};
GLfloat light_position0[]={
0.0f,0.0f,100.0f,1.0f
};  // 设置光源的位置
GLfloat light_ambient0[]={
1.0f,0.0f,0.0f,1.0f
};     // 定义环境光的颜色
GLfloat light_diffuse0[]={
1.0f,0.5f,0.3f,1.0f
};     // 定义漫反射光的颜色
GLfloat light_specular0[]={
0.5f,0.5f,0.5f,1.0f
};    // 定义镜面反射光的颜色
GLfloat light_direction0[]={
0.0f,0.0f,-1.0f
};       // 设置光源的方向

GLfloat light_position1[]={
0.0f,0.0f,100.0f,1.0f
};
GLfloat light_ambient1[]={
0.3f,1.0f,0.2f,1.0f
};
GLfloat light_diffuse1[]={
0.5f,1.0f,0.3f,1.0f
};
GLfloat light_specular1[]={
0.5f,0.5f,0.5f,1.0f
};
GLfloat light_direction1[]={
0.0f,0.0f,-1.0f
};

GLfloat light_position2[]={
0.0f,0.0f,100.0f,1.0f
};
GLfloat light_ambient2[]={
0.0f,0.0f,1.0f,1.0f
};
GLfloat light_diffuse2[]={
0.2f,0.4f,1.0f,1.0f
};
GLfloat light_specular2[]={
0.5f,0.5f,0.5f,1.0f
};
GLfloat light_direction2[]={
0.0f,0.0f,-1.0f
};

void Initial(void)
{

                glClearColor(0.5f, 0.5f, 1.0f, 1.0f);
                glColor3f(0.2f, 0.2f, 0.2f);
                obj = gluNewQuadric( );
                gluQuadricDrawStyle(obj, GLU_LINE);  //以线框方式绘制二次曲面对象

}
/**********************************************************************************************************/
//  初始化函数
void Init()
{

  int i,j;
  for(i=0;i<Num;++i)
  {
tn[i]=NULL;rn[i]=NULL;
}
  for(j=0;j<MAX;++j)
	  sn[j]=NULL;
  up.x = -5;
  up.y = 5;
  up.z = -5;
  cam.x =220;
  cam.y =220;
  cam.z =220;
	// 设置光源属性
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT,global_ambient);      // 创建环境光
	glLightfv(GL_LIGHT0,GL_POSITION,light_position0);    // 创建光源位置
	glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient0);      // 创建环境光
	glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse0);      // 创建漫反射光
	glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular0);    // 创建镜面反射光

	glLightfv(GL_LIGHT1,GL_POSITION,light_position1);
	glLightfv(GL_LIGHT1,GL_AMBIENT,light_ambient1);
	glLightfv(GL_LIGHT1,GL_DIFFUSE,light_diffuse1);
	glLightfv(GL_LIGHT1,GL_SPECULAR,light_specular1);

	glLightfv(GL_LIGHT2,GL_POSITION,light_position2);
	glLightfv(GL_LIGHT2,GL_AMBIENT,light_ambient2);
	glLightfv(GL_LIGHT2,GL_DIFFUSE,light_diffuse2);
	glLightfv(GL_LIGHT2,GL_SPECULAR,light_specular2);

  glClearColor(0.0, 0.0, 0.5, 0.0);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  glEnable(GL_BLEND);
  glEnable(GL_TEXTURE_2D);
  

}
/**********************************************************************************************************/
// 在屏幕上绘制字符串
void draw_string(void *font, const char* string) 
{

  while(*string)
    glutStrokeCharacter(font, *string++);

}

static float gettime(void)
{

  clock_t time_new, time_raz;
  
  time_new=clock();
  time_raz=time_new-last_time;
  last_time=time_new;
   return(time_raz/(float)CLOCKS_PER_SEC);

}
/**********************************************************************************************************/
// 装入纹理
void LoadTexture()
{

  GLint iWidth, iHeight,iComponents;
  GLenum eFormat;
  GLbyte *tga;    // 粒子的纹理
  int i;  
  glGenTextures(COUNT,texture);
   for(i=0;i<COUNT;i++)
   {

       glBindTexture(GL_TEXTURE_2D, texture[i]);
       tga=gltLoadTGA(hn[i],&iWidth,&iHeight,&iComponents,&eFormat);
     if (!tga)
	 {

        printf("Sorry, can't read texture file...");
        exit(0);
	 
}
       gluBuild2DMipmaps(GL_TEXTURE_2D, iComponents, iWidth, iHeight, eFormat, GL_UNSIGNED_BYTE, tga);
       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
     if (i == 0) 
		 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
     if (i== 1)
	  {

         // 设置地面的重复纹理参数
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
	  
}
	
  
}
  

} 

void shutdownRC(void)
{

	glDeleteTextures(COUNT,texture);

}

/**********************************************************************************************************/

void Reshape(int width, int height)
{

  glViewport(0, 0, width, height);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glFrustum(-0.5, 0.5, -0.5, 0.5, 1, 1000);
  glMatrixMode(GL_MODELVIEW);
  
  WindW = width;
  WindH = height;

}
/**********************************************************************************************************/
//求矢量差积 C = A x B 
void vect_mult(struct point *A, struct point *B, struct point *C)
{

  /* Vector multiply */
  C->x = A->y*B->z - A->z*B->y;
  C->y = A->z*B->x - A->x*B->z;
  C->z = A->x*B->y - A->y*B->x;

}

//  矢量单位化
void normalize(struct point *V)
{

  float d;

  // 矢量长度
  d = sqrt(V->x*V->x + V->y*V->y + V->z*V->z);

  // 单位化
  V->x /= d; 
  V->y /= d; 
  V->z /= d; 

}
/**********************************************************************************************************/
//第一个喷泉粒子系统//
//添加新的粒子
void AddParticles1()
{

  struct particle *temp;
  int  j;
  for (j=0; j<Num; j++)
    
    {

      temp = (struct particle *)malloc(sizeof(struct particle));
      if (tn[j]) tn[j]->prev = temp;
      temp->next = tn[j];
      tn[j] = temp;
  
      temp->lifetime= -9.8;
      temp->v = (float)(rand() % 400000)/200000+1; // 速度
      temp->d = (float)(rand() % 400)/100-2;     // 方向角度
      // 开始运动的坐标
      temp->x = 0.0;
      temp->y = 0.0;
      temp->z = 0.0;
      temp->xd = cos((temp->d*3.14159)/180)*temp->v/8;
      temp->zd = sin((temp->d*3.14159)/180)*temp->v;
      temp->type = 0; // 粒子的状态是运动的
      temp->a = 1; // 粒子的a初始值是1
    
}

}

//  移动粒子
void MoveParticles1()
{

  struct particle *temp;
  int j;

  for (j=0; j<Num; j++)
  {

    temp = tn[j]; // 选择喷泉
    while (temp)
    {

      if (temp->type == 0) // 如果粒子是运动的
      {

        temp->x += temp->xd;
        temp->z += temp->zd;
        temp->y = -(9.8*(temp->lifetime*temp->lifetime/4))/2+120.5; // 计算高度
        temp->lifetime+= 0.08; // 寿命递增
        if (temp->y <0)temp->type = 1; // 如果粒子落到地上,则粒子淡化
        
      
}
      else // 粒子落到地上
      {

        temp->y = -(9.8*(temp->lifetime*temp->lifetime/4))/2+120.5;
        temp->a -= 0.5; // 粒子淡化
      
}
      temp = temp->next; //进行下一个粒子的计算
    
}
  
}

}

//  删除粒子
void DeleteParticles1()
{

  struct particle *temp, *temp1;
  int j;

  for (j=0; j<Num; j++)
  {

    temp = tn[j];
    while (temp)
    {

      if ((temp->type == 1) && (temp->a <= 0)) // 粒子死亡
      {

        // 删除粒子
        temp1 = temp->prev;
        temp->prev->next = temp->next;
        if (temp->next) temp->next->prev = temp1;
        free(temp);
        temp = temp1;
      
}
      temp = temp->next;
    
}
  
}

}
//绘制喷泉
void Fountain1()
{

  int i;
  struct particle *temp;
  struct point vectr, vectl;
  float angle, rx, rz;
 
  glBindTexture(GL_TEXTURE_2D, texture[0]);

  AddParticles1();
  MoveParticles1();
  DeleteParticles1();
  
  glPushMatrix();
  for (i=0; i<Num; i++)
  {

    glBegin(GL_QUADS);
    temp = tn[i];
    while (temp)
    {

      // 旋转喷泉
      angle = ((i*360/Num+a)*PI)/180;
      rx = temp->x*cos(angle)-temp->z*sin(angle);
      rz = temp->x*sin(angle)+temp->z*cos(angle);
      // 计算方向矢量A
      vectr.x = rx ;
      vectr.y = temp->y ;
      vectr.z = rz ;
      vect_mult(&vectr, &up, &vectl);
      normalize(&vectl);
      vectl.x *= 1;
      vectl.y *= 1;
      vectl.z *=1;
      glColor4f(0.5, 0.5, 1, temp->a);
     
      // 绘制粒子及纹理映射
      glTexCoord2f(0, 0); glVertex3f((rx-vectl.x), (temp->y-up.y), (rz-vectl.z));
      glTexCoord2f(1, 0); glVertex3f((rx+vectl.x), (temp->y-up.y), (rz+vectl.z));
      glTexCoord2f(1, 1); glVertex3f((rx+vectl.x), (temp->y+up.y), (rz+vectl.z));
      glTexCoord2f(0, 1); glVertex3f((rx-vectl.x), (temp->y+up.y), (rz-vectl.z));
      temp = temp->next; // 下一个粒子
    
}
    glEnd();
  
}
  glPopMatrix();

}
/**********************************************************************************************************/
//第二个喷泉粒子系统//
/
...
...
(文件超长,未完全显示,请下载后阅读剩余部分)
			
...
展开> <收缩

下载源码到电脑,阅读使用更方便

1 积分

快速下载
还剩0行未阅读,继续阅读
云测速

源码文件列表

温馨提示: 点击源码文件名可预览文件内容哦 ^_^
...
名称 大小 修改日期
11.pro581.00 B17-04-14|10:34
11.pro.user20.44 kB18-04-14|14:23
02app2.jpg74.27 kB20-12-13|22:08
044w1.bmp2.34 MB20-12-13|22:06
044w2.bmp117.24 kB20-12-13|22:08
05le2.jpg208.74 kB20-12-13|22:08
apple.3DS29.46 kB20-12-13|22:08
apple.jpg42.50 kB20-12-13|22:08
background.tga192.04 kB29-03-11|21:29
bl.jpg60.20 kB20-12-13|22:08
bl20120807.jpg509.63 kB20-12-13|22:08
bl20120808.jpg288.16 kB20-12-13|22:08
bolo.3DS122.90 kB20-12-13|22:08
bl.jpg60.20 kB20-12-13|22:08
bl20120807.jpg509.63 kB20-12-13|22:08
bl20120808.jpg288.16 kB20-12-13|22:08
bolo.3DS122.90 kB20-12-13|22:08
b菠萝.max1.16 MB20-12-13|22:09
left_bolo.3DS15.86 kB20-12-13|22:08
MAXFILES.TXT169.00 B20-12-13|22:08
right_bolo.3DS112.62 kB20-12-13|22:08
b菠萝.max1.16 MB20-12-13|22:08
FACE.3DS25.21 kB20-12-13|22:08
FACE.BMP96.73 kB20-12-13|22:08
halflemo.jpg223.82 kB20-12-13|22:08
helfapple.jpg25.74 kB20-12-13|22:08
left_bolo.3DS15.86 kB20-12-13|22:08
left_half_lemon.3DS83.98 kB20-12-13|22:08
left_half_melo.3DS16.50 kB20-12-13|22:08
left_half_melo.max280.00 kB20-12-13|22:08
MAXFILES.TXT169.00 B20-12-13|22:08
melo.3DS25.21 kB20-12-13|22:08
nimeng.3DS169.28 kB20-12-13|22:08
nimeng.JPG534.01 kB20-12-13|22:08
park.3ds970.81 kB13-04-14|11:06
right_bolo.3DS112.62 kB20-12-13|22:08
right_half_lemon.3DS83.98 kB20-12-13|22:08
right_half_melo.3DS16.37 kB20-12-13|22:08
XIGUA.BMP329.57 kB20-12-13|22:08
xigua.max196.00 kB20-12-13|22:08
hamigua.3DS108.64 kB20-12-13|22:08
hamigua.jpg107.20 kB20-12-13|22:08
hmg.jpg49.13 kB20-12-13|22:08
MAXFILES.TXT166.00 B20-12-13|22:08
____2.JPG3.84 MB20-12-13|22:09
哈密瓜.max1.04 MB20-12-13|22:09
3DS.cpp20.58 kB20-12-13|22:08
3DS.H4.00 kB20-12-13|22:08
admovie.jpg0.00 B25-03-11|16:51
background.tga768.39 kB16-04-14|20:54
11.exe903.92 kB18-04-14|14:55
3DS.o104.83 kB15-04-14|17:20
FruitObject.o138.40 kB17-04-14|09:16
ParkModel.o138.33 kB17-04-14|10:59
penquan.o141.24 kB18-04-14|14:55
FruitObject.cpp4.28 kB20-12-13|22:08
FruitObject.h630.00 B20-12-13|22:08
glext.h295.63 kB09-02-04|02:42
gltools.h5.86 kB13-04-14|11:37
glut.h20.94 kB07-11-03|14:57
ground.TGA2.32 MB30-03-11|00:25
ground1.TGA192.04 kB08-04-11|00:44
ground11.TGA192.04 kB30-03-11|00:34
GROUND2.TGA192.02 kB01-03-11|15:56
loadtga.cpp3.83 kB13-04-14|11:45
main.cpp6.43 kB10-04-14|11:33
Makefile5.82 kB17-04-14|10:59
Makefile.Debug5.24 kB17-04-14|10:59
Makefile.Release5.30 kB17-04-14|10:59
openglsb.h716.00 B09-03-11|14:00
ParkModel.cpp4.26 kB17-04-14|10:37
ParkModel.h666.00 B17-04-14|10:37
PARTICLE.TGA3.02 kB01-03-11|15:55
penquan.cpp22.92 kB18-04-14|14:55
main.cpp23.60 kB10-04-14|19:22
text.pro306.00 B10-04-14|19:09
text.pro.user20.64 kB10-04-14|19:38
Makefile5.73 kB10-04-14|19:10
Makefile.Debug4.65 kB10-04-14|19:10
Makefile.Release4.69 kB10-04-14|19:10
wglext.h26.46 kB09-02-04|01:12
雨中漫步.mp31.60 MB16-07-08|15:42
loadtga.o3.49 kB11-04-14|14:21
main.o105.20 kB10-04-14|11:27
penquan.o142.16 kB11-04-14|16:09
Makefile5.68 kB11-04-14|16:52
Makefile.Debug4.88 kB11-04-14|16:52
Makefile.Release4.92 kB11-04-14|16:52
b菠萝0.00 B19-04-14|09:46
哈密瓜0.00 B19-04-14|09:46
debug0.00 B11-04-14|16:12
release0.00 B10-04-14|19:10
3dmodel0.00 B19-04-14|09:46
debug0.00 B19-04-14|09:46
release0.00 B12-04-14|00:44
text0.00 B19-04-14|09:46
text-build-desktop-Qt_4_7_3__4_7_3____0.00 B19-04-14|09:46
debug0.00 B19-04-14|09:46
release0.00 B10-04-14|10:39
110.00 B19-04-14|09:46
11-build-desktop-Qt_4_7_3__4_7_3____0.00 B19-04-14|09:46
penquan0.00 B19-04-14|09:46
云测速

penquan.cpp (12.85 MB)

需要 1 积分
您持有 积分

CodeForge积分(原CF币)全新升级,功能更强大,使用更便捷,不仅可以用来下载海量源代码马上还可兑换精美小礼品了 了解更多

您的积分不足

支付宝优惠套餐快速获取 30 积分

订单支付完成后,积分将自动加入到您的账号。以下是优惠期的人民币价格,优惠期过后将恢复美元价格。

更多付款方式:网银PayPal

上传代码,免费获取

您本次下载所消耗的积分将转交上传作者。

同一源码,30天内重复下载,只扣除一次积分。

登录 CodeForge

还没有CodeForge账号? 立即注册
关注微博
联系客服

Switch to the English version?

Yes
CodeForge 英文版
No
CodeForge 中文版

完善个人资料,获价值¥30元积分奖励!

^_^"呃 ...

Sorry!这位大神很神秘,未开通博客呢,请浏览一下其他的吧
好的