# Differential Growth (Blender Geometry-Nodes)

Blender geometry-nodes setup for differential-growth simulation.

Use the *differential_growth *group to run the simulation on a provided input curve object.

This setup has been tested with Blender >=3.6.

For any inquiries or feedback, feel free to reach out on Twitter.

Check here for an introduction to the algorithm.

### Summary of parameters

- Speed: strength of the shift applied to points at each frame. Higher values will result in a "faster" simulation, but less accurate results and more chances of collisions/overlap.
- Visibility Radius: max distance for points to affect each others.
- Resample Length: resample length for the curve.
- Attraction: attraction parameters work only when a non-empty attractor collection is provided. The points will be attracted to surfaces closer than the given max distance, based on the factor value.
- Repulsion: repulsion works against other points of the curve and any other object in the container collection (if provided). The curve will be pushed away from points closer than the given max distance, based on the factor value.
- 3D Growth: whether to run growth on all three axes.
- Keep Old States: keep results from previous iterations.
- Keep Old States - Frame Skip: how many frames to skip. 0 means keep all frames.
- Sample Last State Only: if true repulsion works only on the last frame (relevant only if Keep Old States is True).
- Profile Curve Radius: If 0 just output a curve, otherwise applies curve to mesh with this radius.
- Container Collection: If provided, objects that will act as barrier/boundary (relevant for repulsion parameters).
- Attractor Collection: If provided, objects that will act as attractors (relevant for attraction parameters).
- Container/Attractor Points Density (x100): higher values make for more accurate interactions.

Lower *Visibility Radius* causes more detailed growth, as it consider a smaller portion of neighbors points to adjust the growth, reducing in fact the overall smoothness of the curve. Detailed growth also required a *Resample Length* fit for the scale of the simulation you are running. *Visibility Radius* should be greater than the *Resample Length*, otherwise the curve won't be affected much or collapse.

If the simulation gets too heavy, try reducing the *Resample Length*.

### Technical Considerations

For the point-position-optimization step of the algorithm, currently the simulation doesn't include attraction updates based on connected neighbors. This because geometry-nodes doesn't yet provide an easy way to get neighbors. Similarly, repulsion is achieved by first using "Merge by Distance" based on the *Visibility Radius*, and then applying the repulsion force. We also apply a blur pass of the offset.

For the adaptive-subdivision step of the algorithm, we simply rely on the "Resample Curve" node. More sophisticated methods could take into account space crowdness or angle between points.