Houdini 18.0 Nodes LOP nodes

SOP Modify

Converts USD geometry into SOP geometry, runs the SOP subnet inside this node on the geometry, and converts the changes back to USD overrides.

On this page


This node can be used for animating transforms based on an RBD simulation, adding primvars or attributes to existing geometry, fracturing geometry, adding instances scattered over an existing surface, and so on.

The top level controls on this node primarily reflect parameters promoted from the contained LOP Import and Unpack USD SOPs, and the SOP Import LOP. You may dive inside this node to edit the SOP network where the source geometry is modified before being brought back into LOPs.

How to

  1. Create a SOP Modify node and wire the previous node into its input.

  2. Decide whether you want to edit/reshape the geometry, or just modify the transforms of the pieces.

    • By default, the incoming geometry in the subnet is a /nodes/lop/packed USD primitive|/model/primitives#usd]. Points in the packed USD primitive represent USD prims, and the point position and standard point instancing attributes represent each prim’s transform. You can modify these to move/rotate/scale the prims without unpacking them. (This is common when working the RBD sims.)

    • If you want to reshape the geometry, in the SOP Modify’s parameters, turn on Unpack USD primitives to polygons.

    • Even if you want to reshape the geometry, you may not want to extract all geometry as polygons. You can leave Unpack USD primitives to polygons off, then use a Unpack USD SOP node in the subnet to only extract a limited set of geometry from the packed USD primitive.

  3. In the network editor, double-click the SOP Modify node to dive inside.

    The output of Sub-Network Input #1 is the SOP geometry to modify.

  4. Wire in nodes to modify the geometry.

  5. At the end of the node chain, add an Output SOP.

  6. In the network editor, press U to go back up to the LOP network.


  • If you are trying to edit the shape of the geometry but SOP nodes don’t seem to affect it, check what type of geometry you have. If you forgot to turn on Unpack USD primitives to polygons, the geometry will be inside a packed USD primitive, which SOP nodes can’t edit.

    Either turn on Unpack USD primitives to polygons on the SOP Modify node, or insert a Unpack USD SOP after Sub-Network Input #1. In the Unpack USD node’s parameters, set Geometry type to "Polygons".

  • If you turn on Unpack USD primitives to polygons or add your own Unpack USD node in the subnet, the unpacked polygons have a usdxform matrix attribute with the local-to-world transform of the USD primitive from which the polygon was unpacked.


Export to SOPs

These parameters control how/what USD geometry is converted to SOPs for editing.


The primitive(s) the node should operate on. You can drag primitives from the scene graph tree pane into this textbox to add their paths, or click the Reselect button beside the text box to select the primitives in the viewer, or ⌃ Ctrl-click the Reselect button to choose prims from a pop-up tree window. You can also use primitive patterns for advanced matching, including matching all prims in a collection (using /path/to/prim.collection:name).

Unpack USD Primitives to Polygons

Convert the packed USD primitive into polygons before sending it through the subnetwork for editing. If you only want to modify the transforms of pieces, you can edit the attribute values on the points in the packed USD primitive. If you want to reshape the imported geometry, you must turn this on (or add a Unpack USD SOP with Geometry type set to "Polygons" at the top of the subnet inside).

Import From SOPs

These parameters control how the modified SOP geometry imported back into USD.

Perform Layer Break Before Import

Adds a Layer Break before importing the geometry back into USD. This is useful when you want to generate a USD layer that contains only edits, to be used as an overlay.

Load As Reference

When this is on, the geometry will be imported as a payload. When this is off, the geometry will be imported by sublayering its hierarchy over the existing scene tree (see sublayers and references).

Copy Contents Into Editable Layer

(When Load as reference is off.) By default, geometry imported from SOPs is treated like geometry imported from a file on disk: you can only edit it by applying stronger opinions on top. If you turn this on, however, this node puts the geometry in the active layer, so it can be modified by LOP nodes connected to this node’s output.

The node does this by copying the contents generated from the SOP geometry into an anonymous in-memory USD layer. This is slower, but provides more options for how many USD layers you need to write to disk, and what goes in each layer. This is similar to the operation of a Load Layer LOP.

Adjust Transforms for Input Hierarchy

(When Load as reference is off.) When this is on (the default), the node automatically compensates for transform problems created if you round-trip geometry from LOPs to SOPs (as packed USD primitives) and then back to LOPs again. If you know you are not round-tripping LOPs → SOP packed USD primitives → LOPs, you can turn this off to make importing faster.

Packed Primitives in SOPs only have a single transform, representing the full local-to-world transformation of the packed geometry. If you export a USD geometry primitive to SOPs as a packed USD primitive, Houdini flattens the full transformation hierarchy under the USD prim into a single transformation matrix.

This creates a problem if you then "round-trip" the SOP packed primitive back into LOPs, as the descendants will have their own transforms, which are also now incorporated into the root prim’s transform imported from SOPs. This results in an incorrect double-application of the transforms.

When this parameter is on (the default), the node examines every transformation imported from SOPs, in the context of the prim’s location in the scene graph hierarchy. If the prim (or its ancestors) already exist on the input stage, the node inverts the transformations of the ancestor prims, and applies them as additional local transformations on the prim. This ensures that the final world space location of the prim in LOPS will be the same as it was in SOPs.

If Copy Contents Into Editable Layer is on, the node applies these additional transforms directly to the imported primitives, otherwise the node creates a new active layer and puts the transforms in the new layer as overrides.

Apply Inverse USD Transform to Unpacked Geometry

If you turn on Unpack USD primitives to polygons or add your own Unpack USD node in the subnet, the unpacked polygons have a usdxform matrix attribute with the local-to-world transform of the USD primitive from which the polygon was unpacked. When this is on, before importing back into USD this node applies the inverse of the usdxform attribute. This ensures the point positions imported back into LOPs do not include the transformations of the USD primitives (which would result in those transforms being double-applied).

Import Group

Turn this on and specify a group name (or a space-separated list of group syntax) to import. If you turn this on but leave the field blank, it imports all geoemtry.

Import Path Prefix

If a prim being imported has an automatically generated name (like mesh_0) because it had no path primitive, or if it has a path primitive but the path is relative (does not start with /), the node automatically prefixes the name/path fragment with this path. This is a way of keeping "un-pathed" prims organized under a single branch. (See how to create geometry hierarchy.)

(The default is /$OS which puts "un-pathed" prims under a root prim with the name of this node.)

Layer Save Path

When this is turned on, set the Save Path metadata for the layer containing the geometry to this file path. When you write out USD using a USD render node, the geometry will be saved out to a .usd layer file using this file path (after output processing).

Primitive Definition

Parameters in this group guide the translation process in terms of how USD primitives are generated from the source SOP geometry.

Packed USD Primitives

What to do with packed USD primitives in the imported SOP geometry.

Overlay Transforms

Import the transformation of the packed USD primitive as an override (Over) prim. This makes it easy to transform the packed USD prims without unpacking them.


Ignore packed USD primitives in the source SOP geometry.

Other Primitives

What to do with regular non-packed primitives (points, curves, polygons, spheres, and so on).


Create the USD prims for the imported geometry if they don’t already exist. This is the standard way to import geometry.


Create the USD prims as overrides. They will only be visiable as changes to any prims that exist at a lower level with the same paths. This may be useful where you only want to import and modify certain attributes from SOPs onto existing USD geometry.

Overlay Transforms

Like "Overlay", but only imports transform data.

Define Only Leaf Primitives

Author intermediate primitives (for example, any Xform prims created for the Import path prefix) as overrides instead of definitions. This means if they don’t match up with underlying prims in lower layers, the leaf prims won’t be added to the scene. This is useful if you only want to import the geometry if its ancestors already exist in the scene tree.

(Note that all of the data is still imported, it just may not be visible in the scene graph tree or the viewport.)

Packed Primitives

What to do with SOP-native packed primitives.

Create Xforms

Only import transform data from the packed primitives.

Create Native Instances

Import the geometry in packed primitives as instanceable references. This imports each piece as a prototype under a Prototypes prim under the Import Path Prefix prim.

Create Point Instancer

Import the geometry in packed primitives as point instanced geometry. This imports each unique piece as a prototype under the point instancer prim.

You can assign a SOP primitive attribute to the packed primitive named usdinstancerpath to specify the USD scene graph path of the instancer.

NURBS Curves

What to do with NURBS curve primitives.

Convert to Basis Curves

Import the curves as a BasisCurves primitive. This only supports cubic curves, but is useful for rendering through Hydra.

Create NURBS Curves

Import the curves as a NurbsCurves primitive. This provides complete round-tripping of NURBS curves, but has limited support for rendering through Hydra.

Kind Authoring

How to assign kinds to imported prims.

All Geometry is One Component

Set root primitives in the imported tree to Component. Do not set kinds on descendants.

Nested Groups and Components

Set leaf primitives in the imported tree to Component. Set branch primitives to Group.

Nested Assembly, Groups, and Components

Set root prims in the imported tree to Assembly. Set intermediate branch prims to Group. Set leaf prims to Component.


Do not set kinds on the imported prims.

Path Attributes

A (comma or space-separated) list of names of SOP primitive string attributes to use to use as prim paths to put the SOP geometry into. The default is path,name. See geometry hierarchy above.

If the list has more than one attribute, the importer checks each attribute for the first non-empty value.

If the string value a full path, that path is used as the USD scene graph path for that primitive. If the string is a relative path (or just a name), the string is appended to the Import Path Prefix string to generate a full scene graph path.

If none of the listed attributes exist on a given SOP primitive, or all values are an empty string, the importer generates a name automatically (for example, sphere_0).

Import Data

These parameters affect the conversion of SOP geometry attributes into USD attributes and primvars, and the choice between default and time sampled value authoring.

Author Time Samples

Whether values imported from SOPs should be authored as default values for the corresponding USD attributes, or as a time sample (at the time in the timeline).

(When the USD system is asked for an attribute value, it returns the default if no time samples exist on the attribute. Otherwise it returns a value interpolated from the time sample data.)

If SOP is Time Dependent

If the SOP node the geometry comes from is time-dependent (is animated or contains animated values), write time samples. Otherwise, write defaults.

If Not Specifically Excluded

Author all values as time samples except for attributes listed in the Single Value Attributes parameter.


Author all values as defaults.

(This is the only parameter on this node you can’t pre-configure on the geometry with the USD Configure SOP. This is because it requires a "live" SOP, not just attribute values embedded in the geometry.)

Topology Attributes

Controls whether USD topology attributes should be authored as time sampled or default values.


If you know that topology is changing in the source geometry over time, choose this option to record topology attributes as time samples in the USD scene graph. Having animated topology can be very expensive during playback, so only use this option when necessary.


Write topology attributes as default values. This can make playback much faster, but limits how the topology can change over time.


Do not author topology attributes.

This is useful when USD data is sent to SOPs for processing, then brought back into LOPs. Using this option tells the importer that the geometry topology has not changed in this process, so only the changing point positions or other primvars will be imported.


A space-separated list of attribute names/patterns specifying which SOP attributes to import into USD as primvars.

In addition to matching attribute names directly, there are some values with special meanings:


Authors the USD extent attribute using the calculated bounding box of the associated SOP geometry.


Authors the USD visibility attribute based on th value of the usdvisibility geometry attribute.

See importing attributes for information on how the importer deals converts certain well-known Houdini attributes to their USD equivalents.

Indexed Attributes

A space-separated list of attribute names/patterns specifying which SOP attributes to import into USD as indexed primvars.

If a SOP attribute matches this pattern, the importer authors the primvar as an indexed array of values (that is, an array of values call primvars:name, and an array of indices into those values called primvars:name:indices).

Preparing an indexed primvar can be expensive for attributes that are not integers or strings. You should only use indexed primvars where it is likely to result in significant savings in storage size due to a small number of unique values being used across a large number of components.

Single Value Attributes

A space-separated list of attribute names/patterns specifying which SOP attributes to import into USD as primvars with Constant interpolation (a single value for the whole primitive), regardless of whether the SOP geometry attribute is a point, primitive, or vertex attribute. If multiple values could be chosen for a particular USD primitive, the importer chooses the first value it encounters.

Set Default Values

A space-separated list of attribute names/patterns specifying which SOP attributes to always author as default values for USD primvars (never time samples). This is the list of exclusions when Author Time Samples is set to "If Not Specifically Excluded".

Partition Attributes

A space-separated list of attribute names/patterns specifying which SOP primitive string attributes represent subsets of the geometry. For mesh and curve primitives, the importer puts elements with the same value for this attribute into their own geometry subsets.

The importer will try to set the subset name to the attribute value, but may need to change the name make it a legal USD primitive name. The importer stores the raw attribute value on the geometry subset prim as Custom Data with the key partitionValue.

Subset Groups

A space-separated list of attribute names/patterns specifying SOP primitive groups. SOP polygon and curve primitives in each group will be imported as a geometry subset, named for the group.

USD Custom Attributes

A space-separated list of attribute names/patterns specifying which SOP attributes to import into USD as attributes (rather than primvars).

Translate UV Attribute to ST

Convert the SOP vertex attribute uv into a USD primvar called primvars:st. Whether you need to turn this on depends on which renderer you are using and how your shaders are authored. If you are rendering with Karma, leave this off.

(As of this writing there is no strict standard for texture coordinate naming in USD, but the use of st is a common convention, whereas in SOP geometry, using uv is the common convention.)

LOP nodes

  • Add Variant

    Adds one or more variants to a variant set on a primitive. This node creates the primitive if it doesn’t exist.

  • Additional Render Vars

    Create multiple render vars.

  • Assign Material

    Assigns a material to one or more USD primitives. You can use also programmatically assign materials using VEX, programmatically override material settings for each assignment, and programmatically assign materials to geometry subsets.

  • Attribute Wrangle

    Create/edit USD primitive attributes using a VEX snippet.

  • Auto Select LOD

    Automatically selects a level-of-detail variant based on the primitive’s distance from the camera.

  • Bake Skinning

    "Bakes" animation driven by a UsdSkel into transforms and point positions.

  • Begin Context Options Block

    This node begins a block of LOP nodes, within which certain context options have certain values.

  • Blend

    Partially applies edits to a layer’s attributes based on a fractional weight.

  • Cache

    Caches the results of cooking the network at different times, increasing playback speed.

  • Camera

    Adds a USD camera to the scene.

  • Capsule

    Creates or edits a "capsule" (tube with hemispherical ends) shape primitive.

  • Collection

    Creates/edits a collection using selected prims.

  • Cone

    Creates or edits a cone shape primitive.

  • Configure Layer

    Edits metadata on a layer.

  • Configure Primitives

    Edits various metadata on one or more primitives.

  • Configure Properties

    Configures metadata on properties (relationships and attributes).

  • Configure Stage

    Configures metadata for how to load layers into the stage and asset resolution.

  • Create LOD

    Uses the PolyReduce SOP to automatically generate multiple levels of detail from a high-res model, and stores them as USD variants.

  • Cube

    Creates or edits a cube shape primitive.

  • Cylinder

    Creates or edits a cylinder shape primitive.

  • Dome Light

    Creates or edits a USD Dome Light prim. A dome light emits light inward, simulating light coming from the sky/environment surrounding the scene.

  • Drop

    Runs a simulation to drop primitives under gravity.

  • Duplicate

    Creates copies of a prim (and its descendants).

  • Edit

    Interactively transforms prims in the viewer. Can use physics collisions to position props realistically.

  • Edit Context Options

  • Edit Material

    Allows you to edit an existing USD material by modifying parameters and shader connections. This can be useful if the existing material is on a non-editable layer.

  • Edit Properties

    Lets you build a spare parameter interface to directly edit attribute and relationship values.

  • Edit Prototype

    Switch point instances or USD instanceable prims to instance a different prototype.

  • Edit Target Layer

    Allows you to apply edits directly in a lower layer, instead of overriding prims and attributes in the active layer.

  • Error

    Generates a message, warning, or error, which can show up on a parent asset.

  • Extract Instances

    Converts an instance into a "real" editable prim.

  • Fetch

    Grabs the output of another LOP, potentially in another LOP network.

  • Follow Path Constraint

    Constrains a prim to follow a path curve.

  • For Each

    The end node of a For-Each loop block.

  • Geometry Subset VOP

    Creates USD geometry subsets within geometry prims (similar to groups in SOPs) based on evaluating a VEXpression or VOP network.

  • Graft

    Takes scene graph trees from other inputs and attaches them onto branches of the scene graph tree in the first input.

  • Inline USD

    Parses usda code representing a layer and adds it to the layer stack.

  • Instancer

    Instances or copies primitives onto points.

  • Karma Procedural

    Sets up render-time instantiation for Karma.

  • Karma Render Properties

    Configure Render Properties for Karma (Beta).

  • Karma Standard Render Vars

    Create standard karma render vars (AOVs/Image Planes).

  • LOP nodes

    LOP nodes generate USD describing characters, props, lighting, and rendering.

  • Layer Break

    Starts a new active sublayer that subsequent nodes will edit.

  • Layer Replace

    Replaces all uses of a certain layer with a substitute layer from its second input.

  • Light

    Creates or edits a USD Light prim. This node also adds some useful Karma-specific attributes.

  • Light Linker

    Creates USD light link properties based on rules.

  • Light Mixer

    Lets you interactively edit USD properties for multiple lights.

  • Load Layer

  • Look At Constraint

    Constrains a prim to always point toward a target.

  • Material Library

    Imports Material VOP nodes as USD material prims.

  • Material Linker

    Creates material assignments based on rules.

  • Material Variation

    Creates attributes/primvars to override material parameters per-prim/instance.

  • Merge LOP

    Merges the layers from incoming stages into a unified layer stack.

  • Modify Point Instances

    Modify point transforms and property values for individual point instances.

  • Null

    This node does nothing. It can be useful to insert a Null into a network as a "fixed point" in the network that you can refer to by name in expressions/scripts.

  • Output

    Represents the output of a subnetwork. Allows you to design a node asset with multiple outputs.

  • Parent Constraint

    Makes a primitive appear to inherit the transform hierarchy of another prim somewhere else in the tree.

  • Points Constraint

    Position and Orient primitives using point positions from a geometry.

  • Primitive

    Bulk-creates one or more attributes of a certain type.

  • Prune

    Hides or deactivates primitives and point instances.

  • Python Script

    Lets you write Python code in the node to use the USD API to directly manipulate the stage.

  • Reference

    References the contents of an external USD file into a branch of the existing scene graph tree, or removes/replaces existing references.

  • Render Geometry Settings

    Applies renderer-specific geometry settings to geometry in the scene graph.

  • Render Product

    Creates or edits a UsdRenderProduct prim, which represents an output of a renderer (such as a rendered image file or other file-like artifact produced by a renderer), with attributes configuring how to generate the product.

  • Render Settings

    Creates or edits a UsdRenderSettings prim, which holds the general settings for rendering the scene.

  • Render Var

    Specifies a custom variable computed by the renderer and/or shaders, either a shader output or a light path expression (LPE).

  • Retime Instances

    Offsets and/or scales the timing of animation on selected instances.

  • SOP Create

    Lets you create geometry in a SOP subnetwork inside this node, so you can create geometry in-place in the LOP network instead of needing a separate SOP network.

  • SOP Import

    Imports geometry from a SOP network into the USD scene graph.

  • SOP Modify

    Converts USD geometry into SOP geometry, runs the SOP subnet inside this node on the geometry, and converts the changes back to USD overrides.

  • Scene Import

    Imports models, materials, and lights from the Object level into the LOP network.

  • Scope

    Creates a "scope" primitive. Scope is the simplest form of grouping, and does not have a transform. Scopes can be useful for organizing the scene tree.

  • Set Extents

    Sets the bounding box metadata of selected primitives.

  • Set Variant

    Selects (switches to) one of the variants stored in a variant set on a primitive.

  • Simulation Proxy

    Generates low-poly collison geometry suitable for physical simulation and creates a proxy relationship to the original model.

  • Sphere

    Creates or edits a sphere shape primitive.

  • Stage Manager

    Provides a convenient interface to reference in many files at once and place them in the scene graph tree.

  • Store Parameter Values

    Lets you store temporary (unsaved) data in the stage.

  • Sublayer

    Imports from USD files or other LOP node chains into as sublayers, or removes/replaces/reorders existing sublayers.

  • Subnet

    Encapsulates a LOP subnetwork, allowing you to organize and hide parts of the network.

  • Surface Constraint

    Constrain a prim to stick to a surface.

  • Switch

    Passes through one of several inputs, based on a parameter choice or expression.

  • TimeShift

    Outputs the stage as it is at a different point in the timeline.

  • Transform

    Edits the transforms of selected USD primitives.

  • Transform UV

    Moves, rotates, and scales texture coordinates on USD primitives.


  • USD Render ROP

  • Value Clip

  • Vary Material Assignment

    Assign different materials across a number of prims to create variation.

  • Volume

    References volume data on disk into a volume prim containing field prims.

  • Xform

    Creates or edits an Xform prim. Xform (and its sub-classes) represents a transform in the scene tree.

  • attribvop