On this page |

## Overview

This node computes orientations, also known as reference frames, based on the tangents of curves, with various options for specifying up vectors and additional rotations. This can be useful for controlling orientations for geometry moving along paths or being copied or constructed along paths. These orientations are equivalent to those in the Sweep node and the Copy to Curves node.

Unlike the PolyFrame node, this treats all polygons as curves, even if they are closed, making computing orientations for closed paths easier.

## Parameters

Curve Group

Group of primitives around which to compute orientations (reference frames).

## Frame

Tangent Type

The overall method for computing tangents at each vertex. If **Transform Using Point Attributes** is on and the input has point `N`

(vector), `orient`

(quaternion), `rot`

(quaternion), or `transform`

(3×3 or 4×4 matrix), this is ignored in favor of the Z axis from the transform determined by these attributes. The **Stretch Around Turns** option always computes the stretch and stretch direction based on the **Average of Edge Directions** tangent, regardless of this tangent type, since it’s undefined otherwise. See the descriptions and image of the options below.

Average of Edge Directions

Average of the normalized directions of the previous and next edge

Central Difference

Average of the unnormalized previous and next edge vectors. This is similar to the **Central Difference** option for the **Velocity Approximation** on the Trail node.

Previous Edge

Previous edge direction

Next Edge

Next edge direction

Z Axis (Ignore Curve)

The tangent will be chosen as the Z axis, regardless of the curve.

Make Closed Curve Orientations Continuous

When enabled, any accumulated roll (torsion) around a closed curve will be canceled out in a manner spread out around the curve, instead of suddenly in the final edge. Planar curves don’t have any inherent accumulated roll around the curve, but this applies to the **Partial Twist** option (when **Apply Roll or Twist** is enabled) as well, so any twist that isn’t a multiple of a full twist will be rounded to a multiple of a full twist.

Extrapolate End Tangents

When enabled, end (including beginning) tangents will be extrapolated based on the **Tangent Type** and the two edges closest to the end, instead of just being chosen as the end edge direction. This is most useful for cases similar to when a curve is intended to represent a circular arc, so that end orientations will be rotated as expected. See the image above.

Transform Using Point Attributes

When enabled, any point attributes `P`

, `N`

, `up`

, `orient`

, `rot`

, `trans`

, `pivot`

, `pscale`

, `scale`

, and `transform`

will be used to form each transform, primarily as specified here. If `N`

is present and none of `up`

, `orient`

, `rot`

, or `transform`

are present, `N`

will be used as the curve tangent and the rest of the rotation will be computed as usual. If `up`

is present and none of `N`

, `orient`

, `rot`

, or `transform`

are present, the tangent will be computed as usual, and `up`

will be used as the up vector at each vertex, before any **Apply Roll or Twist** is applied.

Target Up Vector

Up vector for each curve to target, to break the tie between all possible rolls around the tangent. If a curve is planar, the **Curve Normal** option should ensure that the up vector is perpendicular to the plane; if the curve is a straight line, this option will fall back to using the y axis as a target up vector. The **Attribute** option can use a primitive or detail attribute to select the up vector for each curve. To specify separate up vectors on all curve points, use the **Transform Using Point Attributes** and provide a point attribute named `up`

, in which case, this target up vector is ignored.

Target Up Vector at Start (else Average)

When enabled, the roll for each curve is chosen such that the up vector of the first vertex is as close as possible to the target up vector while still being perpendicular to the tangent vector. When disabled, that applies to the average of all vertex up vectors, instead of the first vertex. This must be enabled in order to use the **Use Target End Up Vector Option**.

Use Target End Up Vector

When enabled and **Target Up Vector at Start** is enabled, the twist along each curve is adjusted to ensure that the end up vector is as close as possible to the target up vector, without affecting the start up vector. If **Target Up Vector** is **Attribute** or **Custom**, there are separate **End Up Attribute** and **End Up Vector** parameters, in order to specify different end up vectors from the start up vectors.

Start Up Attribute

When **Target Up Vector** is **Attribute**, this is the name of the primitive or detail attribute to use for each curve’s target up vector. When **Target Up Vector at Start** is enabled, this provides the target up vectors at the start of the curves. When **Target Up Vector at Start** is disabled, this provides the target for the average up vector along each curve.

End Up Attribute

When **Target Up Vector** is **Attribute** and **Use Target End Up Vector** is enabled, this is the name of the primitive or detail attribute that provides the target up vectors at the end of the curves. The twist of each curve is adjusted to ensure that the end up vector is as close as possible to the target end up vector, without affecting the start up vector.

Start Up Vector

When **Target Up Vector** is **Custom**, this is the target up vector to use for each curve. When **Target Up Vector at Start** is enabled, this provides the target up vector at the start of the curves. When **Target Up Vector at Start** is disabled, this provides the target for the average up vector along each curve.

End Up Vector

When **Target Up Vector** is **Custom**, this is the target end up vector to use for each curve. The twist of each curve is adjusted to ensure that the end up vector is as close as possible to the target end up vector, without affecting the start up vector.

## Additional Rotations

Rotate Order

The order in which to apply the Pitch (around X/out), Yaw (around Y/up), and Roll or Twist (around Z/tangent) options below if multiple are enabled. Pitch and Yaw may be useful to effectively apply a pre-transform to whatever the orientation will be applied to, which is why they default to being applied before the Roll or Twist. These rotations are effectively applied before the transforms from the curves, having the net effect of them being rotations in the space of the curve frames.

Apply Roll or Twist

When enabled, the parameters below for applying a roll rotation around the tangents (computed above) are enabled.

Roll

Rotation in degrees around the tangent, applied to every orientation, if **Apply Roll or Twist** is enabled.

Twist Per

Manner in which to apply the twist value specified below by `(360*(Full Twists) + (Partial Twist))`

. See the descriptions and image below.

Per Edge

The specified twist will be applied once for each edge, so for example, a **Partial Twist** of 60 degrees along each of 6 edges would result in a total of 360 degrees of twist. **Full Twists** will have no effect in this case, since a full twist in a single edge restores the original orientation.

Per Unit Distance

The twist for each edge will be the length of the edge times the twist value in degrees.

Scale by Attribute

The twist value in degrees will be multiplied at each vertex by the attribute given by **Twist Ramp Attribute**, which can be a vertex, point, primitive, or detail attribute. This product is applied as a roll at each vertex, not as an accumulating twist, so that if the attribute goes from 0 to 1 along a curve, the twist value will be the total twist applied.

Per Full Curve by Edges

The specified twist will be applied once across each whole curve, with an equal amount of twist applied across each edge, regardless of the length of each edge. For example, a **Partial Twist** of 60 degrees along a curve with 6 edges will yield a 10 degree rotation along each edge in this case.

Per Full Curve by Distance

The specified twist will be applied once across each whole curve, with the amount of twist per edge being proportional to the length of the edge.

Full Twists

Integer number of full twists to add for each unit determined by **Twist Per**. This is just provided for convenience; it is just multiplied by 360 and then added to **Partial Twist**. If **Twist Per** is **Per Full Curve by Edges** or **Per Full Curve by Distance**, this corresponds with full twists along each full curve.

Partial Twist

Twist in degrees around the tangent, to add for each unit determined by **Twist Per**. This is added to 360 times **Full Twists**.

Twist Ramp Attribute

When **Twist Per** is **Scale By Attribute**, this is the name of the vertex, point, primitive, or detail attribute to multiply by the combination of **Full Twists** and **Partial Twist** in degrees. This product is applied as a roll at each vertex, not as an accumulating twist, so that if the attribute goes from 0 to 1 along a curve, the twist value will be the total twist applied.

Apply Yaw

When enabled, the parameters below for applying a yaw rotation around the up vectors (computed above) are enabled.

Yaw

Rotation in degrees around the up vector, applied to every orientation, if **Apply Yaw** is enabled.

Yaw Per

Manner in which to apply the **Incremental Yaw** value specified below.

Per Edge

The specified yaw will be applied once for each edge, so for example, an **Incremental Yaw** of 60 degrees along each of 6 edges would result in a total of 360 degrees of yaw (spinning around the up vector).

Per Unit Distance

The yaw for each edge will be the length of the edge times the **Incremental Yaw** value in degrees.

Scale By Attribute

The **Incremental Yaw** value in degrees will be multiplied at each vertex by the attribute given by **Yaw Ramp Attribute**, which can be a vertex, point, primitive, or detail attribute. This product is applied as a yaw at each vertex, not as an accumulating yaw, so that if the attribute goes from 0 to 1 along a curve, the **Incremental Yaw** value will be the total yaw applied.

Per Full Curve by Edges

The specified **Incremental Yaw** will be applied once across each whole curve, with an equal amount of yaw applied across each edge, regardless of the length of each edge. For example, an **Incremental Yaw** of 60 degrees along a curve with 6 edges will yield a 10 degree rotation along each edge in this case.

Per Full Curve by Distance

The specified **Incremental Yaw** will be applied once across each whole curve, with the amount of yaw per edge being proportional to the length of the edge.

Incremental Yaw

Yaw in degrees around the up vectors, to add for each unit determined by **Yaw Per**.

Yaw Ramp Attribute

When **Yaw Per** is **Scale By Attribute**, this is the name of the vertex, point, primitive, or detail attribute to multiply by **Incremental Yaw** in degrees. This product is applied as a yaw at each vertex, not as an accumulating yaw, so that if the attribute goes from 0 to 1 along a curve, the **Incremental Yaw** value will be the total yaw applied.

Apply Pitch

When enabled, the parameters below for applying a pitch rotation around the out vectors (perpendicular to the tangent and up vectors computed above) are enabled.

Pitch

Rotation in degrees around the out vector (perpendicular to the tangent and up vectors), applied to every orientation, if **Apply Pitch** is enabled.

Pitch Per

Manner in which to apply the **Incremental Pitch** value specified below.

Per Edge

The specified pitch will be applied once for each edge, so for example, an **Incremental Pitch** of 60 degrees along each of 6 edges would result in a total of 360 degrees of pitch (tumbling around the out vector).

Per Unit Distance

The pitch for each edge will be the length of the edge times the **Incremental Pitch** value in degrees.

Scale By Attribute

The **Incremental Pitch** value in degrees will be multiplied at each vertex by the attribute given by **Pitch Ramp Attribute**, which can be a vertex, point, primitive, or detail attribute. This product is applied as a pitch at each vertex, not as an accumulating pitch, so that if the attribute goes from 0 to 1 along a curve, the **Incremental Pitch** value will be the total pitch applied.

Per Full Curve by Edges

The specified **Incremental Pitch** will be applied once across each whole curve, with an equal amount of pitch applied across each edge, regardless of the length of each edge. For example, an **Incremental Pitch** of 60 degrees along a curve with 6 edges will yield a 10 degree rotation along each edge in this case.

Per Full Curve by Distance

The specified **Incremental Pitch** will be applied once across each whole curve, with the amount of pitch per edge being proportional to the length of the edge.

Incremental Pitch

Pitch in degrees around the up vectors, to add for each unit determined by **Pitch Per**.

Pitch Ramp Attribute

When **Pitch Per** is **Scale By Attribute**, this is the name of the vertex, point, primitive, or detail attribute to multiply by **Incremental Pitch** in degrees. This product is applied as a yaw at each vertex, not as an accumulating yaw, so that if the attribute goes from 0 to 1 along a curve, the **Incremental Pitch** value will be the total yaw applied.

## Scales and Shears

Normalize Scales

When enabled, any scales or shears coming from **Transform Using Point Attributes**, for example from `pscale`

, `scale`

, or `transform`

attributes, will be canceled out.

Uniform Scale

This scale is applied to the transform after **Normalize Scales**.

Stretch Around Turns

When enabled, this stretches the transforms in the direction of curvature around turns in the curves, which is primarily for use with cross sections, for example with the Sweep node to avoid the cross section appearing to be squashed along edges. This is usually the desired behavior in the Sweep node, but not usually for other uses.

Max Stretch

When **Stretch Around Turns** is enabled, this is the maximum amount that transforms will be stretched, to avoid stretching too far when a curve almost reverses direction in a single turn.

## Output Attributes

Class

Whether to create the output attributes on the points or the vertices. Transforms are always computed for vertices first. If output attributes will be point attributes and there are shared points, the separate transforms of the vertices will be averaged by separately averaging the rotations as quaternions, the translations, and any scales and shears.

X Axis

When enabled, a vector attribute with this name will be created on the output that is perpendicular to the curve tangents (z axis) and up vectors (y axis). If a curve is planar and **Target Up Vector** is set to **Curve Normal**, this corresponds with the outward direction. If the attribute is named `N`

, it will be marked as transforming like a normal, instead of a vector. If the input `P`

attribute is 64-bit, this attribute will be 64-bit.

Y Axis

When enabled, a vector attribute with this name will be created on the output that corresponds with the up vector, perpendicular to the curve tangents (z axis). If the attribute is named `N`

, it will be marked as transforming like a normal, instead of a vector. If the input `P`

attribute is 64-bit, this attribute will be 64-bit.

Tangent (Z Axis)

When enabled, a vector attribute with this name will be created on the output that corresponds with the curve tangents. If the attribute is named `N`

, it will be marked as transforming like a normal, instead of a vector. If the input `P`

attribute is 64-bit, this attribute will be 64-bit.

Translation

When enabled, a position attribute with this name will be created on the output that corresponds with the translation coming from `P`

, `pivot`

, `trans`

, and `transform`

attributes when **Transform Using Point Attributes** is enabled, or just `P`

when it is disabled. If the input `P`

attribute is 64-bit, this attribute will be 64-bit.

Quaternion

When enabled, a quaternion attribute with this name will be created on the output that corresponds with the orientations along the curves. If the input `P`

attribute is 64-bit, this attribute will be 64-bit.

3×3 Transform

When enabled, a 3×3 transform matrix attribute with this name will be created on the output that corresponds with the orientations along the curves, scales, and shears. If the input `P`

attribute is 64-bit, this attribute will be 64-bit.

4×4 Transform

When enabled, a 4×4 transform matrix attribute with this name will be created on the output that corresponds with the orientations along the curves, scales, shears, and translations. If the input `P`

attribute is 64-bit, this attribute will be 64-bit.

## Examples

TankTread Example for Orientation Along Curve geometry node

This example demonstrates how the Orientation Along Curve SOP can be used to create a Tank Tread.

See also |