This tutorial will cover the basics of particle generation using Thinking Particles. This tutorial assumes familiarity with Cinema 4D.
Note that it takes some time to learn Thinking Particles. Please read through this tutorial carefully and make sure you understand each part before moving on. The aim of this tutorial is to explain not just what to do, but why you are doing it. The "why" is the critical part of learning this system.
We will explore four nodes for particle generation:
So, right off the bat, let's get going and make some particles.
1. Start with a brand new scene in C4D.
2. Add a null object to the scene. You may choose to call this object "TP" or "Particles" or something similar.
3. Add an Xpresso tag to the null object.
4. Double-Click on the Xpresso tag to open the Xpresso Editor window.
5. Right-click inside the Xpresso editor window and choose New Node->Thinking Particles-> TP Generator->PStorm
6. Bring the play-head to zero and play the scene. You should see a circle with particles emitting from it.
Before we move on, let's talk about what we did and why we did it.
Why did we add a null object?
Thinking Particles is an entirely node-based sytem. It can only be accessed through the Xpresso Editor, which requires an Xpresso tag to be placed on some object in the scene. Null objects are excellent tools for organizing scenes and make perfect candidates for Xpresso Nodes. They contain no geometry, and very few object parameters, and thus require little system resources. Also, Thinking Particle nodes generally affect large sytems of objects, and placing them on a "neutral" object (an object with no scene dependencies) makes quite a bit of sense, as it can be copied from scene to scene and (hopefully) still work. This will become more apparent as you grow more and more comfortable with the Thinking Particles system.
Why did we add an Xpresso tag?
As mentioned above, Thinking Particles is an entirely node-based system. The Xpresso Editor was designed as a node-based expression system to be used in Cinema 4D. It can be used in many, many ways. Thinking Particles is only one part of this complicated and powerful tool. As you get more comfortable with Thinking Particles, it will greatly help you to learn about the Xpresso Editior and Xpresso nodes. It will open up many possibilities in Cinema 4D - not just for Thinking Particles, but for rigging, animation, effects, etc. The list goes on-and-on.
Why did we double-click on the Xpresso tag?
That opens the Xpresso Editor and loads the current Xpresso tag into the editor. You can have many Xpresso tags in your scene, but only one tag will open at a time in the editor.
What is a PStorm node? What are all these nodes? Do I really need to know all
of them? This is already intimidating!
Ok, that's a lot of questions! First, most of the right-click options can be ignored for now. In fact, a lot of them you will never need to know about at all. In time, you may want to investigate them further but for now, let's stick with the basics. The way to generate Thinking Particles is by adding a Thinking Particles generator node to the scene. There are no such things as Thinking Particle objects, and the whole idea of particle objects (like the standard Particle System in C4D) needs to be let go of. Don't believe me? Try grabbing that null and moving it around. It makes no difference. The particles still appear in the exact same place they were before, no matter what you do. You cannot directly grab those particles and move them around like the standard particle system. (Don't worry, I'll show you how to, later, as well as explain why this is a GOOD thing). Now, with the nodes... The way to add nodes to the Xpresso Editor is with the right-click menu. Simply right-click in the editor window and you will see a context menu pop up. Since no nodes existed in our editor, we needed to add a new node. Going into the New Node directory brings us to the Thining Particles directory, which brings us to the TP Generator directory. Selecting PStorm creates a PStorm node, which generates particles. All of the nodes in the TP Generator directory will generate particles in one way or another, but PStorm is probably the one you will use the most. It is a very versatile node and has many options already built-in. The other nodes I will talk about later...
So, I have some particles... Now what?
Let's take a look at our basic options. Select the PStorm node and look at the Attribute Manager (I will call it the AM from now on). You may need to open the AM first or make it active before you select the PStorm node. The AM is where you will control all of your particle settings. There will be three tabs in the AM: Basic, Node, and Parameter...
Select the Basic tab. Here you can enable or disable the node, change its name, change its display color and add notes (which can be very helpful). Try out all of these options to see what they do. Make sure you remember to leave the Enabled check on before you continue!
Now go to the Node tab. There is only one property here, Random Seed. Every time you create a PStorm node, it will emit particles in the exact same place, speed, rotation, etc. This must happen so that you get consistent results no matter how may times you load the scene or render it. So, if you have two PStorm nodes in your scene with the exact same settings, they will both do exactly the same thing. Altering the Random Seed for the generator will make sure each system has unique values and appears different in the scene.
Go to the Parameter tab. This is where the majority of the setting you will
alter will be. Play around with these settings to see what they do. Here is
a brief explanation of the options:
Type: Controls the shape of the Emitter (Shape that emits the particles)
Birth Type: You can choose between Count, Rate, and Shot. Count will cap the number of particles from this emitter at the number specified in Count. Rate will steadily emit particles per second at the specified rate. Shot will emit the specified particles per frame.
Life: A particle is "born" at the first frame it is emitted from the emitter. From that point on, the particle will exist in the scene until it is killed in one way or another. Specifying a "life" value will kill the particle after it has been in your scene for the amount of frames specified by Life.
Speed: Sets the speed at which particles move. Note that speed only affects particles at the moment they are born! Keyframing speed will not speed up or slow down particles after they have been born - only on birth. Think of it like setting an autopilot, and once you have set a particle's speed, it cannot recieve any more instructions from you through this node. Later, I will show you ways to influence particles after birth.
Size: Controls the size of the particles. This will not be apparent until you associate some geometry with the particles.
FOV: The spread of the particles.
X and Y Size: The size of the emitter.
Distance: The distance from the emitter that particle birth takes place.
Spin: The spin of the particles. This will not be apparent until you associate some geometry with the particles.
Ok. Let's render our particles! Reset the play bar to zero, then play the scene. Stop on a frame with some particles and render.
It's all black! Nothing's there!
That's right. To make a particle render, we need to associate a shape or a geometry object with it. Right now, all we have are little points (or ticks) that represent the position of our particles, but nothing that will actually render. Let's create an object to place on each particle.
1. Create a cube, and make it 20 for each dimension. Make it 1 segment in
each dimension. While I'm on this step, let me take a brief detour to talk
scene optimization. What you need to know is that you will be placing a copy
of this object on each particle in your scene. It is a good idea to use objects
at the lowest possible level of detail necessary for your shot in order to
make sure you have the memory and processor power required to calculate the
and render the scene. Think about what will happen if you have 1000s of copies
of your object in the scene. Will you be able to render it? Will you run out
of memory? Will you crash? Sometimes it is necessary to create special low
resolution geometry to be used in particles. You will often have a system
that is made
of thousands of low resolution objects, and another system that is made of
only a few higher resolution "hero" objects the will be closer to
2. In the Xpresso Editor, create a PShape node. (New Node->Thinking Particles->TP Standard->PShape). This is a special node that allows you to assign geometry to your particles.
3. Select the PShape node, and in the AM, drag your Cube object into the Object link area. Whatever object you put in here will get assigned to the particles.
4. Add a Particle Geometry object to your scene. Object->Thinking Particles->Particle Geometry. Make sure this object is at the top of the hierarchy in the AM or place the Cube object as a child of it. It is necessary that any object to be used as a particle must be placed below a Particle Geometry object in the AM. I don't know why, but that's just how it is... The Particle Geometry object is a special object that enables particles to be calculated and rendered in your scene. You can use Particle Geometry objects to manage the rendering of different particle systems by assigning groups to the Particle Group parameter (To be discussed later). For now, leave that field blank.
5. Click the Red rectangle on the top right part of the PStorm node and select Particle Birth. You will see that text saying "Particle Birth" has been added to the PStorm node.
6. Grab the PShape node and place it directly to the right of the PStorm node.
7. Click on the red circle next to Particle Birth, hold down the mouse button, and drag to the blue button next to "Cube" on the PShape node to connect the two nodes. If you are successful, you will see a black line connecting the two nodes.
8. Select the PStorm node and change size to 100.
9. Bring the Play Bar to zero and press play. You should now see cubes on top of your particles.
10. Stop on a frame you want to render, and try out a test render. Cubes will now render in the viewport.
11. If you want, you can also make the cube invisible in the editor and renderer, so that only the particles will render, and not the source object.
Let's break down steps 5-10.
What is this Particle Birth port?
First, while the boxes in the Xpresso Editor are called "nodes", the text inside them are called "ports." Each node will have its own set of available ports that have options unique to its node. The ports typically represent properties you will see in the AM when you select the node. Ports can be wired from one node to another to send information from one node to another. Nodes flow from left to right (or red to blue), meaning the ports on the right send out data and information and the ports on the left recieve data and information. This can be confusing when ports on the left and the right have the same names, but try to keep in mind that nodes flow from left to right. The Particle Birth port sends out information about particles at their exact moment of birth. This can be used in many ways. Typically, you use Particle birth to organize particles into different groups. In this case, we want to assign a shape to the particle right at the moment of birth.
Why move the ports next to each other?
Simple. Organization. Also, since Xpresso typically flows from left to right, you may way to organize your flows that way to keep your setups easy to navigate and understand.
How to connect ports?
The click and drag method is the way to connect ports. If ports are compatible, the line between them will turn green. If not, the line will be grey, and you will not be allowed to connect ports. Just because two ports can be connected does not mean that connection is necessarilly logical. It simply means they are compatible, for example, two integer values wired together... (I'll explain integers later)
Why change the PStorm size to 100?
The PShape node has a bounding radius setting set at 100. From the manual: "(Size/Bounding Radius)*size of the object = size of the particle object)" For the particle object to appear the same size as the base object in your viewport, these two values must be the same. You can use either one to scale up or down your particles, or you can scale the base object.
Ok, now that you know how to generate particles and assign geometry to them, let's look at some of the other ways to generate particles:
In a new scene, create a null with an Xpresso tag, open up the Xpresso tag and create a PBorn node (New Node->Thinking Particles-> TP Generator->PBorn). If you play the scene, you will now see particles forming at the origin (0,0,0) and doing nothing. This is the nature of PBorn. It is the base particle system that has options only for number of particles and particle life. Having a generator with so few options can be useful if you're using other methods to control your particle settings (such as using an object for an emitter) and you only need a simple generator for your setup.
PMatterWaves is designed to emit particles from objects, using textures to
control particle settings. This is a very useful node with a variety of applications.
Just to name a couple reasons you might want to use textures to control particles:
1. You need an object to dissolve, so you have an an animated map in the alpha channel of your object making it disappear. To enhance the effect, you want particles to emit from the edges of the object as it dissolves. You can use this alpha texture as a basis for particle emission from your object.
2. You want an object to appear as if it is coated in mud. You use a texture map to decide where the mud should be placed, and create the mud out of particles that can be manipulated with forces, such as being shaken off of you object.
To create a PMatterWaves object, do the following:
1. Like before start a new scene, create a null object, and place an Xpresso
tag on the null. Open the Xpresso editor for that tag.
2. Create a PMatterWaves node. (New Node->Thinking Particles-> TP Generator->PMatterWaves)
3. Create a Plane object that is orientated +Y, width 400, Height 400.
4. Create a new texture and assign it to the Plane. Make sure the texture is set to UVW coordinates.
5. Select the Plane and make it editable. You should now have a UVW tag on the object. Do not delete this!
6. In the texture that is assigned to the plane, disable all options except for luminance.
7. Put a noise texture in the luminance channel.
8. Open up the noise texture and set the Contrast to 100%
9. Step up one in the material hierarchy and click on the arrow next to the Texture button. Select "Copy Channel" to copy the noise channel.
10. Select the PMatterWaves node, and drag the Plane into the Object link area in the AM.
11. Drag the UVW tag from the Plane into the UVW link area in the AM.
12. Set Birth Type to Rate and Rate to 5000
13. Set Birth Type to Texture and paste the noise texture into the Birth Texture Channel.
14. Play the scene and you will see particles emitting from the plane only where the noise texture is white.
Time to talk about what we just did...
PMatterWaves uses an object as an emitter, so we needed to create an object to emit from. This can be any object, but it should be one that has been made editable and has a good set of UVW coordinates, since UVW coordinates are used as the basis for texture mapping of the PMatterWaves node. The actual texture that is on the object has no correlation at all to what happens in the PMatterWaves node. This is purely optional, but can be very helpful for previewing where particle generation will take place. Here, we are using the material to preview where particles will be emitting from the object, but you could delete that material from the object and still get the same results, as long as the UVW tag remains on the object. The contrast of the texture was set very high to exagerate the distribution of particle birth on the surface of our object. Since multiple UVW coordinates can be used on an object, it is necessary to tell PMatterWaves which one to use, which is why you dragged it into the link in the AM. We set birth rate very high to more easily display the distribution of particles. Changing the Birth Type to Texture ensures that we will be using a texture to control birth. If you explore the PMatterWaves node, you will find other options, as well. You can even use lights to control particle emission based on the illumination of an object. This is a very useful node and one you should take the time to get to know.
This node is designed with one purpose: To shatter or fragment particles. This tool is very useful for explosions, dissolving objects, and other special effects.
Let's try a basic fragmentation.
1. In a new scene, create a null object and place an Xpresso tag on the object.
2. Create a Sphere with radius 100 and 16 segments.
3. Make the Sphere editable.
4. Double-click on the Xpresso tag to open the Xpresso Editor.
5. Create a new PBorn node ((New Node->Thinking Particles-> TP Generator->PBorn).
6. Select the PBorn node, and change Birth Type to Shot, and Shot to 1.
7. Create a Time node (New Node->Xpresso->General->Time).
8. Select the Time node, click on the Red Rectangle, and add a Frame port.
9. Right click on the Time port to delete it.
10. Add a Compare node (New Node->Xpresso->Logic->Compare).
11. Click the blue rectangle on the PBorn node, and add an On port.
12. Wire the Time Node to the Compare node, and then the Compare node to the On Port of the PBorn node.
13. Select the Compare node, and change the Data Type to Integer. Function should be ==, and Input 2 should be 0.
14. Add a PShape node (New Node->Thinking Particles->TP Standard->PShape, and connect this to the Particle Birth port of the PShape node.
15. Drag the Sphere into the Object link box of the PShape node, and set the Bounding Radius to 10.
16. Add a Particle Geometry Object to the scene, and make sure it is at the top of the hierarchy in the AM.
17. Disable the Sphere to Editor and Renderer (Both circles should be red). Now, if you play the scene, you will see one sphere at 0,0,0.
18. Create a PFragment node (New Node->Thinking Particles->TP Generator->PFragment) and wire it to the Particle Birth Port of the PBorn node.
19. Select the PFragment node and change the Threshold to 0, and Thickness to 10%.
20. Rewind the Playhead, and play the scene. You will see the Sphere break into pieces.
One thing to know about PFragment is that, while it is a generator, it does not work like a traditional TP generator object. It will only work on particle objects. So, any object that you want to fragment must first be converted into a particle. Steps 1-17 are spent converting the Sphere into a single particle. In steps 1-3, we create and prepare our object for fragmenting. PFragment will only work on editable objects. As a general rule, many nodes and options of Thinking Particles only work with editable objects, so it is good practice to always make editable any object you want to work in the system. If you are worried about needing to go back to the parametric object for any reason, you can keep a version history of the object hidden in your project, or in a separate file. On step 5, we've decided to use PBorn for the simplicity of the node. Since we only need to create 1 particle that is stationary, this simple node is the best choice. All the bells and whistles of PStorm and PMatterWaves would go unused in this setup. On step 6, we've changed the Birth Type to Shot and Shot to 1. This means that exactly 1, and 1 only particle will be emitted per frame. Now, we just need to make sure the emitter is only on for the first frame, and then is turned off for the rest of the animation. To accomplish this, I'm introducing two new nodes to you - the Time node and the Compare node.
Like the name implies, the Time node handles time parameters. The default port, Time, uses seconds as its base, but, depending on preference, you may want to use frames, instead. I find frames easier to work with (as long as the frame-rate is guaranteed not to change) so I've chosen to use frames, instead. If you right-click on Frame and select Port Information, you can see that the value type is integer, which means our Compare node should be looking for a matching Integer value type. Integers are non-fractional numbers, such as 0, 1, 5, 437, 8537, etc. Numbers such as 1.345, 22.5, 987.5767 are known as Real Numbers. You should always try to match output and input types to avoid errors.
The Compare node is a commonly used node, and you should take the time to understand it completely. It can be thought of as the "if, then..." of the Xpresso language (well, not entirely... The "then" comes later). It outputs a Bool. A Bool value is either TRUE or FALSE. In numerical terms, TRUE = 1 and FALSE = 0. In terms of the compare node, if the values it is comparing meet the terms of the comparison, then the output is TRUE. If the terms are not met, then the output is FALSE. Sound confusing? Let's break that down even further...
We have a time node that is set to Frame. This node will output the current frame of the animation to the next node. As stated before, this is an Integer value (there is no such thing as frame 25.467). When we add the Compare node, we are setting up some conditions for enabling or disabling the generator object (the On port of the PBorn node). The On port is always on unless it recieves a FALSE or 0 value from a node. So, how can the Compare node send out FALSE to the PBorn node to turn it off after frame 0? Simple. It must fail some sort of a comparison. The Compare node is set up to take in two values and compare them to each other. The first value gets wired into Input 1, and the second value gets either wired into Input 2 or entered in the AM. In our case, we've decided that this comparison should only test true when the current frame == 0. (Two equals signs is a special sign for comparison equality, as opposed to variable assignment. This is a principle of basic programming, and if you are interested further, there are plenty of programming references available to check out. For our intents and purposes, you can think of = and == as the same thing, for now). If you change the input value, you will see that particle generation does not start until the value specified by Input 2.
In steps 14-17 we have finishing initializing our particle object, and now we can begin to fragment it. In step 18, we create a PFragment node, and wire it into the Particle Birth port of the PBorn node. By doing this, we are saying the the fragmentation should begins immediately when the particle is born. Later, I will show you how to use events to control the timing of forces that affect particles. In step 19, we adjust the PFragment node to make the entire object fragment at once, and increase the thickness of each piece. Check the manual for a description of Threshold to understand more why the value was changed to 0. It is important to note that a Threshold value of 1 produces no fragmentation at all. You should also explore all of the settings in this node to really get a feel for how it works.
So, one thing I mentioned above is that moving the null associated with a particle generator has no effect on the particles. As promised, I'll quickly show you a way to make this possible.
Let's go back to our PStorm example.
Create a new scene with a null named "TP" and add an Xpresso node. Open the Xpresso Editor and add a PStorm node. Drag the TP null into the Xpresso Editor Window, which will create an Object node with your Null already assigned to the Object link field. Add a Global Position output port (Coordinates->Global Position->GlobalPosition) and a Global Matrix output port to the TP object node. Add and Emitter Alignment port to the PStorm node. Connect the nodes as shown below. Now, the alignment and position of the PStorm emitter is linked to the null object!