The Grow operator invokes various algorithms to grow intricate patterns of particles.
Growth Rollout
Diffusion-limited aggregation: the DLA algorithm grows particles outwards from particles that are surrounded by open space.
Ivy: the ivy algorithm grows particles along surfaces in vine-like patterns.
Shortest path: the shortest path algorithm grows particles towards destination objects along the shortest path through their neighbors.
Space colonization: the space colonization algorithm grows particles from seed particles that are in close proximity to expansion particles.
Diffusion-Limited Aggregation
As particles are spawned, they are connected to each others’ implicit surfaces. The minimum distance between two spawned particles is therefore (radius x 2).
Enable spacing: controls whether to use a custom value for the minimum size of empty space required for that region to spawn particles. If this is disabled, the radius value will be used instead.
Spacing value: the minimum size value of an empty region before it will be able to spawn particles. Increasing this value will result in growths stretching outward, rather than remaining in tighter clumps.
Each time the growth algorithm progresses, it chooses a random region adjacent to existing particles and checks that region for overlapping particles. If a particle exists inside the region, spawning inside the region is disabled. The smaller the spacing value, the easier it is for the growth algorithm to find empty regions and therefore progress forward. The larger the region, the more the growth algorithm must stretch out into empty space in order to find an area free of particles.
Bias: controls whether the search algorithm will tend to look for valid regions near the center of existing particles, or near the boundary of existing particles. Values less than 1.0 bias towards the center, values greater than 1.0 bias towards the boundary.
Inherited vel %: the percentage of velocity child particles will inherit from their parent.
Max tries: the maximum number of attempts the algorithm will make to find a valid region of space to spawn a particle, at each growth iteration.
Iterations: the number of growth iterations to perform, at each time step of the simulation.
Align rotation: aligns the rotation of particles to the vector between themselves and their parent.
Reset age: when enabled, new particles generated by the growth algorithm will have an age/eventAge of 0. When disabled, they will have the same age as their parent particle.
Disable the “reset age” setting if you want to easily control growth termination by particle age. Since all generated particles will therefore have the same age as their original parents, the growth as a whole can be terminated by adjust the operator’s timing settings.
Enable clustering: controls whether the DLA algorithm will iterate over clusters of particles individually, or over all event particles simultaneously.
Channel: the custom particle data channel from which cluster data will be retrieved.
By default, the growth algorithm will process all event particles together. By enabling clustering, you can separate particles into cluster-specific groups, which causes the growth algorithm to process those groups separately. This allows you to have multiple, independent growths forming within the same event.
Growth bounds/random particle: controls whether starting candidate positions for new growth particles will be located around the bounds of overall growth, or at a random particle within the growth.
Affected by forces: controls whether the starting candidate positions for growth particles will be affected by forces.
Multiplier: the strength multiplier to apply to forces which affect starting candidate positions for growth particles.
Spread: the amount of random spread applied to the seed positions.
Simulation groups: controls which particle simulation groups the random particle seed position will be derived from.
Show seed points: displays the resulting seed points in the viewport.
Ivy
The simplest way to get started with the ivy growth algorithm is to create a new ‘Simple Ivy Flow’ from the ‘Presets’ section of the tyFlow editor right-click menu. It will setup a small growth simulation which assigns appropriate shape meshes to ivy particles (using the Shape operator ‘index from custom float value’ technique outlined below), as well as an optional Spline Paths operator which, when enabled, converts vine particles into splines for rendering.
Growth surfaces: the ivy will grow towards these surfaces, moving along them once it comes within a certain minimum distance to them.
Sample: controls which sampler will be used to determine closest-object proximities for particles.
Ivy growth can start inside a surface: when enabled, source particles that are inside a surface can still grow ivy - when disabled, no ivy will be grown from them.
Ivy can grow through surfaces: when enabled, ivy particles that are inside surfaces over the course of their growth will be immediately pushed outside - when disabled, they will be allowed to grow inside/through surfaces.
Ivy growth is designed to run parallel to surfaces, so when ‘ivy can grow through surfaces’ is enabled, ivy will still tend to only grow parallel to a given surface, however it won’t immediately be pushed outside the surface if it happens to intersect it.
Distance: the maximum distance from the surface a particle may be, to adjust its trajectory to travel along the surface, rather than simply towards it.
Attraction: the amount of force the surface will exert on particles, causing them to move towards it.
To animate ivy growth over time, set Grow operator timing to continuous, and set ‘iterations’ to a value less than the ivy’s ‘max age’ value. If the ivy’s ‘max age’ value is greater than the ‘iterations’ value, further simulation substeps will be required for ivy to reach its max age, causing it to grow over time.
Max age: the maximum number of iterations an ivy vine will grow.
Spread: the amount of force to apply to ivy child vines to drive them away from their parent vine.
Untangle: the amount of internal force to apply to ivy vines to prevent them from forming tight clusters.
Jitter: the amount of force to apply to ivy particles to jitter their position over the length of each ivy vine. This scale of this jitter is relative to the scale of the noise applied to the ivy as a whole.
Scale multiplier: a multiplier applied to the scale of ivy vine particles.
By default, ivy scale is relative to the scale of the input particles, however the scale multiplier can be used to further tweak the overall scale of the ivy.
It’s usually a good idea to send stems/leaves to another event for display/rendering/processing, because the ivy vines themselves will likely need to be converted into splines using a Spline Paths operator. By separating out the stems/leaves to another event, you can do the spline conversion without any interference from the particles which don’t need to be converted into splines.
Vector/splines: controls how direction vectors for ivy particle forces will be computed. Vector mode will use a static vector as the ivy direction force. Spline mode will cause ivy to follow the direction of the nearest spline, within a defined range.
X/Y/Z: the individual components of the static direction vector.
Follow: the amount of directional force applied to ivy particles.
Attraction: the amount of attraction force applied to ivy particles, towards the nearest spline.
Divergence: the amount of angular divergence applied to ivy particle directional force vectors.
Spline list: the list of splines that ivy particles will follow in ‘splines’ mode.
Distance/falloff: the maximum influence range of splines, outside of which ivy particles won’t be affected.
Branching occurs when an ivy vine spawns child vines as it grows over time. Child vines inherit properties of their parents, but usually in different quantities. For example, a child vine may be shorter than its parent, or it may have a smaller radius than its parent, etc. The branching multipliers allow you to control how vine properties transfer to child vines. The multipliers are additive, so for example, if the scale multiplier is set to 0.5 and a parent vine’s radius is 1.0, then the child vine’s radius will be 0.5 - however, if that child spawns it’s own child, that 2nd-order child’s radius will be 0.25, and so on.
Max depth: the maximum depth of spawn recursion that may occur in the vine. For example, if ‘max depth’ is set to 1, vines may spawn child vines, but child vines may not spawn their own child vines.
Branch time: the amount of time a vine must grow before it can potentially spawn a child vine.
Branch time mult: a multiplier on the ‘branch time’ of vines that is applied to child vines. The lower the value, the more child vines may spawn from a parent vine, relative to the original ‘branch time’ value.
Max age mult: a multiplier on the ‘max age’ of vines that is applied to child vines. The lower the value, the shorter child vines will be.
Direction mult: a multiplier on the direction force of vines that is applied to child vines. The lower the value, the less child vines will conform to directional forces.
Attraction mult: a multiplier on the attraction force of vines that is applied to child vines. The lower the value, the less child vines will be attracted to surface objects.
Density %: controls how dense leaf growth will be, along vines. A value of 100% means that every vine particle will spawn a leaf particle.
Stem length mult: controls how long leaf stems will be, relative to the scale of the parent vine particle.
Stem radius mult: controls the radius of leaf stems, relative to the scale of the parent vine particle.
Leaf scale mult: controls the scale of leaves, relative to the scale of the parent vine particle.
Min age: controls how old a vine particle must be before it can spawn leaves. Higher values means leaves will only grow further down along vines. A value of 0 means that leaves can grow anywhere along a vine.
Min depth: controls the recursive depth requirement for leaves along vines. Higher values than 0 mean that only child vines at the specified depth may grow leaves. A value of 0 means that any vine can grow a leaf.
Normal threshold: controls how close the angle of the nearest surface face normal must be to 0,0,1, in order to grow leaves. Higher values means only vines moving along upward-facing surface faces may grow leaves.
Gravity: controls how much artificial gravity is applied to leaves and stems. Higher values means that leaves and stems will hang towards the ground. A value of 0.0 means that leaves and stems will point outwards from the face normals of the nearest surface.
Stem divergence: the amount of angular divergence to apply to the orientation of stems.
Leaf divergence: the amount of angular divergence to apply to the orientation of leaves.
It may be important later in a sim to differentiate between ivy particles (ie, between vines, stems and leaves). By assigning unique custom float values to each particle type, you can filter particles by their type later in a simulation.
Channel: the channel name to store the category values in.
Vines/stems/leaves: the float values to assign to each ivy particle type.
The Grow operator doesn’t assign any shape meshes to particles itself. However, by assigning a unique integer value to each particle type (ex: 0, 1, 2), those values can later be used in a Shape operator as index values, to easily assign different shape meshes to ivy particles, depending on their type. For example, if ‘leaves’ are assigned a category value of 2.0, then the 3rd item in the following Shape operator (if ‘index from custom float value’ is enabled in the Shape operator) will be assigned to leaf particles (because the Shape operator list uses 0-based index values).
As ivy grows, each particle will assign its parent particle as its target. This allows easy conversion to splines or bindings later in the simulation.
Shortest Path
The shortest path algorithm finds the shortest path between particles and a set of destination objects, through a graph formed by connections between particles in the event. Traditionally, shortest path algorithms use surface topology to form a connectivity graph between points (ex: edge connections between vertices in a mesh) - however, the Grow operator can form a graph between any set of particles by using a neighborhood search to determine connectivity.
By default, the shortest path algorithm will find shortest paths between connected particles and the nearest destination object and simply set the particles’ targets accordingly. However, if you connect the output of a Grow operator to another event, each path that is found will be output to the other event as a full chain of new particles. In other words, if you don’t connect the Grow operator to another event, no new particles will be born and existing particles will just have their target values modified…but if you connect the Grow operator to another event, each path will be converted into a new chain of spawned particles. The latter result makes it possible to convert all paths into individual splines using a Spline Paths operator in the output event (in target mode, using the target assignments from the Grow operator to determine spline connectivity).
When converting shortest paths into splines, make sure to assign the path index channel to the appropriate Spline Paths operator’s clustering channel value. This will allow the tySplines object connected to the Spline Paths operator to better recognize which particles should be welded together, if welding is enabled in the tySplines object.
Radius: the maximum distance between particles in order for them to be considered connected by the algorithm.
Max neighbor: the maximum number of connected neighbors a particle may have.
Expand search if radius too small: when enabled, a particle with no neighbors within its search radius will connect itself to the nearest particle regardless of distance. This ensures that all particles have a least one connection (if the total number of particles is greater than one).
Distance heuristic: controls which distance-measuring heuristic will be used during the shortest path search. Euclidean is the most accurate. Euclidean squared is often faster than Euclidean but can produce longer paths when a lot of concave areas exist in the connectivity graph. Manhattan favors paths which follow cardinal directions.
Target channel: when paths are formed from particle-to-particle, successive targets values will be assigned to this channel which can be used later to retrieve the paths (for example, by creating splines using a Spline Paths operator set to target mode).
Path index channel: particles belonging to a path will be assigned a value in this channel which will be unique to that path. These values can be used later to determine which path a particle is a member of, or for cluster welding if the paths are converted to splines in a tySplines object.
Objects: the list of objects that each particle will try to find the shortest path to.
Distane bias: this value will be subtracted from the total distance from each particle to its nearest object. Increasing this value can cause particles to “find” their shortest path sooner (even if their path is not the actual shortest path to the nearest object). For example, if the end point of a path is 20 units away from the nearest object but the distance bias is set to 20, the particle will stop searching for a shorter path, even if one exists.
Exit if inside object: when enabled, particles that are already inside a destination object will not perform a shortest path search.
Exit if existing path found: when enabled, particles that reach another particle that is part of an existing path, will adopt the existing path’s endpoint as its own.
Space Colonization
Unlike DLA, the space colonization algorithm requires two types of particles in order to run: seed particles and expansion particles. Seed particles are particles which will give birth to new particles during each iteration of the growth cycle. Expansion particles are particles that are in close proximity to seed particles, and that tell seed particles which direction to grow in. A typical setup using this algorithm involves a birth event that generates the initial seed particles, and a birth event which generates the volume of expansion particles the seed particles should grow towards.
Seed radius: controls the size of seed particles.
Expansion distance: controls the maximum distance allowed between seed particles and expansion particles. Expansion particles further than this value from any seed particles will not affect growth in the current iteration.
Kill distance: controls the maximum distance between expansion particles and seed particles that will cause expansion particles to be deleted after seed particles grow outwards during a growth iteration.
Iterations: the number of times to repeat the algorithm in a single time step.
Max children: the maximum number of children any given seed particle is allowed to grow.
Align rotation: aligns the rotation of particles to the vector between themselves and their parent.
Grow on whole frames only: the growth algorith will only run on whole frames, not sub frames.
Enable filtering by custom float: when enabled, the only particles that will be treated as expansion particles, are those whose custom float data channel value is not equal to 0.
Channel: the custom float data channel to use for filtering.
Simulation groups: controls which particle simulation groups the expansion particles will be derived from.
Set target to seed particle: each new particle will have its target set to the seed particle it was spawned from.
Channel: the custom float data channel to assign the target value to.
Multiplier: the multiplier applied to the scale value new particles inherit from their seed parents.
Forces Rollout
Forces will affect the direction of growths.
Force object list: the list of force objects used to direct the growths.
Influence %: the amount of influence forces will have on growths.
Using the built-in force allows you to apply simple forces to growth particles without having to create force objects in the scene.
X/Y/Z: the direction vector of the built-in force.
Strength: the strength of the built-in force.
Noise Rollout
Objects Rollout
Attraction: the amount of attraction force the scene objects will apply to particles.
Above/Below: controls whether attraction forces will be applied to particles above or below the object’s surface.
The attraction influence extends outwards from nearby objects.
Distance: particles within this distance will be fully affected.
Falloff: the effect on particles beyond the base distance, but within this falloff distance, will diminish according to the inverse-square law.
Follow: the amount of force the scene objects will apply to particles, parallel to the object’s surface.
Above/Below: controls whether follow forces will be applied to particles above or below the object’s surface.
The follow influence extends outwards from nearby objects.
Distance: particles within this distance will be fully affected.
Falloff: the effect on particles beyond the base distance, but within this falloff distance, will diminish according to the inverse-square law.