PhysicsScene#

A simulation scene. Discovered by prim type, not by schema, and not Xformable, so it carries no transform columns. The producer never synthesizes a scene; the consumer does, in memory, when a whole-stage scan finds none. PhysX tuning lives on the separate PhysxSceneAPI component (not yet written).

What USD population writes#

Published whenever the prim type is PhysicsScene, regardless of applied APIs. Every declared property of PhysicsScene and of its applied APIs is published at its resolved value. The producer additionally rewrites the two gravity columns when unauthored and creates physxScene:frictionOffsetThreshold = 0.04 / metersPerUnit and physxScene:frictionCorrelationDistance = 0.025 / metersPerUnit when unauthored, even without PhysxSceneAPI applied.

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

physics:gravityDirection

float32[3], VECTOR

none

(0, 0, 0)

when unauthored: (0, -1, 0) if upAxis == 'Y' else (0, 0, -1)

(0, 0, -1) diverges

Negative Z on the consumer, regardless of the stage up axis. Writing (0, 0, 0) literally yields zero gravity. Write the resolved direction.

physics:gravityMagnitude

float32

length/s^2

-inf

when unauthored: 9.81 / metersPerUnit

9.81 diverges

9.81 unscaled on the consumer, regardless of metersPerUnit. Writing -inf literally yields infinite gravity. Write the resolved magnitude.

Derived values#

  • default_gravity = 9.81 / metersPerUnit. Magnitude the producer writes for an unauthored scene and the consumer uses for its synthetic default scene, along negative up axis. An authored scene with the columns omitted gets neither (see findings).

Interactions#

  • PhysicsRigidBodyAPI: Bodies and shapes join this scene through physics:simulationOwner, or the sole or default scene when the relationship is empty.

  • prim: The consumer’s synthetic default scene is suppressed by any authored PhysicsScene prim and is never created on a scoped scan (explicit scan roots or excludes).

Known divergences#

  • defect (consumer) physics:gravityMagnitude: An authored PhysicsScene with no gravity columns gets the consumer’s unscaled SI defaults (9.81 along -Z) instead of the units- and up-axis-aware values both the producer and the consumer’s synthetic default scene produce. The scene walker copies the columns into a default-constructed SceneInfo and the parser overwrites the units-aware overlay with it. The raw fallbacks (0,0,0) and -inf are also not resolved on the consumer. Masked on producer-populated stages because the producer always resolves them.

  • note (producer) physics:gravityDirection: The producer requirements describe replacing a ZERO direction with negative up axis; the code replaces an UNAUTHORED direction and keeps an authored zero. Documented here as the code behaves.

Notes#

  • newton:gravityEnabled (NewtonSceneAPI family, read on this prim by attribute name, no schema gate): when the column is present and false, physics:gravityMagnitude is forced to 0. Unconditional: an authored physics:gravityMagnitude does not suppress it, and on ovstage presence of the column is the whole gate because every column reads as authored. Absent: gravity applies.

  • newton:timeStepsPerSecond: fallback for physxScene:timeStepsPerSecond, applied only when the PhysX column is absent or out of range (an in-range PhysX value wins). Clamped to [1, UINT_MAX]. On a producer-populated stage with PhysxSceneAPI applied the published 60 counts as authored, so the fallback is unreachable there.

  • PhysxSceneAPI creation without the API: the producer creates physxScene:frictionOffsetThreshold = 0.04 / metersPerUnit and physxScene:frictionCorrelationDistance = 0.025 / metersPerUnit on every PhysicsScene prim when unauthored, whether or not PhysxSceneAPI is applied. The consumer reads them only when PhysxSceneAPI is in usd-schemas; without it the same values come from the units-aware setToDefault, so the result is identical either way.

  • physxScene:envIdInBoundsBitCount is read on this prim without a PhysxSceneAPI gate, but only when the resolved broadphase is GPU (the default when PhysxSceneAPI is absent). -1 is the unset sentinel. See PhysxSceneAPI.