Welcome to the Second Life Forums Archive

These forums are CLOSED. Please visit the new forums HERE

Particle emission in direction object is pointing

Loola Lassally
Registered User
Join date: 24 Mar 2007
Posts: 2
12-02-2007 10:05
Hi
I'm fiddling around with a particle script and have one big problem :
No matter how I rotate the object containing the script, the direction of particle emission always stays the same, but I need the direction to change the same way as the object is rotated inworld :-(
Here is the script I'm using :

integer glow = FALSE; // Make the particles glow
integer bounce = FALSE; // Make particles bounce on Z plan of object
integer interpColor = TRUE; // Go from start to end color
integer interpSize = TRUE; // Go from start to end size
integer wind = TRUE; // Particles effected by wind
integer followSource = TRUE; // Particles follow the source
integer followVel = FALSE; // Particles turn to velocity direction

// Choose a pattern from the following:
// PSYS_SRC_PATTERN_EXPLODE
// PSYS_SRC_PATTERN_DROP
// PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY
// PSYS_SRC_PATTERN_ANGLE_CONE
// PSYS_SRC_PATTERN_ANGLE
integer pattern = PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY;

key target = "";

// Particle paramaters
float age = 1; // Life of each particle
float maxSpeed = 2; // Max speed each particle is spit out at
float minSpeed = 1; // Min speed each particle is spit out at
string texture; // Texture used for particles, default used if blank
float startAlpha = 0.5; // Start alpha (transparency) value
float endAlpha = 0.5; // End alpha (transparency) value
vector startColor = <7,25,34.45>; // Start color of particles <R,G,B>
vector endColor = <1,252,34.4>; // End color of particles <R,G,B> (if interpColor == TRUE)
vector startSize = <0.01,0.01,0.01>; // Start size of particles
vector endSize = <0.5,0.5,0.5>; // End size of particles (if interpSize == TRUE)
vector push = <0,0,1>; // Force pushed on particles


// System paramaters
float rate = .01; // How fast (rate) to emit particles
float radius = .9; // Radius to emit particles for BURST pattern
integer count = 999; // How many particles to emit per BURST
float outerAngle = 1.54; // Outer angle for all ANGLE patterns
float innerAngle = 1.55; // Inner angle for all ANGLE patterns
vector omega = <1,2,3>; // Rotation of ANGLE patterns around the source
float life = 1; // Life in seconds for the system to make particles
float delay =3;

// Script variables
integer flags;

updateParticles()
{
//rotation N_rot = llGetRot();
//vector push = llRot2Euler(N_rot);
if (target == "owner";) target = llGetOwner();
if (target == "self";) target = llGetKey();
if (glow) flags = flags | PSYS_PART_EMISSIVE_MASK;
if (bounce) flags = flags | PSYS_PART_BOUNCE_MASK;
if (interpColor) flags = flags | PSYS_PART_INTERP_COLOR_MASK;
if (interpSize) flags = flags | PSYS_PART_INTERP_SCALE_MASK;
if (wind) flags = flags | PSYS_PART_WIND_MASK;
if (followSource) flags = flags | PSYS_PART_FOLLOW_SRC_MASK;
if (followVel) flags = flags | PSYS_PART_FOLLOW_VELOCITY_MASK;
if (target != "";) flags = flags | PSYS_PART_TARGET_POS_MASK;

llParticleSystem([ PSYS_PART_MAX_AGE,age,
PSYS_PART_FLAGS,flags,
PSYS_PART_START_COLOR, startColor,
PSYS_PART_END_COLOR, endColor,
PSYS_PART_START_SCALE,startSize,
PSYS_PART_END_SCALE,endSize,
PSYS_SRC_PATTERN, pattern,
PSYS_SRC_BURST_RATE,rate,
PSYS_SRC_ACCEL, push,
PSYS_SRC_BURST_PART_COUNT,count,
PSYS_SRC_BURST_RADIUS,radius,
PSYS_SRC_BURST_SPEED_MIN,minSpeed,
PSYS_SRC_BURST_SPEED_MAX,maxSpeed,
PSYS_SRC_TARGET_KEY,target,
PSYS_SRC_INNERANGLE,innerAngle,
PSYS_SRC_OUTERANGLE,outerAngle,
PSYS_SRC_OMEGA, omega,
PSYS_SRC_MAX_AGE, life,
PSYS_SRC_TEXTURE, texture,
PSYS_PART_START_ALPHA, startAlpha,
PSYS_PART_END_ALPHA, endAlpha
]);
llSleep(delay);
}
default
{
state_entry()
{
integer fog = TRUE;
while (fog = TRUE)
{
updateParticles();
}
}
}



Anyone got an idea what I'm doing wrong ?

Thanks in advance
Talarus Luan
Ancient Archaean Dragon
Join date: 18 Mar 2006
Posts: 4,831
12-02-2007 11:15
Lots of issues that I see.

First, you are using the "follow source" flag, which means that burst radius is ignored, so particles will always be emitted at the emitter prim center.

Next, you are using a "push" or acceleration of <0,0,1>, which will always force the particles to move straight up in relation to the world, regardless of the emitter prim's orientation. You are using a burst speed min/max of 1 and 2, respectively, so you still should be seeing the particles coming out of the emitter initially moving in the direction it is pointing, but eventually, even if it is pointing straight down, the push will force them to go back up relatively quickly.

Next, you are using the "wind" flag, which will also affect the path of the particles after emission. However, depending on the effect you are trying to achieve, this may not be a problem in itself.

Lastly, you specify an "omega" or "spin" value of <1,2,3>. That basically causes the emitter to spin in a particular path relative to the orientation of the emitter in global terms. It will look like there is no control of it, because it is spinning relatively independently of the way the prim is facing. If you don't want the spin, just set the omega parameter to <0,0,0> or ZERO_VECTOR.

While not directly related to the problem at hand, your particle system is VERY spammy. You specify 999 particles emitted per burst at a rate of 0.01 or 100 times a second, with a life of 1 second each. Doing the math, it means you are asking it to emit 99900 particles on the screen at once. The default max particle setting in the client is 4096 particles, and that is for ALL visible particle systems any one person can see in the area. You might want to reign in the rate and the count a bit, since there's no way anyone could see all the particles you are asking it to display anyway. Try like 100 particles at 0.1 or 10 at 0.01. Play and adjust to get it close to around 1000 particles max. If you really have to spam, try to keep it on your own land, away from anyone else's particle systems, as you will most likely starve them out.
Jesse Barnett
500,000 scoville units
Join date: 21 May 2006
Posts: 4,160
12-02-2007 11:26
Also you will find it a huge help to do a search for the "Particle Laboratory" in world. Different stations set up with what each setting does and sooooo much more. Should be able to find exactly what you need.
_____________________
I (who is a she not a he) reserve the right to exercise selective comprehension of the OP's question at anytime.
From: someone
I am still around, just no longer here. See you across the aisle. Hope LL burns in hell for archiving this forum
Debbie Trilling
Our Lady of Peenemünde
Join date: 17 Oct 2006
Posts: 434
12-02-2007 12:33
Talarus points out lots of valid points.

Also worth bearing in mind is that you have set the pattern as PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY and created very little difference in the innerAngle & outerAngle values. There is no official documentation for this pattern type & I suggest that you instead use PSYS_SRC_PATTERN_ANGLE, set outerAngle to perhaps '0.00' and outerAngle in the region of '0.52', or less (depending on the effect you are trying to create).

Ofc, followSource should remain TRUE. The fact that, as Talarus points out, the burst radius is ignored need not be an issue, and indeed may be a benefit (depending, again, on the effect you wish to create)

I think maybe that the template you are using is suspect and you may need get a fresh one, as there are other points of note that, although not directly related to the problem you are enquirying about, will affect your emission to some greater or lesser degree:

~ the vector values for startColor and endColor are not in a correct RGB format for SL colours ~ see http://wiki.secondlife.com/wiki/Category:LSL_Color

~ the particle system call is set up in an infinate loop, but this is unnecessary as the particles will persist anyway

~ the particle sizes are bearly within the minimum limits and will be tiny

~ the combination of values set will make for a very poor particle effect indeed; not really having enough speed and momentum to push the particles away from the object containing the script.

~ the sleep performs no useful function in this script and the effect I assume it is attempting to create should be handled by setting PSYS_SRC_MAX_AGE correctly, possibly in conjunction with a timer to avoid the infinate loop

Here is a better template starting point for you to work from on this project incorporating the appropriate observations on this thread. You'll need to fine tune it to suit your needs, but it answers the original query and I hope it helps :)

CODE


integer glow = TRUE; // Make the particles glow
integer bounce = FALSE; // Make particles bounce on Z plan of object
integer interpColor = TRUE; // Go from start to end color
integer interpSize = TRUE; // Go from start to end size
integer wind = FALSE; // Particles effected by wind
integer followSource = TRUE; // Particles follow the source
integer followVel = FALSE; // Particles turn to velocity direction

// Choose a pattern from the following:
// PSYS_SRC_PATTERN_EXPLODE
// PSYS_SRC_PATTERN_DROP
// PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY
// PSYS_SRC_PATTERN_ANGLE_CONE
// PSYS_SRC_PATTERN_ANGLE
integer pattern = PSYS_SRC_PATTERN_ANGLE;

key target = "";

// Particle paramaters
float age = 1.00; // Life of each particle
float maxSpeed = 1.00; // Max speed each particle is spit out at
float minSpeed = 5.00; // Min speed each particle is spit out at
string texture = ""; // Texture used for particles, default used if blank
float startAlpha = 0.9; // Start alpha (transparency) value
float endAlpha = 0.1; // End alpha (transparency) value
vector startColor = <1.0,0.0,0.0>; // Start color of particles <R,G,B>
vector endColor = <0.0,1.0,0.0>; // End color of particles <R,G,B> (if interpColor == TRUE)
vector startSize = <0.1,0.1,0.1>; // Start size of particles
vector endSize = <0.5,0.5,0.5>; // End size of particles (if interpSize == TRUE)
vector push = <0.0,0.0,0.0>; // Force pushed on particles


// System paramaters
float rate = 0.1; // How fast (rate) to emit particles
float radius = 0.1; // Radius to emit particles for BURST pattern
integer count = 100; // How many particles to emit per BURST
float outerAngle = 0.0; // Outer angle for all ANGLE patterns
float innerAngle = 0.52; // Inner angle for all ANGLE patterns
vector omega = <0.0,0.0,0.0>; // Rotation of ANGLE patterns around the source
float life = 5.00; // Life in seconds for the system to make particles

// Script variables
integer flags;

updateParticles()
{
if (target == "owner") target = llGetOwner();
if (target == "self") target = llGetKey();
if (glow) flags = flags | PSYS_PART_EMISSIVE_MASK;
if (bounce) flags = flags | PSYS_PART_BOUNCE_MASK;
if (interpColor) flags = flags | PSYS_PART_INTERP_COLOR_MASK;
if (interpSize) flags = flags | PSYS_PART_INTERP_SCALE_MASK;
if (wind) flags = flags | PSYS_PART_WIND_MASK;
if (followSource) flags = flags | PSYS_PART_FOLLOW_SRC_MASK;
if (followVel) flags = flags | PSYS_PART_FOLLOW_VELOCITY_MASK;
if (target != "") flags = flags | PSYS_PART_TARGET_POS_MASK;

llParticleSystem([ PSYS_PART_MAX_AGE,age,
PSYS_PART_FLAGS,flags,
PSYS_PART_START_COLOR, startColor,
PSYS_PART_END_COLOR, endColor,
PSYS_PART_START_SCALE,startSize,
PSYS_PART_END_SCALE,endSize,
PSYS_SRC_PATTERN, pattern,
PSYS_SRC_BURST_RATE,rate,
PSYS_SRC_ACCEL, push,
PSYS_SRC_BURST_PART_COUNT,count,
PSYS_SRC_BURST_RADIUS,radius,
PSYS_SRC_BURST_SPEED_MIN,minSpeed,
PSYS_SRC_BURST_SPEED_MAX,maxSpeed,
PSYS_SRC_TARGET_KEY,target,
PSYS_SRC_INNERANGLE,innerAngle,
PSYS_SRC_OUTERANGLE,outerAngle,
PSYS_SRC_OMEGA, omega,
PSYS_SRC_MAX_AGE, life,
PSYS_SRC_TEXTURE, texture,
PSYS_PART_START_ALPHA, startAlpha,
PSYS_PART_END_ALPHA, endAlpha
]);

}
default
{
state_entry()
{
llSetTimerEvent(8.0);
}

timer()
{
updateParticles();
}

}

Loola Lassally
Registered User
Join date: 24 Mar 2007
Posts: 2
12-02-2007 12:58
WOW
thanks for the fast help !!
I'll work through it