In this tutorial by Cristian Pop, you'll learn how to create a nice flying papers effect in 3d Studio Max using the power of Thinking Particles. We'll start by creating the paper shapes and materials, then move into Thinking Particles to set up the rules and look at how we can combine them to create the flying paper effect.
Thinking Particles 3 is an advanced rule-based particle system for 3d Studio Max. This tutorial is aimed at intermediate to advanced TP users, so if you're new to Thinking Particles. We recommend you follow some basic TP3 tutorials to understand how it works, where you can find the nodes and what they do.
Additional Files/ Plugins:
First of all download the Project Files. The package contains two animations. We'll start by creating the papers. First create a new "Plane" and set the "Length" and "Width" segments to '10'. Because my 'Sandman' animation is in HD, I created a '128' x '72' Plane (to keep the same aspect ratio.) Always remember rename your objects and materials, to keep everything organized.
Activate the 'Snap' tool by clicking on the "Snap Toggle" at the top of the 3ds Max interface (S key), and move the Plane's pivot point (Hierarchy Tab > Adjust Pivot > Affect Pivot Only) to the left edge (as shown).
"Clone" the Plane (Edit>Clone) (as a copy). It's time to create the animated paper.
Add a "Poly Select" modifier to the plane and select the corner vertex shown, then enable "Soft Selection".
With the vertices selected, add a "Bend" modifier and rotate it's gizmo by '45' degrees on the "Z" axis.
Set the "Bend Axis" to 'Y' and the "Direction" to '90'. Go to frame '10' and animate the "Angle", to bend the corner.
Add a new "Poly Select" modifier, then a new "Bend" on top.
Go to frame '30' and animate the second "Bend" modifier, to create the turning paper effect.
Create two more variations of the animated paper.
Open the "Material Editor" (M) and create a "Double Sided" material.
Open the "Facing Material" and in the "Diffuse" slot, import the "Sandman" image sequence and rotate it by '90' degrees on the 'W' UVW Coordinate.
For the "Back Material" slot, just set the "Diffuse Color" to white.
Thinking Particles Setup.
Create a TP particle system in the scene and open the TP user interface. Highlight "Master Dynamic" and disable “Edit on the fly” to see the changes in real time, and enable “Show Mesh” to see the particle shape. Change the "Particle Display" pull-down to "Particle ID" to see the particle's ID in the viewport.
Create two Groups and name them, "Papers" and "Flying Papers". Select the "Flying Papers" group and change its color, to see it later in the viewport.
It's time to create the rules. Create a "DynamicSet" and name it "Born". Here we'll start to generate the particles.
Create a "Born" operator. Send the newly born particles to the "Paper" group. My "Sandman" animation has 120 frames, so I set the "Particle Amount" to '120'. The "Pistol Shot" option is used to generate all the particles at the same time. Also increase the particle's "Life Span".
Create a "Geom Instance" operator and pick the "NonAnimated Paper" object from the scene. Connect "Geom Instance" to "Born" (Born Particle > Particle). Now you can see the particle's shape in the viewport.
Let's randomize the rotation of the papers. Create a "Alignment" operator and connect it to the "Born" Operator (Born Particle > Particle). Set the "Alignment" type to "User Defined".
Unhide the "ZRotation" input. Create a "Random" helper. Set "Value 1" to '-2' and "Value 2" to '2', then send that random value to the "Z Rotation" input.
Create a "Memory" operator and connect it to the "Born" operator (Born Particle > Particle). Right click on "Memory" and create a "Integer" data type. Name it "ATree State". The "Memory" operator is used to store different data types for the particles. We'll see later how to use it.
Drag this data to the "Inputs" list.
Add an "Integer" helper, set its value to '0' then send this value to the "Memory" operator (Value > ATree State). Basically, we are telling these particles to store a '0' value in their "ATree State" data slot.
Let's work on particle positioning. Create a new DynamicSet and name it "Paper Positioning". Create a "Position" operator and wire it to the "Paper" group (Particle > Particle). Until now, nothing has changed because the position is '0,0,0' by default.
Create a "Point3" helper and send the vector's value to the "Position" operator (Vector > Position).
We'll use a "Value to Time" helper to place the papers on top of each other. Set the "Time2" value to '-300' and use "Value2" to position the papers closer or further from each other.
To create a little bit of random positioning on the X and Y axis, create a "Random" helper and set "Value1" to '-0.5', and "Value2" to '0.5'. Connect the "Random" helper to the "Papers" group (Particle >Particle) to create a different random value for each particle. Send the generated value to the "Point3" helper (Value > X,Y-Value). Set "New Value Per" to 'Animation', otherwise the random value will be generated per frame.
Select the "Point3" helper and use the "Z-Value" spinner to place the papers on the "ground".
In the Top Viewport create a "Deflector" (as shown) and move it on top of the papers.
Set the Animation Length to '600' frames, and Animate the "Deflector" from the top of the papers (at frame 0), to under them (at frame 600). We'll use this "Deflector" to activate our particles.
To use any "Space Wrap" with TP, you need to "Bind" them (in this case, bind the "Deflector" to the TP icon).
Go back to TP and create a new DynamicSet, name it "Activation Test". Create a "Papers" group and a "StdCollision" condition node, then send the particles to the "StdCollision" node to test if the particles are colliding with the "Deflector" or not.
Add the "Deflector" to the "Active" list.
Create a "Group" operator and change the "Group" to "Flying Papers". Connect the "Papers" group to the "Group" operator, then connect the "Output" output of the "StdCollision" node to the "ON" input of the "Group" operator. Once a particle is colliding with the "Deflector" a TRUE data will be sent to the "Group" operator and those particles will be sent to the "Flying Papers" group (colored in green).
Let's create the animated paper shapes for the "Flying Papers" group. First, create a new DynamicSet and change its name to "Flying Papers Shape". Create a "Flying Papers" group and a "GeomInstance" operator. In the "GeomInstance" rollout, click on the "Pick Object" button and select your animated paper objects from the viewport. To create the animated particle shapes, we'll use the "Animation Tree" "Offset Keying Type".
In the "Animation Tree" list, create a new State and name it "0 Animation 0-30" (0=State Number, Animation=State Name, 0-30=State Range).
Add a Range for this State. Set the "Animation Start" to '0' and the "Animation End" to '30' and add a small "Variation" for the "Playback Speed". Here, we have created a State (State 0) that gets the animation from the Animated Papers from frame 0 to frame 30.
Create a second State and name it "1 Animation End 30" (1=State Number, Animation End=State Name, 30=State Range). Add a "Range" for State 1, and set the "Animation Start" and "Animation End" to '30'. This State (State 1) stores the shape of the Animated Papers at frame 30 (the end of the animation).
If you move the time slider you'll see that the papers are animated, but the animation is looping and we don't want that. By default the State Number is set to '0' and what we want to do, is to change the State Number to '1', once the animation from State 0 is finished. Create a "Threshold" condition node, and set "Treshold1" to '0.9', "Treshold2" to '1' and enable the "Inside" option. Send the "ATree State Progress" (ATree State Progress: 0=Animation Start, 1=Animation End) data to the "Threshold" node to be tested.
Create a new "Memory" operator and connect it to the "Flying Papers" group. Drag the "ATree State" data to the "Inputs" list. Remember, we set the "ATree State" value to '0' earlier. Unhide the "ON" input.
Create an "Integer" node, set its value to '1', then send this value to the "ATree State" input of the "Memory" operator.
Send the boolean message from the "Out" output of the "Treshold" operator to the "ON" input of the "Memory" operator. Now, if the "ATree State Progress" data is between 0.9 - 1 (end of the turning paper animation) the "ATree State" data is changed from '0' to '1'.
Create a new "Memory" operator and connect it to the "Flying Papers" group (Particle > Particle). Add the "ATree State" data to the "Outputs" list, then send this value to the "ATree State Number" of the "GeomInstance" operator. And you will see that the turning paper animation is not looping any more.
Create a "Wind" force (as shown) and add some "Turbulence" to it, then bind it to the TP icon.
Go back to TP and create a new DynamicSet. Name it "Flying Paper Force". Create a "Flying Papers" group and a "StdForce" operator, then connect them. Activate the "Wind" force. Now, the papers are affected by the wind.
Create a new "Deflector" in the scene. This "Deflector" will be used to kill the particles that are colliding with it. Bind the deflector to the TP icon.
In TP, create a new DynamicSet and name it "Particle Die". Create a "Flying Papers" group and a "StdCollision" condition node and then connect them. In the "StdCollision" rollout add the newly created deflector to the "Active" list.
Create a "Particle Die" operator and connect it to the "Flying Papers" group. Send the message from the "StdCollision" node to the "ON" input of the "Particle Die" operator.
And this is the result without materials.
Thinking Particles Setup - Material.
It's time to create the materials. First, we'll start with a test material. Copy the "Paper Material" to a new slot and rename it.
Open the "Facing Material" and in the "Diffuse" slot, import the "Test" image sequence. This is a 10 frame animation representing a visual counting from 0-9.
Go to TP. For testing purposes, in the "Born" DynamicSet select the "Born" operator and set the particle amount to '10'. Then, in the "Particle Positioning" DynamicSet, select the "Value To Time" operator and set "Value2" to '10'.
Create a new DynamicSet and change its name to "Paper Material". Create an "All" group and a "Shape Material" operator, and connect them. Drag the "Paper Material Test" material to the "Material" slot. If you do a render test, you'll see that the paper get the frame from the test image sequence based on the current frame (at frame 5 it's getting the 5th frame from the image sequence).
Create a new DynamicSet and name it "Paper Material Time". Create an "All" group and a "Material Time" operator, and connect them. Set the "Material Time" option to "User Defined Time" and set the "Material Time" to '3'. It doesn't matter at what frame you move the time slider, if you do a render test you'll see that the paper gets the 3rd frame from the test image sequence.
Now, what we want to do is to apply a frame from the image sequence for each particle, based on its ID number (ID 0=1st frame from sequence, ID 1=2nd frame from sequence...). For that, create a "Integer" helper and send the Particle's ID from the "All" group to the "Material Time" input of the "Material Time" node, through the "Integer" node. And that's all.
Go back to the "Paper Material" DynamicSet and change out the test material with the "Paper Material".
Change back to the original values for the particle amount and the "Value To Time" operator.
For more details, add a "Turbosmooth" modifier to the Animated Papers.
And that's the final result. I hope you enjoyed this tutorial.
- How to Create a Dancing Particle Effect using 3ds Max and Thinking Particles
- Six Ways to Create Condensation in 3DsMax – Scatter, PArray & PFlow
- Create an Awesome Exploding Glass Effect with Thinking Particles and 3ds Max
- Create An Animated Pinboard Effect In 3ds Max
- ‘Quick Tip’ – How to Create Awesome Looking Imprints Using 3ds Max 2009 & Thinking Particles 3