Based on (1) and (2), if at each time step I consider the first node of each element to located be on the primary X axis, X1,Y1,Z1,θx1,θy1,θz1 will all be zeros and the transformation into the X-direction stiffness matrix is a trivial calculation. We then transform X2,Y2,Z2,θx2,θy2,θz2 to the original rotation matrix.
Therefore, the larger matrix calculation is reduced to the following equations:
Fx1=−a1X2
Fy1=−b1Y2+b2θz2
Fz1=−b1Z2+b2θy2
Mx1=−a2θx2
My1=b2Z2+b3θy2
Mz1=−b2Y2+b3θz2
Fx2=−Fx1
Fy2=−Fy1
Fz2=−Fz1
Mx2=a2θx2
My2=b2Z2+2b3θy2
Mz2=−b2Y2+2b3θz2
Then the forces on each node is calculated as follows:
Ft=b=1∑b=nFb
Mt=b=1∑b=nMb
Damping
"damping must be included at the local interaction between voxels, not just applying a force
proportional to each voxel’s global velocity which would also damp rigid body motion. The local damping between adjacent voxels ensures that modal resonances at the scale of a single voxel do not accumulate.".
For each edge, first the average position, velocity, and angular velocity are calculated. The
velocity of the second voxel relative to the first:
V2→1=(V2−Va)+(D2−Da)∗ωa
V2 is the velocity of the second voxel, Va is the average velocity of two voxels, D2 is the position of the second voxel, Dais the average position, ωa is the average angular velocity.
For each voxel we calculate the damping force as
Fd=2ξmkVr
Fd is the damping force, m is the mass attached to a edge with stiffness k and a relative velocity Vr. The damping ratio ξ is normally selected to be 1, corresponding to critical damping.
The angular velocities are calculated as follows:
Md=2ξIkϕωr
Md is the damping force with rotational inertia I, with edge of stiffness k and relative angular velocity ωr, rotational angular ratio ξ is also 1.
Timestep calculation
dt<2πω0m1
ω0m is the maximum natural frequency of any bond, which is calculated as follows:
ω0max=mmkb
kb is stiffness of the bond, mm is the minimum of either mass connected to the bond.
Collision and Friction
The effective normal stiffness on the floor is limited by the maximum stiffness between any connected masses.
Therefore, according to (1) I set the stiffness of each
voxel contacting the floor as the the stiffness of the floor in that location. Although this allows significant floor penetration in some cases, the qualitative behavior
is appropriate.
A Couloumb friction model is used, even though a standard linear model is would provide a relatively realistic
simulation.
The voxel will resist motion until:
∣Fl∣>μsfn
Fl is the horizontal force parallel to the ground, μs is the coefficient of static friction between the voxel and ground, and Fn is the normal force pressing te voxel into the plane of the ground.
"A boolean flag is set indicating to the simulation that this voxel should not move laterally, but can still move in the direction normal to ground such that it can be unweighted and then moved laterally".
"Once the static friction threshold has been exceeded at any given time step, the voxel is allowed to begin motion in the appropriate lateral direction by clearing the boolean static friction flag".
The voxel is allowed to move in any direction, but a friction force is applied in the opposing lateral direction
∣Fl∣=μdfn
μd is the dynamic coefficient of friction.
"In order to properly detect when a voxel has stopped lateral motion, a minimum motion threshold must be set".
In order to detect a stopping voxel, the voxel is halted when:
Vl≤mfnμddt
"Collisions are also damped normal to the direction of contact with a user variable damping ratio ranging from zero (no damping) to 1 (critical damping)".