View more

View more

View more

### Image of the Day Submit

IOTD | Top Screenshots

### The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

# particle system - fire

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

2 replies to this topic

### #1robococ  Members

Posted 13 April 2011 - 03:05 AM

Based on nehe tutorial: http://nehe.gamedev....n.asp?lesson=19
I would like to make fire - observer CAN ROTATE fire - If I use nehe coordinates to create square with texture:
glTexCoord2d(1,1); glVertex3f(x+0.5f,y+0.5f,z);
glTexCoord2d(0,1); glVertex3f(x-0.5f,y+0.5f,z);
glTexCoord2d(1,0); glVertex3f(x+0.5f,y-0.5f,z);
glTexCoord2d(0,0); glVertex3f(x-0.5f,y-0.5f,z);


Fire looks horrible when I rotate square about 90 degrees - it looks flat:
http://img573.images...i/33884504.jpg/

When I change coordinates square with texture to mine:
glTexCoord2d(1,1); glVertex3f(x+0.5f,y+0.5f,z);
glTexCoord2d(0,1); glVertex3f(x-0.5f,y+0.5f,z);
glTexCoord2d(1,0); glVertex3f(x+0.5f,y-0.5f,z);
glTexCoord2d(0,0); glVertex3f(x-0.5f,y-0.5f,z);


http://img69.imagesh...i/62229027.jpg/

Do you have an idea what I can do ?

This is mine code:
#define	MAX_PARTICLES	1000		// Number Of Particles To Create

float	slowdown=2.0f;				// Slow Down Particles
float	xspeed;						// Base X Speed (To Allow Keyboard Direction Of Tail)
float	yspeed;						// Base Y Speed (To Allow Keyboard Direction Of Tail)
float	zoom=-40.0f;				// Used To Zoom Out

typedef struct						// Create A Structure For Particle
{
bool	active;					// Active (Yes/No)
float	life;					// Particle Life
float	r;						// Red Value
float	g;						// Green Value
float	b;						// Blue Value
float	x;						// X Position
float	y;						// Y Position
float	z;						// Z Position
float	xi;						// X Direction
float	yi;						// Y Direction
float	zi;						// Z Direction
float	xg;						// X Gravity
float	yg;						// Y Gravity
float	zg;						// Z Gravity
}
particles;							// Particles Structure

particles particle[MAX_PARTICLES];	// Particle Array (Room For Particle Info)

static GLfloat colors[12][3]=	// Rainbow Of Colors
{
{1.0f,0.2f,0.0f}, {1.0f,0.2f,0.0f}, {1.0f,0.2f,0.0f}, {1.0f,0.2f,0.0f},
{1.0f,0.2f,0.0f}, {1.0f,0.2f,0.0f}, {1.0f,0.2f,0.0f}, {1.0f,0.2f,0.0f},
{1.0f,0.2f,0.0f}, {1.0f,0.2f,0.0f}, {1.0f,0.2f,0.0f}, {1.0f,0.2f,0.0f},
};

//INICIALIZATION:
Init(void)
{
slowdown = 2;	// Slow Down Particles
xspeed = 0; 	// Base X Speed (To Allow Keyboard Direction Of Tail)
yspeed = 200;	// Base Y Speed (To Allow Keyboard Direction Of Tail)
zoom = -40; 	// Used To Zoom Out

for (int loop=0; loop<MAX_PARTICLES; loop++)					// Initials All The Textures
{
particle[loop].active = true;								// Make All The Particles Active
particle[loop].life = 1.0f;									// Particles Life
particle[loop].x = 0.0f;					        		// Center On X Axis
particle[loop].y = 0.0f;					        		// Center On Y Axis
particle[loop].z = 0.0f;					        		// Center On Z Axis
particle[loop].r = colors[loop*(12/MAX_PARTICLES)][0];		// Select Rainbow Color
particle[loop].g = colors[loop*(12/MAX_PARTICLES)][1];		// Select Rainbow Color
particle[loop].b = colors[loop*(12/MAX_PARTICLES)][2];		// Select Rainbow Color
particle[loop].xi = xspeed+float((rand()%60)-32.0f);		// X Axis Speed And Direction
particle[loop].yi = yspeed+float((rand()%60)-30.0f);		// Y Axis Speed And Direction
particle[loop].zi = float((rand()%60)-30.0f);        		// Z Axis Speed And Direction
particle[loop].xg = 0.0f;									// Set Horizontal Pull To Zero
particle[loop].yg = -0.8f;									// Set Vertical Pull Downward
particle[loop].zg = 0.0f;									// Set Pull On Z Axis To Zero
}
}

//FIRE:
void Scene::DrawFire()
{
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture[1]);

for (int loop=0; loop<MAX_PARTICLES; loop++)					// Loop Through All The Particles
{
if (particle[loop].active)						    		// If The Particle Is Active
{
float x = particle[loop].x;		// Grab Our Particle X Position
float y = particle[loop].y;						// Grab Our Particle Y Position
float z = particle[loop].z + zoom;		// Particle Z Pos + Zoom

// Draw The Particle Using Our RGB Values, Fade The Particle Based On It's Life
glColor4f(particle[loop].r, particle[loop].g, particle[loop].b, particle[loop].life);

glPushMatrix();
glBegin(GL_TRIANGLE_STRIP);
//MINE COORDINATES:
glTexCoord2d(1,1); glVertex3f(x+5, y, z+5);
glTexCoord2d(0,1); glVertex3f(x-5, y, z+5);
glTexCoord2d(0,0); glVertex3f(x+5, y, z-5);
glTexCoord2d(1,0); glVertex3f(x-5, y, z-5);
/*
//nehe COORDINATES:
glTexCoord2d(1,1); glVertex3f(x+0.5f,y+0.5f,z);
glTexCoord2d(0,1); glVertex3f(x-0.5f,y+0.5f,z);
glTexCoord2d(1,0); glVertex3f(x+0.5f,y-0.5f,z);
glTexCoord2d(0,0); glVertex3f(x-0.5f,y-0.5f,z);
*/
glEnd();
glPopMatrix();

particle[loop].x += particle[loop].xi/(slowdown*1000); // Move On The X Axis By X Speed
particle[loop].y += particle[loop].yi/(slowdown*1000); // Move On The Y Axis By Y Speed
particle[loop].z += particle[loop].zi/(slowdown*1000); // Move On The Z Axis By Z Speed

particle[loop].xi += particle[loop].xg;		             	// Take Pull On X Axis Into Account
particle[loop].yi += particle[loop].yg;     // Take Pull On Y Axis Into Account
particle[loop].zi += particle[loop].zg;		             	// Take Pull On Z Axis Into Account

if (particle[loop].life<0.0f)					// If Particle Is Burned Out
{
int column = rand()%12;

particle[loop].life = 1.0f;				        		// Give It New Life
particle[loop].x = 0.0f;					    		// Center On X Axis
particle[loop].y = 0.0f;					    		// Center On Y Axis
particle[loop].z = 0.0f;					    		// Center On Z Axis
particle[loop].xi = xspeed+float((rand()%60)-32.0f);	// X Axis Speed And Direction
particle[loop].yi = yspeed+float((rand()%60)-30.0f);	// Y Axis Speed And Direction
particle[loop].zi = float((rand()%60)-30.0f);    		// Z Axis Speed And Direction
particle[loop].r = colors[column][0];		    		// Select Red From Color Table
particle[loop].g = colors[column][1];		    		// Select Green From Color Table
particle[loop].b = colors[column][2];		    		// Select Blue From Color Table
}
}
}

glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
}


This is texture: http://img13.imagesh...i/particle.png/

### #2SuperVGA  Members

Posted 13 April 2011 - 03:10 AM

You need to direct the quads to have their normal pointing towards the eye, so that the surface is always orthogonal to the view vector.
These are billboards; they should act like classic sprites.

You can rotate them in a vertex shader, or rotate a local model matrix of one, repeated quad.
Also, pick a different texture, and apply rotation to it over time, -that should help!

### #3robococ  Members

Posted 13 April 2011 - 04:30 AM

So I should do something like that:

glPushMatrix();

// HERE ROTATION ??????

glBegin(GL_TRIANGLE_STRIP);
glTexCoord2d(1,1); glVertex3f(x+0.5f,y+0.5f,z);
glTexCoord2d(0,1); glVertex3f(x-0.5f,y+0.5f,z);
glTexCoord2d(1,0); glVertex3f(x+0.5f,y-0.5f,z);
glTexCoord2d(0,0); glVertex3f(x-0.5f,y-0.5f,z);
glEnd();
glPopMatrix();


Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.