When you copy or instance geometry onto points, Houdini looks for specific attributes on the destination points to customize each copy/instance.
Attributes
| Attribute name | Data type | Description |
|---|---|---|
orient | float4 (quaternion) | Orientation of the copy |
pscale | float | Uniform scale |
scale | float3 | Non-uniform scale |
N | vector | Normal (+Z axis of the copy, if no orient) |
up | vector | Up vector of the copy (+Y axis of the copy, if no orient) |
v | vector | Velocity of the copy (motion blur, and used as +Z axis of the copy if no |
rot | float4 (quaternion) | Additional rotation (applied after the orientation attributes above) |
trans | vector | Translation of the copy |
shop_material | string | Path to a material. You can add this attribute to points using the Material surface node. When you instance an object onto a point with this attribute, the instanced object uses the given material. |
material_override | string | A serialized Python dictionary mapping parameter names to values. You can add this attribute to points using the “override” controls on the Material surface node. When you instance an object onto a point with this attribute, the instanced object applies the given overrides to its material. |
Priorities
If the
orientattribute existsUse it to orient the copy/instance.
If the
orientattribute does not existOrient the copy/instance using
Nas the +Z axis andupas +Y axis.If
Ndoes not exist, usev(velocity) if it exists.
If the
rotattribute exists, apply it after the above.If
pscaleexists, use it to scale the to scale the copy/instance (multiplied byscaleif it exists).If
scaleexists, use it to scale the copy/instance (multiplied bypscaleif it exists).If
transexists, use it to move the copy/instance.
Or, put another way:
Key:
O = orient matrix
S = scale matrix (scale * pscale)
L = alignment matrix (*)
R = rot matrix
T = trans matrix (trans + P)
(*) The alignment matrix (L) is defined by N or v and up.
IF N exists AND up exists and isn't {0,0,0}:
L = mlookatup(N,0,up)
ELSE IF N exists:
L = dihedral({0,0,1},N)
ELSE IF v exists AND up exists and isn't {0,0,0}:
L = mlookatup(v,0,up)
ELSE IF v exists:
L = dihedral({0,0,1},v)
IF orient exists:
Transform = O*R*S*T
ELSE:
Transform = S*L*R*T
Instancing and motion blur
| Velocity Blur | The shutter open transform is based off the Axis Alignment and Positioning stated above. For the shutter close transform the shutter open transform is used plus the vector Note
|
| Transform Blur | Same as Velocity Blur but the Object level transform is also taken into account. |
| Deformation Blur | The Axis Alignment and Positioning transform is constructed for both shutter open and close, the object level transform is also taken into account. This method is the most accurate. |
Examples
(The image in the lower right corner of each frame is the geometry if it were instanced without any of the attributes.)