The ObiSolver component is arguably the most important component in Obi. It is responsible for simulating particle physics and enforcing constraints. Three important things to remember about ObiSolver:
ObiSolver allocates memory for a particle pool, from which ObiActors will borrow particles when needed. This is the size of the pool, and thus the maximum amount of particles simulated by this solver. So for instance, if you have 5000 particles in the pool, and your actors consume 1000 particles each, you can have a maximum of 5 actors simulated by this solver.
How many times will Obi be updated each physics step. The solver will subdivide each Unity physics step into multiple smaller substeps, increasing the accuracy of the solution. Increasing this value will result in more accurate simulations, but will adversely affect performance. A value of 1 should generally be used, resorting to 2,3,4 or higher if more accuracy is desired.
If you're using FixedUpdate simulation order, increasing the amount of substeps is equivalent to reducing Unity's fixed timestep (see Time Manager). For instance, a fixed timestep of 0.02 and 2 substeps = fixed timestep of 0.01 and 1 substep. However, reducing the timestep will affect both Unity's own physics engine as well as Obi. Using substepping lets you control the accuracy of Obi's simulation and Unity's own physics separately.
Should this solver keep the simulation going when invisible to all cameras? Keep this enabled if your simulation needs to be updated at all times, disable it to improve performance when multiple solvers exist in the scene but they are not visible at all times.
If deactivated, the solver will perform the simulation in world space. This is the default behavior. If you enable this option, the solver will perform its simulation in local space, and each actor will be able to decide how much of the solver's world-space velocity should be applied to its particles. See world/local space for more info.
The solver can perform the simulation at different times during Unity's normal update cycle:
The solver can simulate in 2D or 3D mode. In 2D mode, simulation only happens in the XY plane.
Interpolation mode used to render particles. None is faster to calculate, but Interpolate will give more visually pleasing results.
Direction and magnitude of gravity applied to particles in this solver.
Velocity damping applied to particle velocities. Increase it to reduce particle velocities over time.
Particles in Obi can be ellipsoidal in shape, instead of perfectly spherical. This is used to better adapt their shape to the surface of the object they represent, achieving more accurate collision detection and smoother rendering. Max anistropy lets you determine the maximum ratio between the ellipsoid's radii: a value of 1 will force all particles to be spherical (deactivates anisotropy), values larger than 1 will allow particles to become more ellipsoidal the higher max anisotropy is.
Any particle with a kinetic energy below this value will be freezed in place. This is useful when you don´t want minuscule variations in velocity or force to perturb an actor, making it look like its jittering or moving very slowly. Set it to zero if you want your particles' positions to be affected by any force that acts upon them, however small it may be.
You can globally enable/disable each constraint type for all actors being managed by the solver. Disabling constraints this way (as opposed to disabling constraint components for individual actors) will allow the solver to completely skip any related calculations. This allows you to customize what's being done under the hood and get rid of unnecessary overhead.
ObiSolver exposes 4 parameters for each constraint type:
Are these constraints updated at all? By default all constraint types are enabled, altough this is rarely what you want for production-ready simulations. You should disable any constraints that are not critical for the final look of your simulation.
How many times per substep should these constraints be evaluated? A high iteration count will keep the simulation closer to the ground-truth solution. Keep it low if these constraints aren`t very important for your particular purpose and you want to get better performance. The default is 3.
This tells the solver in which order to evaluate the constraints of this kind. There are two modes:
SOR stands for Successive Over-Relaxation. When trying to satisfy constraints, one way to improve convergence is to “over-relax” the constraints. That is, if moving a particle 2 units to the left would satisfy the constraint for now, why not moving it 3 units? This is exactly what this factor is used for. 1 is the default value, which does not perform over-relaxation at all. 2 is the maximum, which allows you to perform twice as much relaxation on constraints. High values can be used to help speed up convergence in any of the two modes (sequential or parallel), but keep in mind that simulation stability can degrade.