Point Explosion

 
 
 

By Bret A. Hughes, Autodesk (formerly Alias) Santa Barbara Development Center.

This script, dynFuncExplosion.mel, creates an emitter that emits particles. The emitter, Explosion, has extra attributes to control several properties of a simulated explosion. These attributes include the start frame, duration, intensity, fullness, and power of the explosion.

dynFuncExplosion.mel

// dynFuncExplosion.mel 
// 
// Autodesk Script File 
// MODIFY THIS AT YOUR OWN RISK 
// 
// Creation Date: 21 September 1996; Modified 08 January 2000 
// Author: bah 
// 
// Procedure Name: 
// dynFuncExplosion 
// 
// Description: 
// Creates a point explosion that can be modified. 
// 
// Input Arguments: 
// None. 
// 
// Return Value: 
// None. 
// 
// 
// ========== dynFuncExplosion ========== 
// 
// SYNOPSIS 
// Creates a point explosion that can be modified. 
// 
// 
global proc dynFuncExplosion() 
{ 
 // First delete anything that might be left over 
 // from a previous test. 
 // 
 file -f -new; 
 currentTime -e 1; 
 // Display information to the user about what to expect from this 
 // subtest and give some time for the user to read this information. 
 // 
 print( "\nBOOM!\n" ); 
 system( "sleep 1" ); 
 // Create emitter to be the source of the particles eminating from 
 // the explosion. Add an internal variable to the emitter to 
 // control amplitude attributes of the emitter. Render the particles 
 // as multi streaks. 
 // 
 emitter -type omni -r 100 -mnd 0 -mxd 0 -spd 1 -pos 0 0 0 -n Explosion; 
 addAttr -sn "ii" -ln "InternalIntensity" -dv 5 -min 0 
 -max 100 Explosion; 
 particle -name ExplosionParticle; 
 connectDynamic -em Explosion ExplosionParticle; 
 setAttr ExplosionParticleShape.particleRenderType 1; // MultiStreak 
 // Link some renderable attributes to the particles. 
 // 
 addAttr -ln colorAccum -dv true ExplosionParticleShape; 
 addAttr -ln lineWidth -dv 1.0 ExplosionParticleShape; 
 addAttr -ln multiCount -dv 10.0 ExplosionParticleShape; 
 addAttr -ln multiRadius -dv 0 ExplosionParticleShape; 
 addAttr -ln normalDir -dv 2.0 ExplosionParticleShape; 
 addAttr -ln tailFade -dv 0 ExplosionParticleShape; 
 addAttr -ln tailSize -dv 3 ExplosionParticleShape; 
 addAttr -ln useLighting -dv false ExplosionParticleShape; 
 // Create some user-modifiable attributes to modify the 
 // explosion. 
 // 
 select -replace "Explosion"; 
 addAttr -sn "st" -ln "Start" -dv 10 -min 0 -max 100 Explosion; 
 addAttr -sn "du" -ln "Duration" -dv 20 -min 0 -max 200 Explosion; 
 addAttr -sn "in" -ln "Intensity" -dv 10 -min 0 -max 100 Explosion; 
 addAttr -sn "fu" -ln "Fullness" -dv 10 -min 1 -max 100 Explosion; 
 addAttr -sn "po" -ln "Power" -dv 10 -min 0 -max 100 Explosion; 
 // Create the time the explosion has been alive for 
 // and the fraction of the full explosion for that time. 
 // Make the explosion intensity a curve instead of 
 // linear interpolation for the explosion fraction. 
 // BEWARE of MAGIC NUMBERS!!!! 
 // 
 expression -ae true -s 
 ("Explosion.rate = Explosion.Fullness * 40 *"+ 
 "Explosion.InternalIntensity;"+ 
 "ExplosionParticleShape.multiRadius = "+
 "Explosion.Fullness * Explosion.Intensity * 0.005;"+
 "Explosion.speed = Explosion.InternalIntensity"+
 "* Explosion.Power / 10.0; "); 
 expression -ae true -s 
 ("if (frame >= Explosion.Start"+
 "&& frame <= Explosion.Start + Explosion.Duration)"+ 
 "{"+
 "float $ExplosionLife = frame - Explosion.Start;"+
 "float $ExplosionFraction = 1 - (abs($ExplosionLife - "+ 
 "Explosion.Duration/2) / (Explosion.Duration/2));"+ 
 "Explosion.InternalIntensity = Explosion.Intensity *"+
 "pow($ExplosionFraction,"+
 "121 / pow(Explosion.Power + 1, 2));"+
 "}"+ 
 "else"+ 
 "{"+ 
 "Explosion.InternalIntensity = 0;"+
 "}; ") -o Explosion; 
 // Set up the playback options. 
 // 
 float $frames = 70; 
 playbackOptions -min 1 -max $frames -loop once; 
 // Time how long it takes to play the scene and then determine the 
 // playback frame rate. Make sure when getting the frame rate 
 // that no values are divided by zero. 
 // 
 float $startTime = `timerX`; 
 play -wait; 
 float $elapsed = `timerX -st $startTime`; 
 float $fps = ($elapsed == 0.0 ? 0.0 : $frames/$elapsed); 
 // Print the frames per second (fps) of the subtest in the form X.X. 
 // 
 print("dynFuncExplosion: Done. ("); 
 print((int)($fps * 10)/10.0 + " fps)\n"); 
} // dynFuncExplosion // 
Note

Each line of a multi-line argument following ‘-s’ for the expression command is required to be encompassed by quotation marks followed by a ‘+’. The only exception to this rule is the last line which must not be followed by a ‘+’. This is because ‘-s’ denotes a string, and a multi-line string must be joined via ‘+’ for Maya to interpret the command correctly.