Skip to main content

Rod Actors

Experimental

Rod actors are part of the experimental API. Their API may change in future releases.

Rod actors represent one-dimensional elastic elements for simulating cables, ropes, hair strands, tendons, springs, and other slender deformable structures. They are well-suited for any object whose length is much greater than its cross-sectional dimensions. Their centerline geometry is supplied by a polyline shape.

Formulation

Continuous Model

Rod actors approximate Kirchhoff rods, for which cross-sections are assumed to remain orthogonal to the centerline throughout deformation. This problem is posed on a parametric curve LX\mathcal{L}_\mathbf{X} parameterized by the mapping X(ξ0)\mathbf{X}(\xi^0) from coordinate ξ0R\xi^0\in\mathbb{R} to position XR3\mathbf{X}\in\mathbb{R}^3. The curve LX\mathcal{L}_\mathbf{X} defines the undeformed reference configuration, while the deformed position of X(ξ0)\mathbf{X}(\xi^0) is given by x(ξ0)\mathbf{x}(\xi^0). This can be expressed in terms of a displacement field u=xX\mathbf{u} = \mathbf{x} - \mathbf{X}. The geometry of the curve alone cannot express torsion, which is important to the dynamics of the rod. It is augmented with a field of frame axes, E1(ξ0)\mathbf{E}_1(\xi^0), which are orthogonal to the tangent E0(ξ0)=X(ξ0)\mathbf{E}_0(\xi^0) = \mathbf{X}'(\xi^0) and deform to e1(ξ0)\mathbf{e}_1(\xi^0) that are also unit vectors and orthogonal to e0(ξ0)=x(ξ0)\mathbf{e}_0(\xi^0) = \mathbf{x}'(\xi^0). A third local frame basis vector E2(ξ0)\mathbf{E}_2(\xi^0) is defined by the cross product E2=E0×E1/E0×E12\mathbf{E}_2 = \mathbf{E}_0 \times \mathbf{E}_1 / \Vert \mathbf{E}_0 \times \mathbf{E}_1\Vert_2 and deforms to e2=e0×e1/e0×e12\mathbf{e}_2 = \mathbf{e}_0 \times \mathbf{e}_1 / \Vert\mathbf{e}_0 \times \mathbf{e}_1\Vert_2. The basis vectors E1\mathbf{E}_1 and E2\mathbf{E}_2 define an orthonormal basis of the cross-section, and are assumed to be the principal axes of its geometry, for simplicity, diagonalizing its area moment of inertia tensor. We denote normalized unit tangent basis vectors by E^0=E0/E02\widehat{\mathbf{E}}_0 = \mathbf{E}_0 / \Vert\mathbf{E}_0\Vert_2 and e^0=e0/e02\widehat{\mathbf{e}}_0 = \mathbf{e}_0 / \Vert\mathbf{e}_0\Vert_2.

The kinetic energy of the rod is given by a translational and a rotational contribution:

T=12LX(ρL0u˙22+rL0θ˙2)dX ,T = \frac{1}{2}\int_{\mathcal{L}_\mathbf{X}} \left(\rho_{L0}\left\Vert\dot{\mathbf{u}}\right\Vert_2^2 + r_{L0}\dot{\theta}^2\right) \,d\mathbf{X}~,

where ρL0\rho_{L0} is the mass density per unit reference length, rL0r_{L0} is the cross-section rotational inertia per unit reference length, and

θ˙=e2e˙1\dot{\theta} = \mathbf{e}_2\cdot\dot{\mathbf{e}}_1

is the temporal twist rate. This neglects gyroscopic effects, which are negligible in the thin-rod limit where the Kirchhoff-rod kinematic assumptions are appropriate. Some rod formulations neglect the rotational inertia altogether, treating twist quasi-statically, but including the given inertia term can be helpful to stabilize rods with unconstrained ends and improve conditioning of algebraic problems.

The elastic potential energy can be expressed in terms of a density per unit reference length

U=LXWdX ,U = \int_{\mathcal{L}_\mathbf{X}} W \,d\mathbf{X}~,

where the density can be decomposed into stretching, bending, and twisting terms:

W=Wstretch(ε)+Wbend(κ)+Wtwist(τ) ,W = W_{\text{stretch}}(\varepsilon) + W_{\text{bend}}(\bm{\kappa}) + W_{\text{twist}}(\tau)~,

where ε\varepsilon, κ\bm{\kappa}, and τ\tau are stretching, bending, and twisting strain measures. The stretching strain is the scalar axial component of the Green–Lagrange strain,

ε=12((e02E02)21) .\varepsilon = \frac{1}{2}\left(\left(\frac{\Vert\mathbf{e}_0\Vert_2}{\Vert\mathbf{E}_0\Vert_2}\right)^2 - 1\right)~.

The bending strain is a vector expressing the change in binormal curvature, expressed with respect to the cross-section basis as

κα=beαBEαE022 ,\kappa_\alpha = \frac{\mathbf{b}\cdot\mathbf{e}_\alpha - \mathbf{B}\cdot\mathbf{E}_\alpha}{\Vert\mathbf{E}_0\Vert_2^2}~,

for α{1,2}\alpha\in\{1,2\}, where

B=E0×E0E02 ,b=e0×e0e02\mathbf{B} = \frac{\mathbf{E}_0\times\mathbf{E}_0'}{\Vert\mathbf{E}_0\Vert_2}~,\qquad \mathbf{b} = \frac{\mathbf{e}_0\times\mathbf{e}_0'}{\Vert\mathbf{e}_0\Vert_2}

are the reference and current scaled binormal-curvature vectors. The twisting strain is the scalar

τ=e2e1E2E1E02 .\tau = \frac{\mathbf{e}_2\cdot\mathbf{e}_1' - \mathbf{E}_2\cdot\mathbf{E}_1'}{\Vert\mathbf{E}_0\Vert_2}~.

In terms of these strain measures, the energy density terms are then

Wstretch=12kaε2 ,Wbend=12(kb1κ12+kb2κ22) ,Wtwist=12ktτ2 ,W_\text{stretch} = \frac{1}{2}k_a\varepsilon^2~,\qquad W_\text{bend} = \frac{1}{2}\left(k_{b1}\kappa_1^2 + k_{b2}\kappa_2^2\right)~,\qquad W_\text{twist} = \frac{1}{2}k_t\tau^2~,

defining a St. Venant–Kirchhoff-type model for rod deformation.

Mass and stiffness dissipation are given by the dissipation potential

R=LX(αR12(ρL0u˙22+rL0θ˙2)+βR(Wstretch(ε˙)+Wbend(κ˙)+Wtwist(τ˙)))dX ,R = \int_{\mathcal{L}_\mathbf{X}} \left(\alpha_R\frac{1}{2}\left(\rho_{L0}\left\Vert\dot{\mathbf{u}}\right\Vert_2^2 + r_{L0}\dot{\theta}^2\right) + \beta_R\left(W_\text{stretch}(\dot{\varepsilon}) + W_\text{bend}(\dot{\bm{\kappa}}) + W_\text{twist}(\dot{\tau})\right)\right)\,d\mathbf{X}~,

where αR\alpha_R and βR\beta_R are mass and stiffness dissipation coefficients. This potential is the natural rod generalization of the soft-actor dissipation model.

Linearized Increments

The configuration space (x(ξ0),e1(ξ0))(\mathbf{x}(\xi^0),\mathbf{e}_1(\xi^0)) is a nonlinear manifold. The tangent space can be parameterized by (Δu(ξ0),Δθ(ξ0))(\Delta\mathbf{u}(\xi^0),\Delta\theta(\xi^0)), where Δu\Delta\mathbf{u} is a displacement increment and Δθ\Delta\theta is a scalar twist angle increment. SuperDex Physics formulates variations of the energy with respect to this tangent space and solves for solution increments there, which are applied to the configuration manifold by a retraction map that adds the displacement Δu\Delta\mathbf{u} to the centerline and updates directors by composing the minimum rotation pushing the tangent forward (parallel transport) with a scalar rotation by Δθ\Delta\theta about the tangent. (The parallel transport and scalar rotation commute when the scalar rotation is about the appropriate tangent, and can be done in either order.)

Parameter Selection

The parameters ρL0\rho_{L0}, rL0r_{L0}, kak_a, kb1k_{b1}, kb2k_{b2}, and ktk_t can represent general rod responses and need not correspond to a homogeneous three-dimensional material. In the special case of a rod made of a homogeneous isotropic material with Young's modulus EE, shear modulus GG, and mass density per unit reference volume ρ0\rho_0, they can be calculated from the cross-sectional area AA, principal area moments of inertia I1I_1 and I2I_2, polar area moment of inertia J=I1+I2J = I_1 + I_2, and torsion constant JtJ_t:

ρL0=ρ0A ,rL0=ρ0J ,ka=EA ,kb1=EI1 ,kb2=EI2 ,kt=GJt .\rho_{L0} = \rho_0 A~, \qquad r_{L0} = \rho_0 J~, \qquad k_a = EA~, \qquad k_{b1} = EI_1~, \qquad k_{b2} = EI_2~, \qquad k_t = GJ_t~.

For circular cross-sections, Jt=JJ_t = J; for general cross-sections, the torsion constant differs from the polar area moment of inertia. It can be derived by solving for a Prandtl stress function, but values for common shapes are tabulated in engineering handbooks.

Cross-Section Formulas for Circular Rods

For the common case of a rod with a circular cross-section of radius rr:

QuantityFormula
Area AAπr2\pi r^2
Polar area moment of inertia JJ12πr4\frac{1}{2} \pi r^4
Second area moment of inertia II14πr4\frac{1}{4} \pi r^4
Torsion constant JtJ_t12πr4\frac{1}{2} \pi r^4

The stiffness-dissipation coefficient βR\beta_R can be taken directly from a three-dimensional material, while the mass-dissipation coefficient αR\alpha_R can be tuned empirically to model effects such as drag from the surrounding medium.

Discretization

The reference centerline is discretized as a polyline with nodes Xi\mathbf{X}_i, deformed positions xi\mathbf{x}_i, and one material frame per edge. Let

Ei=Xi+1Xi ,ei=xi+1xi ,Li=Ei2 ,li=ei2 .\mathbf{E}_i = \mathbf{X}_{i+1} - \mathbf{X}_i~, \qquad \mathbf{e}_i = \mathbf{x}_{i+1} - \mathbf{x}_i~, \qquad L_i = \Vert\mathbf{E}_i\Vert_2~, \qquad l_i = \Vert\mathbf{e}_i\Vert_2~.

The first reference and current directors on edge ii are denoted by Ai\mathbf{A}_i and ai\mathbf{a}_i, respectively; these are the discrete counterparts of the continuous fields E1\mathbf{E}_1 and e1\mathbf{e}_1. The displacement is interpolated linearly, giving the constant axial strain εi=12((li/Li)21)\varepsilon_i = \frac{1}{2}((l_i/L_i)^2 - 1) on each edge. Translational mass is lumped to the nodes, while rotational inertia and the scalar twist degrees of freedom are associated with the edge frames.

Bending and twisting are evaluated at each interior vertex using its two adjacent edges. Define the reference and current dual lengths Li=(Li1+Li)/2\overline{L}_i = (L_{i-1}+L_i)/2 and li=(li1+li)/2\overline{l}_i = (l_{i-1}+l_i)/2, and the integrated curvature binormal function from Bergou et al. (2008)

k(t^0,t^1)=2t^0×t^11+t^0t^1\overline{\mathbf{k}}(\widehat{\mathbf{t}}_0,\widehat{\mathbf{t}}_1) = \frac{2\widehat{\mathbf{t}}_0\times\widehat{\mathbf{t}}_1}{1+\widehat{\mathbf{t}}_0\cdot\widehat{\mathbf{t}}_1}

operating on two unit vectors t^0\widehat{\mathbf{t}}_0 and t^1\widehat{\mathbf{t}}_1. The discrete counterparts of the scaled binormal curvatures in the continuous model are

Bih=1Lik(E^i1,E^i) ,bih=liLi2k(e^i1,e^i) .\mathbf{B}_i^h = \frac{1}{\overline{L}_i}\overline{\mathbf{k}}(\widehat{\mathbf{E}}_{i-1},\widehat{\mathbf{E}}_i)~, \qquad \mathbf{b}_i^h = \frac{\overline{l}_i}{\overline{L}_i^2}\overline{\mathbf{k}}(\widehat{\mathbf{e}}_{i-1},\widehat{\mathbf{e}}_i)~.

The adjacent edge frames are minimum-rotation transported to the averaged vertex tangent and averaged there to obtain the vertex directors Eαih\mathbf{E}_{\alpha i}^h and eαih\mathbf{e}_{\alpha i}^h. The bending strains are then

καih=biheαihBihEαih ,α{1,2} .\kappa_{\alpha i}^h = \mathbf{b}_i^h\cdot\mathbf{e}_{\alpha i}^h - \mathbf{B}_i^h\cdot\mathbf{E}_{\alpha i}^h~, \qquad \alpha\in\{1,2\}~.

For twist, let ai1i\mathbf{a}_{i-1}^{\to i} and aii\mathbf{a}_i^{\to i} denote the adjacent first directors transported to the averaged current tangent e^ih\widehat{\mathbf{e}}_i^h, with reference counterparts Ai1i\mathbf{A}_{i-1}^{\to i}, Aii\mathbf{A}_i^{\to i}, and E^ih\widehat{\mathbf{E}}_i^h. The discrete twist strain is

τih=1Li(k(ai1i,aii)e^ihk(Ai1i,Aii)E^ih) .\tau_i^h = \frac{1}{\overline{L}_i}\left( \overline{\mathbf{k}}(\mathbf{a}_{i-1}^{\to i},\mathbf{a}_i^{\to i})\cdot\widehat{\mathbf{e}}_i^h - \overline{\mathbf{k}}(\mathbf{A}_{i-1}^{\to i},\mathbf{A}_i^{\to i})\cdot\widehat{\mathbf{E}}_i^h \right)~.

The continuous energies are integrated by multiplying the edge stretching density by LiL_i and the vertex bending and twisting densities by Li\overline{L}_i. Because k\overline{\mathbf{k}} diverges as its arguments approach opposite directions, the bending energy forms a barrier against folding the centerline through 180180^\circ, and the twisting energy similarly forms a barrier against 180180^\circ relative twist between adjacent frames. The implementation regularizes the denominator at finite precision.

Parameters Reference

Pass RodActorParams to the experimental free function CreateRodActor / create_rod_actor; unlike standard actor types, rods are not created through a Scene method.

RodActorParams

ParameterTypeDefaultDescription
nameDynamicString""Actor name for identification.
layerDynamicString""Contact layer name.
worldFromLocalTransformRTIdentityTransform from local (shape) space to world space.
shapeShapeHandle--Polyline shape defining the rod centerline. Required.
contactContactParamsDefaultContact properties.
contactElementTypeActorSegmentElementTypeDefault (P1Q3)Contact sampling along centerline segments.
materialRodMaterialParamsDefaultMaterial properties (see below).
colliderTypeColliderTypeNonePointCloud or Auto enables a point-cloud collider.
pointCloudColliderPointCloudColliderParamsDefaultPoint-cloud collider parameters shared with shell actors.
hasGravitybooltrueWhether the rod is affected by scene gravity.
useVisualMeshContactboolfalseSamples contact on the visual mesh instead of the centerline.
visualMeshContactElementTypeActorBoundaryElementTypeDefaultContact sampling on the visual mesh.

RodMaterialParams

See Parameter Selection for formulas relating these parameters to homogeneous three-dimensional materials.

ParameterTypeDefaultUnitsDescription
linearDensityreal1e-1kg/mMass per unit undeformed length ρL0\rho_{L0}.
linearRotationalInertiareal1e-6kg·mRotational inertia about the rod axis per unit length rL0r_{L0}.
axialStiffnessreal1e2NAxial stiffness kak_a.
torsionalStiffnessreal5e-4N·m²Torsional stiffness ktk_t.
flexuralStiffnessReal2[5e-4, 5e-4]N·m²Flexural stiffnesses [kb1,kb2][k_{b1}, k_{b2}] about the two principal axes.
massDampingCoefficientreal01/sMass-proportional damping coefficient αR\alpha_R.
stiffnessDampingCoefficientreal0sStiffness-proportional damping coefficient βR\beta_R.

Contact

By default, a rod's colliding samples lie along its centerline. For rods with an embedded triangular visual mesh, useVisualMeshContact instead places those samples on that surface and transmits contact forces to the rod DoFs through the skinning Jacobian. This mode requires a shape with both a visual mesh and embedding data.

Rods have no collider by default. Set colliderType to PointCloud or Auto to enable a point-cloud collider, whose collider integral is taken over the centerline. See Contact Roles for the distinction between colliding samples and colliders.

Examples

  • Mass on Rod Spring: hangs a rigid mass from a helical spring, exercising curved reference geometry and bend-twist coupling, and derives constraint stiffnesses from the rod's own stiffness coefficients by dimensional analysis.
    • Python example — examples/example_mass_on_rod_spring.py
  • Choosing a Tendon Model: compares a contact-routed rod tendon with reduced spatial-tendon and linear-transmission models, including tubular visual-mesh contact and rod endpoint constraints.
    • Python example — examples/example_tendon_comparison.py
  • Shapes — How to create and load polyline shapes for rod actors.
  • Soft Actors — Volumetric deformable bodies (3D counterpart to 1D rods).
  • Solvers — Newton solver, linear solvers, and line search methods used to integrate the rod dynamics.
  • Constraints — Constraint types available for coupling rods with other actors.
  • Transmissions — Reduced scalar models for tendon routing and actuation.

References

  • M. Bergou, M. Wardetzky, S. Robinson, B. Audoly, and E. Grinspun, Discrete Elastic Rods, ACM SIGGRAPH 2008 Papers, Article 63, 2008.