#pragma comment( lib, "opengl32.lib" )
#pragma comment( lib, "glu32.lib" )
#pragma comment( lib, "glut32.lib")
//#pragma comment( lib, "glew32.lib")
#pragma comment( lib, "glaux.lib")
#pragma comment( lib, "vfw32.lib" )
/********************************************************************************************************************************/
#include <windows.h> // Windows的头文件
//#include "glew.h" // 包含最新的gl.h,glu.h库
//#include <glut.h> // 包含OpenGL实用库
#include <stdio.h> // 标准输入/输出库的头文件
#include <math.h> // 数学库函数
#include "GLAUX.H" // GLaux库的头文件
/***********************************新添的代码***********************************************************************************/
#define MAX_PARTICLES 10000 // 定义最大的粒子数
float slowdown=2.0f; // 减速粒子
int xspeed=0; // X方向的速度
int yspeed=0; // Y方向的速度
int zspeed=0;
float locx=0.0;
float locy=0.0;
float zoom=-40.0f; // 沿Z轴缩放
GLuint loop; // 循环变量
GLuint col; // 当前的颜色
typedef struct // 创建粒子数据结构
{
bool active; // 是否激活
float life; // 粒子生命
float fade; // 衰减速度
float r; // 红色值
float g; // 绿色值
float b; // 蓝色值
float x; // X 位置
float y; // Y 位置
float z; // Z 位置
int xi; // X 方向
int yi; // Y 方向
int zi; // Z 方向
float xg; // X 方向重力加速度
float yg; // Y 方向重力加速度
float zg; // Z 方向重力加速度
}
particles; // 粒子数据结构
particles particle[MAX_PARTICLES]; // 保存10000个粒子的数组
/********************************************************************************************************************************/
GLfloat xrot; // X 旋转量
GLfloat yrot; // Y 旋转量
GLfloat zrot; // Z 旋转量
GLuint texture[1]; // 存储一个纹理
HDC hDC=NULL; // 窗口着色描述表句柄
HGLRC hRC=NULL; // OpenGL渲染描述表句柄
HWND hWnd=NULL; // 保存我们的窗口句柄
HINSTANCE hInstance; // 保存程序的实例
bool keys[256]; // 保存键盘按键的数组
bool active=TRUE; // 窗口的活动标志,缺省为TRUE
bool fullscreen=TRUE; // 全屏标志缺省,缺省设定成全屏模式
GLfloat rtri; // 用于三角形的角度
GLfloat rquad; // 用于四边形的角度
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // WndProc的定义
AUX_RGBImageRec *LoadBMP(CHAR *Filename) // 载入位图图象
{
FILE *File=NULL; // 文件句柄
if (!Filename) // 确保文件名已提供
{
return NULL; // 如果没提供,返回 NULL
}
File=fopen(Filename,"r"); // 尝试打开文件
if (File) // 文件存在么?
{
fclose(File); // 关闭句柄
return auxDIBImageLoadA(Filename); // 载入位图并返回指针
}
return NULL; // 如果载入失败,返回 NULL
}
int LoadGLTextures() // 载入位图(调用上面的代码)并转换成纹理
{
int Status=FALSE; // 状态指示器
AUX_RGBImageRec *TextureImage[1]; // 创建纹理的存储空间
memset(TextureImage,0,sizeof(void *)*1); // 将指针设为 NULL
// 载入位图,检查有无错误,如果位图没找到则退出
// if (TextureImage[0]=LoadBMP("Data/NeHe.bmp"))
/***********************************新添的代码***********************************************************************************/
if (TextureImage[0]=LoadBMP("Particle.bmp")) // 载入粒子纹理
/********************************************************************************************************************************/
{
Status=TRUE; // 将 Status 设为 TRUE
glGenTextures(1, &texture[0]); // 创建纹理
// 使用来自位图数据生成 的典型纹理
glBindTexture(GL_TEXTURE_2D, texture[0]);
// 生成纹理
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // 线形滤波
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // 线形滤波
}
if (TextureImage[0]) // 纹理是否存在
{
if (TextureImage[0]->data) // 纹理图像是否存在
{
free(TextureImage[0]->data); // 释放纹理图像占用的内存
}
free(TextureImage[0]); // 释放图像结构
}
return Status; // 返回 Status
}
GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // 重置OpenGL窗口大小
{
if (height==0) // 防止被零除
{
height=1; // 将Height设为1
}
glViewport(0,0,width,height); // 重置当前的视口
glMatrixMode(GL_PROJECTION); // 选择投影矩阵
glLoadIdentity(); // 重置投影矩阵
// 设置视口的大小
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW); // 选择模型观察矩阵
glLoadIdentity(); // 重置模型观察矩阵
}
int InitGL(GLvoid) // 此处开始对OpenGL进行所有设置
{
if (!LoadGLTextures()) // 调用纹理载入子例程
{
return FALSE; // 如果未能载入,返回FALSE
}
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0);
glEnable(GL_TEXTURE_2D); // 启用纹理映射
glShadeModel(GL_SMOOTH); // 启用阴影平滑
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // 黑色背景
glClearDepth(1.0f); // 设置深度缓存
// glEnable(GL_DEPTH_TEST); // 启用深度测试
/***********************************新添的代码***********************************************************************************/
glDisable(GL_DEPTH_TEST); //禁止深度测试
for (loop=0;loop<MAX_PARTICLES;loop++) //初始化所有的粒子
{
particle[loop].active=true; // 使所有的粒子为激活状态
particle[loop].life=1.0f; // 所有的粒子生命值为最大
particle[loop].fade=float(rand()%100)/1000.0f+0.003f; // 随机生成衰减速率
particle[loop].r=1.0f; // 粒子的红色颜色
particle[loop].g=1.0f; // 粒子的绿色颜色
particle[loop].b=1.0f; // 粒子的蓝色颜色
particle[loop].xi=xspeed+(rand()%100+300); // 随机生成X轴方向速度
particle[loop].yi=yspeed+(rand()%100+300); // 随机生成Y轴方向速度
particle[loop].zi=zspeed+(rand()%20-10); // 随机生成Z轴方向速度
particle[loop].xg=0.0f; // 设置X轴方向加速度为0
particle[loop].yg=-2.8f; // 设置Y轴方向加速度为-0.8
particle[loop].zg=0.0f; // 设置Z轴方向加速度为0
}
/********************************************************************************************************************************/
// glDepthFunc(GL_LEQUAL); // 所作深度测试的类型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 告诉系统对透视进行修正
return TRUE; // 初始化 OK
}
int DrawGLScene(GLvoid) // 从这里开始进行所有的绘制
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
glLoadIdentity(); // 重置当前的模型观察矩阵
/***********************************新添的代码***********************************************************************************/
for (loop=0;loop<MAX_PARTICLES;loop++) // 循环所有的粒子
{
if (particle[loop].active) // 如果粒子为激活的
{
float x=particle[loop].x+locx; // 返回X轴的位置
float y=particle[loop].y+locy; // 返回Y轴的位置
float z=particle[loop].z+zoom; // 返回Z轴的位置
// 设置粒子颜色
glColor4f(particle[loop].r,particle[loop].g,particle[loop].b,particle[loop].life);
glBegin(GL_TRIANGLE_STRIP); // 绘制三角形带
glTexCoord2d(1,1); glVertex3f(x+0.1f,y+0.1f,z);
glTexCoord2d(0,1); glVertex3f(x-0.1f,y+0.1f,z);
glTexCoord2d(1,0); glVertex3f(x+0.1f,y-0.1f,z);
glTexCoord2d(0,0); glVertex3f(x-0.1f,y-0.1f,z);
glEnd();
particle[loop].x+=particle[loop].xi/(slowdown*1000); // 更新X坐标的位置
particle[loop].y+=particle[loop].yi/(slowdown*1000); // 更新Y坐标的位置
particle[loop].z+=particle[loop].zi/(slowdown*1000); // 更新Z坐标的位置
particle[loop].xi+=part
没有合适的资源?快使用搜索试试~ 我知道了~
用OpenGL做水粒子的经典程序
共12个文件
bmp:1个
dsw:1个
opt:1个
3星 · 超过75%的资源 需积分: 9 98 下载量 36 浏览量
2009-03-04
14:57:25
上传
评论
收藏 1.03MB RAR 举报
温馨提示
用水粒子做成的一个3D效果,适合初学者作为基本的范例来进行加工或提取素材。
资源推荐
资源详情
资源评论
收起资源包目录
shuizhu1.rar (12个子文件)
shuizhu1
Particles.ncb 57KB
Particles.opt 48KB
Particle.bmp 70B
Debug
vc60.pdb 76KB
Particles.obj 39KB
vc60.idb 145KB
Particles.pch 3.53MB
Particles.plg 835B
Particles.cpp 22KB
Particles.dsp 4KB
GLAUX.H 12KB
Particles.dsw 526B
共 12 条
- 1
资源评论
- 大暖哥2013-07-10不能说是水粒子吧,只能说是白色粒子喷射程序,我想要的是液体型的粒子效果
- plutodyh262015-06-09不是液态的,白色颗粒喷射……
- oKratos12013-11-14不行 不是我想要的水模型 感觉有点坑爹 ==
- myliux2012-12-04标准的opengl粒子系统,不过很可惜不是我想要的效果
Lcatsleep
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功