Cone#

Cone geometry along axis. With PhysicsCollisionAPI applied it becomes a PhysX convex-core cone (PxConvexCoreGeometry, PxGeometryType::eCONVEXCORE) with the given radius, height and the free attribute physxConvexGeometry:margin; the runtime setting /collisionApproximateCones (default false) switches it to a pre-cooked convex mesh (eCONVEXMESH) that ignores the margin. Scaling follows the capsule rule.

What USD population writes#

Geometry attributes of a Gprim are published only from the curated list (size, radius, height, axis, points, faceVertexIndices, faceVertexCounts, holeIndices, orientation, doubleSided) and only when the prim carries a shape-consuming API such as PhysicsCollisionAPI. For a Cone that is radius, height and axis. extent and normals are never published. The producer additionally derives physxConvexGeometry:margin = 0.0 on Cylinder and Cone colliders when the free attribute is unauthored. A Cone without a shape API gets a row only as an ancestor or relationship target, with no geometry.

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

radius

float64

length

1.0

resolved USD value (authored, else raw fallback)

1.0

Radius 1.0 (times the larger perpendicular world-scale component). The consumer seeds the UsdGeomCone fallback 1.0, which is also what the producer publishes for an unauthored attribute, so omitting the column is equivalent to USD population.

height

float64

length

2.0

resolved USD value (authored, else raw fallback)

2.0

Half height 1.0 (times the long-axis world-scale component). The consumer seeds the UsdGeomCone fallback 2.0, which is also what the producer publishes for an unauthored attribute, so omitting the column is equivalent to USD population.

axis

uint64, TOKEN_ID

none

Z

resolved USD value (authored, else raw fallback)

Z

Z. Only the tokens X and Y select another axis; an absent column, an invalid token id or any unrecognised token (including the literal Z) resolves to Z. The consumer reads the token id, never the string.

physxConvexGeometry:margin

float32

length

when unauthored: 0.0 (column created even without the API)

0.0

0.0 (no margin) from the ConePhysxShapeDesc constructor. The read is gated on hasAuthoredAttribute, which is unconditionally true on ovstage, so any published value is taken; negative values are clamped to 0.

Derived values#

  • half_height = abs((height * 0.5) * worldScale[axis]). Same rule as Capsule: height / 2 times the world-scale component along axis, then fabs.

  • radius = abs(radius * max(abs(worldScale[perp0]), abs(worldScale[perp1]))). Same rule as Capsule: radius times the larger absolute perpendicular world-scale component, then fabs.

Interactions#

  • PhysicsCollisionAPI: Geometry is read only when the collision API is applied to this prim (or to a parent Xform that descends one level to this analytic child). extent is never read and never published.

Notes#

  • PhysX geometry kind depends on a runtime setting, not on the stage: /collisionApproximateCones defaults to false in PhysXSettings.cpp, giving PxConvexCoreGeometry(PxConvexCore::Cone(height, radius), margin) (eCONVEXCORE). When true the shape is a PxConvexMeshGeometry built from a shared unit cone convex mesh scaled by (halfHeight, radius) (eCONVEXMESH) and the margin is ignored.

  • Type dispatch is by exact prim-type string on the geometry backing key, in the order Plane, custom-geometry token, Cube, Sphere, Capsule, Cylinder, Cone, Mesh.