CPSC 324, Fall 2002
Lab 10: Blender Particle Systems
BY NOW, YOU have some idea of the power of Blender. Today, you will look at one of its most interesting advanced features: particle systems. A particle system is essentially a bunch of free-moving vertices that are emitted by a mesh object. The particles have a finite lifetime. They have an initial velocity and can be affected by forces that simulate things like gravity and friction. If you assign a halo material to the mesh that emits the particles, then each particle will be a halo. By setting and animating various halo properties, you can make the particle system take on the appearance of things as varied as fog and fireworks. It is also possible to place an object on each particle. The objects are all duplicates of one model object, and so are identical. This might be used, for example, to model a school of fish.
Although the lab is mostly devoted to particle systems, there is also a short section on another advanced feature: environment maps. An environment map can make an object look like it is reflecting its environment. At the end of the lab you will find, for your information, a few notes about other features of Blender. These are not a required part of the lab, but you might find them useful if you continue to work with Blender.
Exercises: For this lab, you should create one animation that uses a particle system and one still image that uses an environment map. Save the animation in AVI JPEG format and put a link to the animation on your Web page, along with a description of how it uses particles. Also add the still image to your web page. You can, if you like, use an animated environment map in your animation (although this will probably take a lot of rendering time). In that case, one of the frames from your animation can serve as your still image.
Particles can be emitted from any mesh object, but most often a plane or mesh circle is used. It's easy to get a plane to emit particles in a direction perpendicular to the plane, and it's easy get a mesh circle to emit them radially outward from the center of the circle. In the picture, particles have been emitted moving upwards from the plane. The particles also have a small random amount added to their velocities, which makes them spread out as they move. Note that in the default setting, which is used here, particles are emitted only from the vertices of the mesh. Often, you will want to decrease the size of the emitter so that it looks like all the particles are coming from about the same place.
In order to understand particles, you have to work with them a bit. Start with a plane object, as in Blender's default start-up configuration, go into camera view (Keypad-0), and move the plane down towards the bottom of the view. To add a particle system to the plane, make sure the plane is selected and go to the Animation buttons (F7). Click on the button named "New Effect" in the center of the Edit button window. Then switch the pop-up menu, which initially says "Build", to "Particles". A large number of buttons appear for controlling the particle system, as shown below. The first three buttons, "Total", "Sta", and "End" say that there will be 1000 particles in the particle system. The plane will start emitting them in frame number 1 and will stop in frame number 100. (Thus, 10 particles will be emitted in each frame.) The next button, "Life", gives the lifetime of the particles. That is, each particle lives for 50 frames after it is emitted and then disappears. The "Keys" button controls the number of key frames that Blender creates for controlling the particle animation -- more keys might give a smoother animation. Leave these buttons at their default settings for now. The second row of buttons is used only for multi-generation particle systems, which are discussed later on this page.
The Remaining four rows of buttons are used to control the motion of the particles. If you leave them at their default settings, the particles will never move away from the position where they are born. (Even this might be OK if the object itself is moving.) The "RandLife" button can add some randomness to the lifetime of the particles. Turing "Face" on causes the particles to be emitted from polygon faces rather than just from vertices. "Bspline" should make the motion smoother (and I don't know why you would ever want to leave it off). The "Vect" button assigns a vector to each particle which points in the direction the particle is moving. This vector will affect objects attached to the particle so that they change orientation as they move. You might need this, for example, if you were animating a school of fish, to orient them along the line of motion.
The remaining buttons affect the speed of the particles. "Norm", "Ob", "Rand" affect their initial velocities. "Norm" makes a particle move away from its emitter, in the direction of the normal vector. If the emitter is moving, "Ob" tells how much of the object's velocity is transferred to the particle, making it move in the same direction as the object. "Rand" adds some extra speed in a random direction. Try these out on the plane. If "Norm" is positive and "Rand" is zero, the particles will move straight up from the plane. (To see the animation easily, go to frame 1 (Shift-Left-Arrow), then hold down the right arrow key.) Now if you change "Rand" to a positive value, you will get a picture more like the one shown above. To see the effect of "Ob", you will have to animate the plane: Make it move from left to right between frames 0 and 100.
The "Damp" button adds friction. That is , it gives the rate at which moving particles slow down. The "X", "Y", and "Z" Force buttons apply a force to each particle that that will gradually accelerate it in a given direction. For example, a negative "Z" force will act like gravity, pulling the particles downwards. An "X" force will act something like wind, blowing the particles horizontally. (If "Tex" is non-zero, the velocity can be affected by a texture, which can add effects such as turbulence, but I haven't tried this.)
You should try some of the velocity controls. For example, You can make a "fountain" if you use a negative "Z" force along with "Norm", "Rand", and perhaps "Damp". Try a moving emitter with high values for "Ob" and "Damp" and perhaps a negative "Z" force -- smoke coming out of a smokestack might behave like this.
Halos and Objects for Particle Systems
The little white particles that you see in the 3D window are not visible in a rendered image. However, if you add a Halo material to the emitter, then each particle will appear as a halo in the rendered image. You can get various effects by using different settings for the halo properties. The "smoke" shown in this image is a particle system with relatively few particles and rather large halos. A Cloud texture is used as a HaloTex on the halos, to give each halo some variation in color. The texture just uses two slightly different shades of gray. The animated version of this is pretty effective. See smoke.avi (950K). The Blender file for this is /home/cs441/lab10/smoke.blend.
This example uses material animation to improve the smoke effect. As each particle ages, it gets smaller. This is accomplished by inserting animation keys for the "HaloSize" material property. (When you hit the "I" key in the Material button window, this property is listed as "HaSize" in the menu.) You could also animate the color or transparency of the halos. Note that the halo on each particle is animated separately, over the lifetime of the particle. For halo animations, the frame number has a peculiar meaning: Frame 1 corresponds to the beginning of the particle's life, and frame number 100 corresponds to the end. This is true no matter what the actual lifetime of the particle.
As an alternative to halos, it is possible to place a duplicate of an object at each particle. In the image, particles are emitted from a large vertical plane located at the left. There is a red cone at the position of each particle. This is not very difficult to do: Create the object that you want to duplicate. Make that object a child of the emitter. (Right-click the object, shift-right-click the emitter, press CONTROL-P, and confirm that you want to "Make Parent".) Now, select the emitter. Go to the Animation buttons (F9). Find the button named "DupliVerts" and click it. You will see a duplicate of the object at each particle. (In fact, DupliVerts can be used on any mesh, not just on meshes being used as particle emitters -- one copy of the duplicated object is made for each vertex of the mesh.)
An animation of the flying cones can be found in cones.avi (1.7M). In an alternative version, cones_with_x_force.avi (1.3M), I used a small initial velocity with a large force in the X direction to make it look like the cones were appearing on the left then accelerating rapidly to the right. You can find the blender file in /home/cs324/lab10/cones.blend.
For the cones example, I subdivided the emitting plane several times so that cones would be emitted from more points on the plane. However, I still had the problem that the cones were emitted in a very regular pattern. In a particle system, the vertices of a mesh take turns emitting particles. If the vertices are ordered in a regular pattern, then the particles are emitted in the same pattern. To fix this, I randomized the order of the vertices: Select the mesh, go into edit mode, and select all the vertices. Go to the Edit buttons (F9). Find the button named "Hash" and click it.
FYI: Generations of Particles
A more advanced aspect of particle systems is the use of multiple generations of particles. (You are not required to know how this works.) When a particle reaches the end of its lifetime, it can give birth to one or more new particles. It is possible to assign a different material to each generation. You can even have a third generation. The picture is from a particle animation that uses two generations. The emitter in this example is a mesh circle that moves along a curve, dropping off particles. About 1/4 of these particles will bloom at the ends of their lifetimes into another generation of particles. The new particles are more orange than the originals. All the particles have a short lifetime and decrease rapidly in size. The animation can be found in sparkles.avi (400K), and the Blender file is /home/cs324/lab10/sparkles.blend.
The row of buttons labeled "CurMul", "Mat", "Mult", "Life", and "Child" control multiple generations of particles. "CurMul" tells which generation the other buttons are talking about. "Mat" determines which material is used for that generation (but if you want to know how to use multiple materials, you will have to look it up). "Mult" tells what fraction of particles in this generation give birth to new particles. Setting this to a value greater than zero gives a multi-generation particle system. The "Life" button gives the lifetime of the child particles, and the "Child" button gives the number of children generated. When you use multiple generations, the "Tot" button gives the total number of particles in the system, including children.
As an example using a plane as an emitter, set the "Mult" button to 1 and the number of children to 49. With "Tot" set to 1000, this will give exactly 20 first generation particles. Set both "Norm" and "Rand" to be positive, and use a negative "Z" force. Decrease the lifetimes of the particles. The particle animation will look something like fireworks, with each original particle blooming into 49 new particles. An animation that uses this technique can be found in firework.avi (529K).
Environment maps are used to simulate reflection of the scene in a shiny object. Blender does environment mapping by making six images of the scene -- one view in each direction from the position of a specified reference object (or, more precisely, from the center point of the reference object.) These scenes are then used as a texture on the reflective object. In the image at the right, an environment map is applied to the sphere. In the textured eggs image from the previous lab, an environment map is applied to the plane on which the eggs are standing. Environment maps are computed automatically in blender, once the parameters are set up. If you are doing an animation, you can even have blender compute a new environment map for each scene. The blender file for this image is /home/cs324/lab10/env.blend.
For a typical curved solid object like a sphere, you can use the object itself as the reference object. This will not give a geometrically perfect result, but it will probably look good enough. To use an environment map on a sphere, for example:
- Select the sphere, make sure it has a material, go to the Texture Buttons, add a new texture to the sphere, and set the type of the texture to "EnvMap". You will see the Environment Map controls, which are shown below.
- In the button labeled "Ob:", enter the name of the sphere. (The name is probably "Sphere" if it is the only sphere in the scene. To find the name of an object, select the object and go to the Edit buttons (F9). The name is listed in a button labeled "OB:name" at the top of the Buttons window. Click this button if you want to change the name.)
- In the environment map controls, you will probably want to increase the "CubeRes" to 250 or more. This determines the size of the images created for the environment map. If it's too small, the reflection will be blurry.
- You have to go back to the Material Buttons and make some changes. Change the texture coordinates from the default "Orco" to "Refl". For the texture mode at the right end of the Material buttons, turn off the default "Col" and turn on "Cmir". If you render now, the sphere should look like a perfectly reflective mirror.
- To blend the environment map into the sphere's material, rather than replacing it, you can turn down the value on the "Col" slider at the bottom right of the Material Buttons.
- If you edit the scene, a new environment map will not be computed automatically. To force a new computation, go to the Texture Buttons and click the "Free Data" button in the environment map controls. To automatically recompute an environment map for each frame of an animation, click the "Anim" button.
The procedure for environment mapping a plane is the similar, except that you will not get good results using the plane itself as the reference object. Instead, you should use an Empty as the reference object and position it on the other side of the plane from the camera. Ideally, it should be at the exact position of the reflection of the camera in the plane (this would make the direct view from the reference point be the same as the reflected view from the camera). You can try to judge the position of the Empty reference object by eye, but this procedure below tells you how to get it exactly right if you want to be picky:
- Choose a view in which the plane is perpendicular to the screen, so you see it edge-on.
- Select the camera by right-clicking on it. Hit Shift-S (the "snap" command), and choose to snap "Curs->Sel" to snap the 3D cursor to the camera position.
- Add an empty object to the scene. It appears at the camera position.
- Select the plane by right-clicking on it. Hit Shift-S and choose "Curs->Sel". The cursor jumps to the plane.
- Set the reference point for scaling to be the cursor, rather than the center of the object. To do this click the small button in the 3D window header shown at the right.
- Select the empty object by right-clicking it. Without touching the mouse, hit the "S" key to start scaling, the "Y" key to reflect the empty through the plane, and the "Return" key to finish the scaling. The empty object should now be exactly on the opposite side of the plane from the camera.
- Use the Empty as the reference object by entering its name (probably "Empty") in the "Ob:" button in the environment map controls.
There is a problem with using the Empty as the reference object instead of the plane: The plane will be part of the reflected environment! You have to tell the program to not render the plane as part of the environment. This is what the "Don't render layer" part of the environment map controls is for. Move the plane to layer 2 and select layer 2 in the "Don't render layer" buttons. Since you do want the plane to be in the final image, you need to set two layers to be displayed in the image and in the 3D Window. Do this by shift-clicking the appropriate layer button in the 3D window's header (or simply by hitting CONTROL-SHIFT-2).
Once this is done, you can proceed as above for the sphere: Set the appropriate values in the Materials buttons and render the image.
FYI: Yet More Features
We are very far from covering all of Blender, but here are a few last words about some features that might interest you:
Changing cameras -- You can add an extra camera to the world, but how do you use it? I've finally found the command for doing this: Select the camera that you want to use for viewing. Hold down the Control key and hit the Keypad-0 key. This will switch to the camera view from the selected camera, and that camera will now be used for rendering.
Camera controls -- Since you know that projection in OpenGL can be either perspective or orthographic, and since there is always a near and a far clipping distance, you might wonder where this is in Blender. Just select a camera and go to the Edit buttons. The Edit buttons for a camera allow you to select the projection type and to set the near and far clipping distances (called "ClipSta" and "ClipEnd" in Blender). The default clipping distances are probably OK for most scenes that you will create, but if you make a very large scene, you might have to increase ClipEnd.
Parenting -- We have made objects parents of other objects for various reasons, but you haven't seen the primary reason for parenting. If one object is a child of another object, then transformations that are applied to the parent are automatically applied to the child. However, transformations can also be applied to the child separately. For example, if you model the a car and make the wheels children of the body, then when you move the body the wheels move along with it. However, you can also apply rotations to the wheels, and they will rotate while they move along with the car.
Scenes -- A single blender file can hold several scenes. These scenes can be views of the same world, they can be completely separate, or they can share some objects. This is especially useful if you are using the sequencer to combine scenes. You might do a new scene to create titles for your animation. You might do two views of the same world through different cameras. You can also set different scenes to animate different ranges of frames. To create a new scene, look for the "SCE:xxxx" button at the top of the screen. Next to this is the pop-up menu (marked with a small rectangle) that you use to change from one scene to another and to create new scenes. If you choose "Add New" from this menu, you will get a new menu with four choices: "Empty", "Link Objects", "Link ObjData" and "Full Copy". "Empty" makes a new empty scene. "Full Copy" makes a copy of the current scene. The other two options make copies in which some data is shared between the two scenes. If you choose "Link Objects" you essentially get a new view of the same world: Moving an object in one scene will also move it in the other. (However, you can then add new objects to each scene that don't appear in the other scene.) "Link ObjData" copies part of the data for objects: If you move an object in one scene, it does not move in anther. However, if you change its vertex data in edit mode, it changes in both scenes.
DispView -- This is a small thing that I should have mentioned earlier. If you go to the Render buttons (F12) and look in the lower left corner, you will see a pair of buttons "DispView" and "DispWin". These control where rendered images are displayed. When "DispWin" is selected (the default), a separate window is used. As you have noticed, this window can be a pain. If you switch to "DispView", the rendered image is drawn in the 3D window so you don't have to fool around with another window. One disadvantage is that you don't see the rendered image at its true size.
David Eck, November 2002