Imageable

The Imageable schema is the base class for all prims that can be rendered or displayed in a 3D scene. It provides common properties for controlling visibility and purpose, which determine how geometry should be included in rendering and other computations.

Visibility Control

Imageable’s visibility attribute can be used to manage which prims are visible in renders and viewports. Visibility can be animated, allowing geometry to
appear or disappear over time. Visibility is strongly inherited down the namespace.

This example uses the visibility attribute to control prim visibility, which changes over time based on TimeSamples.

#usda 1.0
(
    startTimeCode = 1
    endTimeCode = 48
    timeCodesPerSecond = 24
)
def Plane "AnimatedVisibility"
{
    token visibility.timeSamples = {
        0: "inherited",
        24: "invisible",
        48: "inherited"
    }
}

See also Using the Visibility Attribute.

Purpose Classification

Imageable provides the purpose attribute used for organizing geometry into imageable purpose categories (render, proxy, guide, default), which can be used to filter and in some workflows optimize renderer output. Purpose can also be used to link high-detail render geometry to lightweight proxy representations.

Purpose is inherited down the scene namespace. If a prim is not imageable or does not have an authored opinion about its own purpose, then it will inherit the purpose of the closest imageable ancestor with an authored purpose opinion.

See also Using Imageable Purpose.

Purpose Examples

Guide Geometry

The following example sets the imageable purpose of a Sphere to “guide”. The usdview screenshot shows the Sphere rendered when “guide” purpose is enabled in the UI.

#usda 1.0

def Sphere "GuideSphere"
{
    double radius = 3.0
    float3[] extent = [(-3, -3, -3), (3, 3, 3)]
    token purpose = "guide"  
    color3f[] primvars:displayColor = [(1.0, 0.0, 0.0)] (
        interpolation = "constant"
    )
}
A guide sphere in usdview

Proxy representation

This example uses the proxyPrim relationship and imageable purpose to specify proxy geometry to use for a Mesh.

#usda 1.0

def Mesh "HighDetailMesh"
{
    token purpose = "render"
    rel proxyPrim = </ProxySphere>
    # ... mesh data ...
}

def Sphere "ProxySphere"
{
    token purpose = "proxy"
    double radius = 1.0
}

See also Using Purpose for Stand-in Data, and Working with Primitives and Meshes for an additional example using the proxy purpose.

Purpose Inherited Down the Namespace

In the following example, /Parent is imageable and has an authored imageable purpose of “render”. /Parent/Child1 is also imageable and has an authored purpose of “proxy”. /Parent/Child2 is also imageable but has no authored purpose, so its effective purpose is “render”, inherited from the authored purpose of /Parent.

#usda 1.0

def Xform "Parent"
{
    token purpose = "render"

    def Xform "Child1"
    {
        token purpose = "proxy"
    }

    def Xform "Child2"
    {
        # imageable but no purpose authored, inherits parent purpose
    }
}

See also Purpose Inheritance.

Imageable Best Practices

  1. Visibility:

    • Use “inherited” for normal visibility behavior, and “invisible” to hide prims and their children.

    • Remember that invisible prims are still active and available for inspection and authoring.

    • Remember that visibility is strongly inherited down the namespace, so child prims of a prim set as invisible cannot be switched to visible

  2. Purpose:

    • Use “default” for general-purpose geometry

    • Use “render” for final quality geometry

    • Use “proxy” for lightweight interactive representations

    • Use “guide” for helper/visualization geometry

    • Understand how purpose is inherited down the namespace

  3. Proxy Relationships:

    • Only create proxyPrim relationships on prims with purpose="render"

    • Use proxyPrim to link render geometry to its proxy representation

  4. Performance:

    • Use purpose filtering to optimize rendering performance for particular workflows

    • Consider using proxy representations for complex scenes

Properties

proxyPrim

USD type: rel (relationship)

The proxyPrim relationship allows linking a prim whose purpose is “render” to its (single target) purpose="proxy" prim. This is useful for providing a less complex proxy geometry representation of a prim optimized for interactive renders.

Typically you would author proxyPrim for prims whose purpose is “render”, although this is not required for render and proxy prims to draw properly in the appropriate circumstances. Rather, it is for users and DCC’s to reason more easily about the different representations.

See also Using Purpose for Stand-in Data.

purpose

USD type: token

Fallback value: default

Purpose classifies geometry into categories that can each be independently included or excluded from different operations, such as rendering or bounding-box computation.

Allowed values:

  • “default”: No special purpose, included in all traversals. This is the fallback value if a purpose has not been authored.

  • “render”: For final quality renders.

  • “proxy”: For lightweight interactive renders. For example, the prim might be a lower-complexity representation of a mesh for rendering in a DCC tool.

  • “guide”: For helper/visualization geometry. For example, the prim might be a spline used as a visual aid in a rigging tool.

Purpose is inherited down the scene namespace. If a prim is not imageable or does not have an authored opinion about its own purpose, then it will inherit the purpose of the closest imageable ancestor with an authored purpose opinion (or use the fallback purpose if no ancestor has an authored purpose).

See also Using Imageable Purpose.

visibility

USD type: token

Fallback value: inherited

Visibility is the simplest way to control whether geometry is shown or hidden. It can be animated, allowing a sub-tree of geometry to appear and disappear over time. Unlike deactivating geometry, invisible geometry is still available for inspection, positioning, and computing against. Note that visibility is strongly inherited down the namespace, so child prims of a prim set as invisible cannot be switched to visible.

Allowed values:

  • “inherited” (the fallback value): Inherits visibility from parent prims

  • “invisible”: Hides the prim and all its children from rendering

See also Using the Visibility Attribute.