03-09-2026, 04:50 PM
(This post was last modified: 03-09-2026, 04:52 PM by josemendez.)
Hi!
The value you get is that of the last step. In general, this can't be adjusted for the number of substeps, since each substep is an entirely indepedent integration/constraint evaluation cycle. See below for the reason why its designed this way (*).
No, each substep is its own independent solve so to speak.
(*)The way contacts against rigidbodies work is that both particle and rigidbody state are linearly extrapolated to end of the frame (that is, across multiple substeps) and the contact constraint solved there. The resulting impulse is divided by the amount of remaining substeps. The reason for this is that the rigidbody engine and the particle engine are updated at different timesteps/frequencies (rigidbody simulation in unity doesn't have substepping), so this is effectively a partitioned multirrate simulation.
As a consequence, the value you get for the last substep multiplied by the amount of substeps is often an acceptably good approximation of the force over the entire step, though it is often an underestimation.
This is precisely right: each substep uses only the normal impulse calculated for the current substep, which is smaller the more substeps you have as a result of the method explained above.
No, it works the same way in the latest version (7.2) and still does in upcoming versions (8).
If you're looking for accurate values, skip substepping entirely (only 1 substep) and divide your project's current timestep size by the amount of substeps you were using. Eg. if you were using 4 substeps and timestep = 0.02, use 1 substep and timestep = 0.02/4 = 0.05. This way particles and rigidbodies update at the exact same frequency, which is more accurate - but also a lot heavier in terms of performance.
Kind regards,
(03-09-2026, 08:13 AM)nakai Wrote: 1. In Obi 6.5.4, does normalImpulse require a correction that accounts for the number of remaining substeps?
The value you get is that of the last step. In general, this can't be adjusted for the number of substeps, since each substep is an entirely indepedent integration/constraint evaluation cycle. See below for the reason why its designed this way (*).
(03-09-2026, 08:13 AM)nakai Wrote: 2. In the Burst backend, can the friction limit used by the simulation depend on the number of substeps?
No, each substep is its own independent solve so to speak.
(03-09-2026, 08:13 AM)nakai Wrote: 3. Is converting each substep’s change in the normal Lagrange multiplier using its corresponding remaining interval, accumulating the resulting normal impulses, and using them for the Coulomb friction limit consistent with the intended solver implementation?
(*)The way contacts against rigidbodies work is that both particle and rigidbody state are linearly extrapolated to end of the frame (that is, across multiple substeps) and the contact constraint solved there. The resulting impulse is divided by the amount of remaining substeps. The reason for this is that the rigidbody engine and the particle engine are updated at different timesteps/frequencies (rigidbody simulation in unity doesn't have substepping), so this is effectively a partitioned multirrate simulation.
As a consequence, the value you get for the last substep multiplied by the amount of substeps is often an acceptably good approximation of the force over the entire step, though it is often an underestimation.
Code:
This suggests that the normal impulse used to calculate the Coulomb friction limit may be underestimated when multiple substeps are used.This is precisely right: each substep uses only the normal impulse calculated for the current substep, which is smaller the more substeps you have as a result of the method explained above.
(03-09-2026, 08:13 AM)nakai Wrote: 4. Has this behavior been changed in newer versions of Obi?
No, it works the same way in the latest version (7.2) and still does in upcoming versions (8).
If you're looking for accurate values, skip substepping entirely (only 1 substep) and divide your project's current timestep size by the amount of substeps you were using. Eg. if you were using 4 substeps and timestep = 0.02, use 1 substep and timestep = 0.02/4 = 0.05. This way particles and rigidbodies update at the exact same frequency, which is more accurate - but also a lot heavier in terms of performance.
Kind regards,

