PhysxJointAxisAPI#

Per-axis PhysX properties of an articulation joint (armature, maximum joint velocity, static, dynamic and viscous friction), applied as PhysxJointAxisAPI:. Only effective inside an articulation: on a standalone joint the runtime strips the API with a warning. Rotational instances are stored in degrees where the schema says so and the parser converts maxJointVelocity degrees to radians and multiplies viscousFrictionCoefficient by 57.29577951308232.

  • Applies to: PhysicsJoint

  • Multi-apply: applied as PhysxJointAxisAPI:<instance>; <inst> in a column name is the instance. Instances: angular, linear, rotX, rotY, rotZ.

  • Read only when listed in usd-schemas.

What USD population writes#

All five declared attributes of every applied instance are published at their resolved values. physxJointAxis::maxJointVelocity is rewritten to FLT_MAX when unauthored for each applied instance.

Columns#

Raw fallback is the USD schema value. Producer writes is what ovstage population puts in the column for a USD stage. Parser default applies on the consumer when the column is absent, in stage units. diverges means writing the raw fallback literally parses differently from omitting the column (the parser default): USD population may well publish that very value for an unauthored attribute, so the marker is about the column being present, not about its value.

Column

Type

Units

Raw fallback

Producer writes

Parser default

If absent

physxJointAxis:<inst>:armature

float32

linear/transX..Z: mass; angular/rotX..Z: mass*length^2

0.0

resolved USD value (authored, else raw fallback)

0.0

The joint-level physxJoint:armature (or 0) survives on this axis. Because 0 is both the schema fallback and a legal authored value and the authored bit is unavailable on ovstage, only a strictly positive per-axis value displaces the seed.

physxJointAxis:<inst>:maxJointVelocity

float32

linear: length/s; angular/rotX..Z: deg/s (deg_to_rad)

inf

when unauthored: FLT_MAX

FLT_MAX

The joint-level physxJoint:maxJointVelocity, then newton:velocityLimit, then FLT_MAX survive on this axis. A value >= FLT_MAX counts as unauthored.

physxJointAxis:<inst>:staticFrictionEffort

float32

linear: force; angular: torque

0.0

resolved USD value (authored, else raw fallback)

0.0

No static friction on this axis.

physxJointAxis:<inst>:dynamicFrictionEffort

float32

linear: force; angular: torque

0.0

resolved USD value (authored, else raw fallback)

0.0

No Coulomb friction on this axis.

physxJointAxis:<inst>:viscousFrictionCoefficient

float32

linear: forces/length; angular: torques/deg

0.0

resolved USD value (authored, else raw fallback)

0.0

No viscous friction on this axis.

Interactions#

  • PhysxJointAPI: physxJoint:armature and physxJoint:maxJointVelocity are the seeds this API overrides per axis; the joint-level armature is read even when no instance is applied.

  • PhysicsJoint: On a standalone joint every applied instance is removed from the prim with a ‘supported only for joints that are part of an articulation’ warning.

Known divergences#

  • fragile (consumer) physxJointAxis:<inst>:armature: Only a strictly positive per-axis armature displaces the joint-level seed, because 0 is both the fallback and a legal authored value and the authored bit is unavailable on ovstage. Consequence: an explicit per-axis armature of 0 cannot override a non-zero physxJoint:armature. Documented and accepted (ADR-0002 invariant 1).

Notes#

  • Per-joint-type instance matrix: Fixed none; Revolute angular; Prismatic linear (no rotational conversion); Spherical rotX, rotY, rotZ (all three, each with rotational conversions); Distance none; D6 (PhysicsJoint) rotX, rotY, rotZ only, translational axes are never read; Gear, Rack, Custom none.

  • Articulation axis mapping: angular and rotX -> PxArticulationAxis::eTWIST; rotY -> eSWING1; rotZ -> eSWING2; linear -> eX.

  • The D6 descriptor’s jointProperties always has exactly three entries (rotX, rotY, rotZ) even when no instance is applied; unapplied entries carry the joint-level seeds.

  • Unrecognised instance names fall back to a runtime internToken(‘PhysxJointAxisAPI:’ + inst) and are read the same way.