User Guide Cancel

Overview of the particle editor | Substance 3D Painter

  1. Substance 3D home
  2. Home
  3. Getting Started
    1. Getting Started overview
    2. Activation and licenses
    3. System requirements
    4. Project creation
    5. Export
      1. Export overview
      2. Export window
        1. Export window overview
        2. Export settings
        3. Output templates
        4. List of exports
      3. Export presets
        1. Export presets overview
        2. Predefined presets
          1. Predefined Presets
          2. USD PBR Metal Roughness Preset
          3. Default Presets
        3. Creating export presets
    6. Glossary
    7. Performance
  4. Interface
    1. Assets
      1. Assets overview
      2. Navigation
      3. Customizing the layout
      4. Filter by path
      5. Saved searches
      6. Advanced search queries
      7. Adding a new library
      8. Sub-library tab
    2. Substance 3D Assets
    3. Color picker
    4. Display settings
      1. Display settings overview
      2. Environment settings
      3. Camera settings
      4. Viewport settings
    5. History
    6. Layer stack
      1. Layer stack overview
      2. Creating layers
      3. Managing layers
      4. Masking and effects
      5. Blending modes
      6. Layer instancing
      7. Geometry mask
    7. Main menu
      1. Main menu overview
      2. File menu
      3. Edit menu
      4. Mode menu
      5. Window menu
      6. Viewport menu
      7. Plugins menu
      8. Help menu
    8. Project configuration
    9. Properties
    10. Settings
      1. Settings overview
      2. General preferences
      3. Shortcuts
      4. Libraries configuration
    11. Shader settings
      1. Shader settings overview
      2. Updating a shader
    12. Texture Set
      1. Texture Set overview
      2. Texture Set list
      3. Texture Set settings
      4. Texture Set reassignment
    13. Toolbars
    14. Viewport
      1. Viewport overview
      2. 2D view
      3. 3D view
      4. Camera management
    15. Miscellaneous
      1. Sliders
      2. Log
      3. Update checker
  5. Painting
    1. Painting overview
    2. Tool list
      1. Paint brush
      2. Eraser
      3. Projection
      4. Polygon fill
      5. Smudge tool
      6. Clone Tool
      7. Quick mask
      8. Path tool
    3. Straight line   
    4. Lazy mouse 
    5. Symmetry
      1. Symmetry overview
      2. Mirror Symmetry
    6. Fill projections
      1. Fill projections overview
      2. Fill (match per UV Tile)
      3. UV projection
      4. Tri-planar projection
      5. Planar projection
      6. Spherical projection
      7. Cylindrical projection
      8. Warp projection
      9. UV set to UV set projection
    7. Presets
      1. Presets overview
      2. Creating and saving presets
      3. Creating particles presets
        1. Creating particles overview
        2. Installing the particle editor
        3. Overview of the particle editor
        4. Creating a new particle script
      4. Photoshop brush presets (ABR)
        1. Photoshop brush presets overview
        2. Exporting Brush Presets from Photoshop
        3. Importing Photoshop Brush Presets
        4. Photoshop Brush Parameters Compatibility
    8. Dynamic strokes
      1. Dynamic strokes overview
      2. Enabling Dynamic Stroke feature
      3. Dynamic Stroke Performances
      4. Creating custom Dynamic Strokes
    9. Advanced channel painting
      1. Channel painting overview
      2. Ambient Occlusion
      3. Flow Map
      4. Height Map
      5. Normal Map
    10. Vector graphic (.svg & .ai)
    11. Text resource
  6. Effects
    1. Effects overview
    2. Generator
    3. Paint
    4. Fill
    5. Levels
    6. Compare Mask
    7. Filter
    8. Anchor Point
  7. Baking
    1. Baking overview
    2. How to bake mesh maps
    3. Baking visualization settings
  8. Content
    1. Creating custom effects
      1. Creating custom effects overview
      2. Generic filter
      3. Channel specific filter
      4. Generators
      5. Mesh map
      6. Mesh based input
      7. User data
    2. Importing assets
      1. Adding resources via drag and drop
      2. Adding resources via the import window
      3. Adding content on the hard drive
      4. Receiving assets from other Substance 3D applications
  9. Features
    1. Automatic UV Unwrapping
    2. Physical size
    3. Smart Materials and Masks
    4. Subsurface Scattering
      1. Subsurface Scattering overview
      2. Enabling Subsurface in a Project
      3. Subsurface Parameters
      4. Subsurface Material Type
    5. Dynamic Material Layering
    6. UV Reprojection
    7. UV Tiles
      1. UV Tiles overview
      2. Image Sequence
    8. Color Management
      1. Color management overview
      2. Color management with Adobe ACE - ICC
      3. Color management with OpenColorIO
    9. Post Processing
      1. Post Processing overview
      2. Color correction
      3. Depth of Field
      4. Glare
      5. Lens Distortion
      6. Tone Mapping
      7. Vignette
      8. Color Profile
    10. Iray Renderer
      1. Iray Renderer overview
      2. Iray Settings
      3. Viewer and MDL Settings
    11. Plugins
      1. Plugins overview
      2. Autosave
      3. Resources Updater
    12. Sparse Virtual Textures
    13. Custom Shaders
    14. SpaceMouse® by 3Dconnexion
    15. Universal Scene Description (USD)
    16. Send to
  10. Technical Support
    1. Performance Guidelines
      1. Performances guidelines overview
      2. Conflicts and background applications
      3. Mesh and UV setup
      4. GPU Drivers
      5. NVIDIA Drivers Settings
      6. GPU VRAM amount and bandwidth
      7. GPU VRAM and other applications
      8. Texture Sets amount
      9. Layer management
      10. Channels management
      11. Substance filters and materials
      12. Viewport display
    2. Configuring Pens and Tablets
    3. Exporting the log file
    4. Exporting a DXDiag
    5. Technical issues
      1. GPU Issues
        1. Crash when working with overclocked GPU
        2. Forcing the external GPU on Mac OS
        3. GPU drivers compatibility
        4. GPU drivers crash with long computations (TDR crash)
        5. GPU has outdated drivers
        6. GPU is not recognized
        7. GPU is not recognized and is mentionned as GDI Generic
        8. Issues with Nvidia GPUs on recent Mac OS versions
        9. Multi/Bi-GPU
        10. Running on integrated GPU
        11. Painter doesn't start on the right GPU
      2. Startup Issues
        1. Application failed to start because of Qt
        2. Crash or freeze during startup
        3. Software conflicts
      3. Rendering Issues
        1. Artifacts and glitches on Mac OS with Custom GPUs
        2. Blocky artifacts appear on textures in the viewport
        3. Mesh appears pink in the viewport
        4. Mesh flash to white when moving camera
        5. Some HDPI scaling values are not working
      4. Stability Issues
        1. Crash during export
        2. Crash when opening or saving a file
        3. Crash while baking
        4. Crash with low virtual memory
        5. Windows Blue Screens
      5. Miscellaneous Issues
        1. Corrupted texture error message
        2. Shelf resources are gone after 7.2 update
        3. Error there is no disk in the drive
        4. Error with missing api-ms-crt dll
        5. Impossible to drag and drop files into the shelf
        6. Impossible to use the ALT keyboard shortcut on Linux
        7. Assets (or shelf) previews are empty
    6. Workflow Issues
      1. Export Issues
        1. My exported opacity map is totally black
        2. Texture dilation or Padding
      2. Tools Issues
        1. Normal map looks incorrect when loaded in layer or tool properties
        2. Paint Tool bleeds on other UV islands
      3. Project Issues
        1. A project has been processed as a text file and is now corrupted
        2. Loading files from a network
        3. Preserve brush strokes setting stays disabled
        4. Projects are really big
      4. Library Issues
        1. Thumbnails in the shelf look incorrect
        2. Error when importing a Font
      5. Viewport Issues
        1. Mesh faces disappear when looking at them from behind
        2. Viewports and textures are blurry or lack sharpness
      6. Plugins Issues
        1. Substance Source plugin doesn't load
      7. License Issues
        1. Maintenance is expired dialog on startup
  11. Pipeline and integration
    1. Installation and preferences
      1. Preferences and application data location
      2. Automated installation
      3. Retrieving the installation path
    2. Configuration
      1. Command lines
      2. Environment variables
      3. Firewall Configuration
      4. Querying Current Software Version
      5. Remote Desktop
    3. Resource management
      1. Shelf and Assets location
      2. Resource paths
        1. Adding resource paths by editing preferences manually
        2. Editing resource paths manually
        3. Editing the Shelf Preferences with Python
      3. Adding saved searches manually
      4. Preferences and content migration
      5. Excluding resources in a resource path
  12. Scripting and development
    1. Scripts and plugins
      1. Creating a Javascript plugin
      2. Remote control with scripting
    2. Shader API Reference
      1. Shader API overview
      2. Changelog - Shader API
      3. Libraries - Shader API
        1. Lib Alpha - Shader API
        2. Lib Bayer - Shader API
        3. Lib Defines - Shader API
        4. Lib Emissive - Shader API
        5. Lib Env - Shader API
        6. Lib Normal - Shader API
        7. Lib PBR - Shader API
        8. Lib PBR Aniso - Shader API
        9. Lib Pom - Shader API
        10. Lib Random - Shader API
        11. Lib Sampler - Shader API
        12. Lib Sparse - Shader API
        13. Lib SSS - Shader API
        14. Lib Utils - Shader API
        15. Lib Vectors - Shader API
      4. Parameters - Shader API
        1. All Custom Params - Shader API
        2. All Engine Params - Shader API
        3. All Rendering States Params - Shader API
        4. Layering Bind Materials - Shader API
        5. Layering Declare Stacks - Shader API
      5. Shaders - Shader API
        1. PBR Material Layering - Shader API
        2. PBR Metal Rough - Shader API
        3. Pixelated - Shader API
        4. Surface Shader - Shader API
        5. Toon - Shader API
  13. Release notes
    1. Release notes overview
    2. All Changes
    3. Version 10.1
    4. Version 10.0
    5. Version 9.1
    6. Old versions
      1. Version 9.0
      2. Version 8.3
      3. Version 8.2
      4. Version 8.1
      5. Version 7.4
      6. Version 7.3
      7. Version 7.2
      8. Version 2021.1 (7.1.0)
      9. Version 2020.2 (6.2.0)
      10. Version 2020.1 (6.1.0)
      11. Version 2019.3
      12. Version 2019.2
      13. Version 2019.1
      14. Version 2018.3
      15. Version 2018.2
      16. Version 2018.1
      17. Version 2017.4
      18. Version 2017.3
      19. Version 2017.2
      20. Version 2017.1
      21. Version 2.6
      22. Version 2.5
      23. Version 2.4
      24. Version 2.3
      25. Version 2.2

Overview of the particle editor

This page covers several aspects of PopcornFX particle editor. Some of window titles and parameters may be subject to change depending on the version of the editor used.

Viewport setup

How to import your own mesh

Copy-paste your mesh in the “Meshes” folder of your Pack. Then in the Editor open your mesh and click on “Build”.

Now, in your particle system, go to “Backdrop” in the treeview, right-click on “3D Layers”, “New Backdrop”, “CNEdEditorBackdrop_Model3D”, and select your mesh in “resource model”.

In Substance 3D Painter, the Mesh is scaled to be inside a box of size [-1;1] on each Axis. To get the right scale with Substance 3D Painter in the Editor, you should either import a mesh which is already scaled to fits in that box (easy way), or play with Scales in the Editor.

Note: only FBX mesh format are supported.

How to display the grid

Ctrl-G. You can customize the color of the grid in “Editor Properties” “GridColor”.

Emitter

How to create “OnCollide” events

The Physics Evolver handles collision with backdrop meshes in the scene. In Substance 3D Painter the scene will be your mesh.

First in the Physics Evolver set “WorldInteractionMode” to “OneWay” to enable particle collision. Then create an event called “OnCollide”, the Physics Evolver will trigger it on collision with the scene.

In Substance 3D Painter, the scene is the model you are working on, and all events called “OnCollide” will be overridden by the Emitter particle system of the current brush.

How to fire particles from the camera

On the top of the viewport, enable the 4th button “Constrain spawns on camera plane”.

Substance 3D Painter will by default fire Emitters from the camera.

How to emit particles on the top like rain

Disable “Constrain spawns on camera plane” if enabled.

Create a Particle Attribute called “Global”, now Substance 3D Painter will spawn your particles at the origin.

To spawn on the top of the mesh, add a Shape Sampler BOX or CYLINDER, place it on top, and sample it in your Spawner Script.

For example with a Shape Sampler BOX called “Spawn”, add this to your Spawner Script:

Position = Spawn.samplePosition();

Receiver

How to spawn the Emitter while creating/editing a Receiver

To get even closer to the Substance 3D Painter workflow while editing your Receiver, you can setup the Editor to override the particle system spawned.

In the treeview of your Receiver, select “Editor Properties”, then enable “UserOverSpawn” and select your emitter in “OverSpawnEffect”.

You still must open your Emitter to set the “OnCollide” events to spawn the Receiver you are currently editing.

How to setup particle fields

Here is the description of the particles field you must have in your Receiver:

“Size” float

The multiplicator of the brush size in Substance 3D Painter.

“Opacity” float

The multiplicator of the brush opacity in Substance 3D Painter.

“UV” float3

The texture coordinate on the mesh of particles.

In a Evolver Script, sample your Shape Sampler “Mesh” with the parametric coordinate given by the Projection Evolver:

UV = Mesh.sampleTexcoord(pCoords);

“Normal” float3

The normal of the mesh surface beneath particles.

In a Evolver Script, sample the Shape Sampler “Mesh” with the parametric coordinate given by the Projection Evolver:

Normal = normalize(Mesh.sampleNormal(pCoords));

“Seed” int

Just a randomly generated value for Substance 3D Painter:

In a Evolver Script add:

Seed = int(rand(0,20000000));

“pCoords” int3

Not used by Substance 3D Painter, but indispensable to do the particle projection on the mesh and sample other fields.

How to project particle on the mesh

Add a Projection Evolver in the “State_0” of your Receiver.

Each frames, the Projection Evolver will project particles on the nearest surface of a Shape Sampler.

The Projection Evolver can fill out the parametric coordinate of the projection in the particle field specified by “OutputParametricCoordsField” (see “pCoords” particle field).

And it can reproject a vector on the surface of the mesh with “ReprojectedField”.

Here, we want to project particles on the Sampler Shape “Mesh”, fill out parametric coordinates in the int3 particle field “pCoords”, and project the “Velocity” on the surface too:


How to sample the mesh

In Substance 3D Painter, all Shape Samplers called “Mesh” and of “ShapeType” “MESH”, will be overridden with the mesh used in Substance 3D Painter.

In the Editor, set it to the same mesh as your backdrop.

To sample things in a Script, just write “Mesh.sample~Something~(pCoords)” in a Script, here is the documentation:

http :// www . popcornfx . com / wiki / index . php / CParticleSamplerShape # Script _ bindings

Some useful code snippets you will need:

// UV is the texture coordinate of the particle on the mesh

// Must be after CParticleEvolver_Projection

UV = Mesh.sampleTexcoord(pCoords);

// Normal is the Normal of the surface on the mesh just below the particle

// Must be after CParticleEvolver_Projection

Normal = normalize(Mesh.sampleNormal(pCoords));

General tips

How to import Emitter/Receiver in Substance 3D Painter

In Substance 3D Painter, do “File” > “Import particles” or Ctrl-Alt-R then choose your Emitter.pkfx or Receiver.pkfx in you Pack.

Substance 3D Painter will automatically detect requirements (particle fields, OnCollide events) to decide if your pkfx is either an Emitter, Receiver or nothing compatible.

Now, you should see your Emitter/Receivers in the Shelf.

How to debug particle with a viable particle size

As the “Size” particle field must be between 0 and 1 to be a multiplier of the brush size in Substance 3D Painter, particles will be far too big in the Editor. So, add a custom field float “BBSize” set to 0.01 in the Spawner Script, to be used in the Billboard Particle Renderer as the “SizeField” to better see particle.

How to not mess up with evolver order

The order of the evolver can be very important.

For example, you might want to always have your 2 last evolvers to be the Projection Evolver then the Script Evolver which samples the UV and Normal with the pCoords generated by the Projection Evolver.

Keep in mind that the order of the evolvers is literally the order of execution inside a frame, and that Substance 3D Painter will gather particle field values and the end of each frame.

How to sample the mesh’s normal map

Substance 3D Painter will replace all Texture Samplers called “NormalMap” with the normal map of the mesh (if imported).

Thats the only texture you can have for now, all other texture will not be accessible by Substance 3D Painter.

Once you have add you Texture Sampler called “NormalMap”, you can sample it in a script :

http://www.popcornfx.com/wiki/index.php/CParticleSamplerTexture

Some useful code snippets:

// In Evolver Script

// Convert the NormalMap texture in tangent space to world space normal

// /!\ the "Normal" particle field must always be the normal of the mesh not influenced by the normal map

// /!\ dont forget to initialize your particle fields in your Spawn Script

// otherwise pCoords and Normal will be invalid at the first update

float normalFactor = 1.0; // change the intensity of the normal map

float3 meshnormal = Normal;

float4 rawtangent = Mesh.sampleTangent(pCoords);

float3 binormal = normalize(cross(meshnormal, rawtangent.xyz) * rawtangent.w);

float3 tangent = normalize(cross(meshnormal, binormal));

float3 tsNormal = normalize(((NormalMap.sample(UV).xyz * 2.0 - 1.0).xyz) * float3(-normalFactor, normalFactor, 1));

float3 normal = normalize(tsNormal.x * tangent + tsNormal.y * binormal + tsNormal.z * meshnormal);

How to create turbulences

In the Editor, create a Turbulence Sampler.

http://www.popcornfx.com/wiki/index.php/CParticleSamplerProceduralTurbulence

Then you have 2 way to sample the Turbulence and affect particles:

The easy way

In the Physics Evolver of your layer, set “VelocityFieldSampler” to your Turbulence Sampler name, and set “Drag” to a value > 0.

The parameterized way

You adjust turbulences with attributes by sampling the velocity field generated by your Turbulence Sampler in a Evolver Script:

Create 2 Particle Attributes:

  • float “TurbulencePower” minmax: [0;5]

  • float “TurbulenceScale” minmax: [0.001; 5] (needs to be > 0)

Then create 3 Particle Fields:

  • float “TurbPower” and float “TurbScale”

To store attribute in them in the Spawner Script:

TurbScale = 1.0 / TurbulenceScale;

TurbPower = TurbulencePower;

  • float3 “VelocityField” in rotate mode

It will be used as the “VelocityField” in the Physics Evolver (already set by default to the field “VelocityField”).

So before your Physics Evolver, in a Script Evolver, sample your Turbulence Sampler called “Turb”:

VelocityField = Turb.sample(Position * TurbScale) * TurbPower;

How to correctly use dt, the delta time

Delta time is the simulation time in seconds between each frame updates. In the Editor the delta time is updated with the real elapsed time. In Substance 3D Painter the delta time is fixed, and each updates is launched as soon as le last one is finished.

A game running at 60 FPS will have a delta time of 1/60= 0.016 seconds, so try to get your brushes running around 0.016s of delta time.

  • Big deltas time > 0.016s

  • PRO fast update

As the time between updates is large, the movement of particles will be larger, so the Brush will run faster in Substance 3D Painter.

  • CON approximation

PopcornFX is a kind-of big discretisation system, so bigger the dt is, bigger the imprecisions will be. See large delta time implication on turbulences: http://www.popcornfx.com/wiki/index.php/CParticleEvolver_Physics#Dealing_with_turbulences_at_low_framerates

  • CON splats

If the delta time is large, particle movement between frame is large too. So, in Substance 3D Painter little spots might appears instead of straight lines.

This happens because Substance 3D Painter will draw one stroke point for each particles at the end of each frames, and don’t draw lines for each particles between the last and current frame.

  • Little delta time < 0.016s

  • PRO precision

Smaller is the delta time, smaller distance between brush strokes will be, so sharper will be the drawing. And the discretisation of the simulation will be better too.

  • CON slow

Smaller is the delta time, greater the number of updates will be necessary to draw the same distance distance.

Final tips on delta times : a good way to get the to right dt could be to start with a large one (0.1s) then decrease step by step to get the result you want.

How to expose parameters of your particle system

Substance 3D Painter will gather Particle Attributes of particle systems and expose them in the Physic Brush parameters:

http://www.popcornfx.com/wiki/index.php/Particle_effect_attributes

In PopcornFX you have the feature called “Attributes in Evolve” which allow you access Attribute in Evolve scripts: do not do that . Instead create particle field and store attribute in them in the Spawner Script, then use those particle field in Evovler Scripts. (this could be fixed in the future)

How to detect problematic particles

You should never have particles with weird particle field values, so make sure you break on problematic from times to times:

http://www.popcornfx.com/wiki/index.php/Particle_tips_BreakOnProblematicParticle

How to resolve particle systems problems in Substance 3D Painter

In the Substance 3D Painter installation directory, you should find a file called “popcorn.htm”. This file contain all the logs of PopcornFX, take a look inside to see what could happen wrong.

How to correctly initialize particle fields

To get valid pCoords UV and Normal from the first frame, add this to your Spawner Script:

// PostEval() will be called after particles have been translated to their respective spawn locations

// so, PostEval() is executed in world space

function void PostEval()

{

// we need to initialize correctly the values needed by Substance 3D Painter:

pCoords = Mesh.projectParametricCoords(Position);

UV = Mesh.sampleTexcoord(pCoords);

Normal = normalize(Mesh.sampleNormal(pCoords));

}


Get help faster and easier

New user?