> For the complete documentation index, see [llms.txt](https://stage-precision.gitbook.io/grid/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://stage-precision.gitbook.io/grid/timeline/layer-types/trigger-layer/motion-path.md).

# Motion Path

Use Motion Paths to animate 3D object transforms over time with Spin, Spin To, Transform By, and Transform To modes.

A **Motion Path** performs time-based transform manipulation on a 3D object.

Unlike Trigger and Timed Trigger, Motion Path does **not** provide Workflow Events.

Instead, it directly manipulates its Target object while the Playhead progresses through the Motion Path Block.

***

## Target

The **Target** defines the 3D object that should be manipulated.

A Target can be assigned by:

* dragging and dropping an object onto the Target parameter
* clicking the Target parameter and selecting an object from the selection menu

<figure><img src="https://1761958297-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FDcGqBEYUYkl2mQzGbOue%2Fuploads%2FqxXXykufUhzhSiiIV4ET%2FqgtcmJ31DQ.gif?alt=media&amp;token=ca4ca006-50a9-469f-978b-3b0d2e974927" alt=""><figcaption></figcaption></figure>

***

## Modes

Motion Path supports four modes:

### Spin

**Spin** continuously adds rotation to the Target object while the Playhead progresses through the Motion Path Block.

The rotation is applied relative to the object's current orientation. This means that Spin does not move the object toward a fixed target rotation — instead, every traversal adds additional rotation to the object's current state.

A partial traversal only applies the corresponding part of the rotation.

#### Axis

The **Axis** values define the direction and amount of rotation for each axis as factors of a full revolution.

For example:

`X: -1, Y: 1, Z: 0`

with **Revolutions = 1** means:

* X performs one full revolution in the negative direction
* Y performs one full revolution in the positive direction
* Z does not rotate

A factor of `1` therefore represents one full revolution, while `-1` represents one full revolution in the opposite direction.

The Axis values can also use values between or beyond `-1` and `1`.

#### Revolutions

**Revolutions** scales the rotation defined by the Axis values.

With:

* Axis: `X: -1, Y: 1, Z: 0`
* Revolutions: `1`

the Motion Path applies:

* X: `-360°`
* Y: `+360°`
* Z: `0°`

<figure><img src="https://1761958297-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FDcGqBEYUYkl2mQzGbOue%2Fuploads%2FMnm8eGiAQo6jtM3rMyQ6%2Fi07boQKOAY.gif?alt=media&amp;token=cc5f84e6-336c-4134-98ae-301e3d53e200" alt=""><figcaption></figcaption></figure>

With **Revolutions = 0.5**, the same Axis values result in:

* X: `-180°`
* Y: `+180°`
* Z: `0°`

<figure><img src="https://1761958297-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FDcGqBEYUYkl2mQzGbOue%2Fuploads%2FWTz0YVIc2W58dFWhSfOX%2FgG26uCN6K4.gif?alt=media&amp;token=83f2fb8c-c941-4e0c-a301-c071b9a3d50f" alt=""><figcaption></figcaption></figure>

The final rotation is always added to the Target's current orientation, and only the portion of the Motion Path that is actually traversed is applied.

For example, with **Revolutions set to `0.25`**, one complete traversal adds `90°`. If the Motion Path is then played only halfway, another `45°` is added, and playing only one quarter of the Block adds another `22.5°`. The rotation therefore accumulates over both complete and partial traversals, depending on how far through the Motion Path the Playhead actually moves.

<figure><img src="https://1761958297-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FDcGqBEYUYkl2mQzGbOue%2Fuploads%2FAS4SwDNGh2jkEBcyb8vL%2F1NNa4XKnGn.gif?alt=media&amp;token=1d6bb9c5-1c9c-4f1c-b8ee-bea848cc6224" alt=""><figcaption></figcaption></figure>

### Spin To

**Spin To** rotates the Target object toward a defined orientation.

Unlike **Spin**, the rotation is not added to the object's current orientation. Instead, the Motion Path defines a fixed target rotation. This means that repeated traversals do not continue to accumulate additional rotation — the Target is always driven toward the same defined orientation.

#### Target Rotation

The rotation values define the final orientation of the Target.

By default, these values are interpreted as **global rotations**.

This means that the resulting orientation is independent of the current rotation of the Target or the rotation of any objects above it in the hierarchy. The Motion Path sets the Target to the defined global orientation.

For example, if the Target Rotation is set to:

`X: 0°, Y: 90°, Z: 0°`

the Target will be rotated toward that global orientation, regardless of how it was oriented before the Motion Path started.

<figure><img src="https://1761958297-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FDcGqBEYUYkl2mQzGbOue%2Fuploads%2FyyPOFthPihaWKIyrE1Oe%2Fm1fPRuSwU7.gif?alt=media&amp;token=91104435-ef1e-426f-9ce5-b870311bbdfc" alt=""><figcaption></figcaption></figure>

#### Parent Target

A **Parent Target** can be used when the desired rotation should be relative to another object instead of the global coordinate system.

When a Parent Target is assigned, the configured rotation values are interpreted relative to that object.

This makes it possible to define an orientation in the local context of another object while still using Spin To to move toward a fixed target rotation.

<figure><img src="https://1761958297-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FDcGqBEYUYkl2mQzGbOue%2Fuploads%2FNYFBE9ahlzsmSvoOEmgA%2Fk1G3tH17HJ.gif?alt=media&amp;token=def5e39c-cbc4-4c4a-86d5-ccb279711bb9" alt=""><figcaption></figcaption></figure>

***

### Transform By

**Transform By** applies relative Position, Rotation, and Scale changes to the Target while the Playhead moves through the Motion Path Block.

The configured values are added to the Target's **current transform**. This means that Transform By does not move the object toward a fixed destination. Instead, every traversal continues from the state the object currently has.

For example, a Transform By can be configured to:

* move the Target by `+1 m`
* rotate it by `+45°` on each axis
* increase its Scale by `+1`

After one complete traversal, all of these changes have been applied once. Running through the Motion Path again applies the same changes again, so the object moves further, continues to rotate, and becomes larger with every traversal.

<figure><img src="https://1761958297-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FDcGqBEYUYkl2mQzGbOue%2Fuploads%2FJoO3L26CD3YN91scdyC7%2FPowerToys_SORn3OiPSS.gif?alt=media&amp;token=0d0fcbb6-53ea-4cd5-9391-70841069b576" alt=""><figcaption></figcaption></figure>

The transformation is also applied progressively while the Playhead moves through the Block. If the Motion Path is only traversed partially, only the corresponding portion of the configured transformation is added.

For example, stopping halfway through the Block applies approximately half of the Position, Rotation, and Scale changes. Continuing with additional full or partial traversals keeps adding to the Target's current transform.

The final result therefore depends on both **how often** and **how far** the Motion Path has been traversed.

***

### Transform To

**Transform To** moves the Target toward a defined Position, Rotation, and Scale while the Playhead progresses through the Motion Path Block.

Unlike **Transform By**, the configured values are not added to the Target's current transform. Instead, they define a fixed destination.

This means that repeated traversals do not continue to accumulate Position, Rotation, or Scale changes. The Target is always transformed toward the same defined target state.

#### Target Transform

The target transform can define:

* **Position**
* **Rotation**
* **Scale**

By default, these values describe a **global transform**.

This means the final Position and Rotation are defined in global space, independent of the transform of objects above the Target in the hierarchy.

For example, if a specific Position and Rotation are configured, the Motion Path drives the Target toward exactly that global transform, regardless of where or how it was positioned before.

<figure><img src="https://1761958297-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FDcGqBEYUYkl2mQzGbOue%2Fuploads%2FxBNY7g3mJIPfoNBWK8W5%2FdStsWQ5TMc.gif?alt=media&amp;token=b8203388-503f-4769-8a2d-8a4b2e2ce401" alt=""><figcaption></figcaption></figure>

#### Parent Target

A **Parent Target** can be assigned when the destination should be defined relative to another object instead of in global space.

When a Parent Target is set, the configured Position, Rotation, and Scale values are interpreted relative to that object.

This makes it possible to define a fixed target transform within the coordinate system of another object while still using **Transform To** to move toward a clearly defined destination.

<figure><img src="https://1761958297-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FDcGqBEYUYkl2mQzGbOue%2Fuploads%2F9CxQlcByp0iiJfnACyMo%2FKP2Pz29YB9.gif?alt=media&amp;token=e8289542-77f6-45c5-bc47-f435d5257611" alt=""><figcaption></figcaption></figure>

***

## Progress Curve

The **Progress Curve** defines how the Motion progresses across the duration of the Block.

The Motion progress itself remains within a range of **0–100%**.

<figure><img src="https://1761958297-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FDcGqBEYUYkl2mQzGbOue%2Fuploads%2FZgloEszWs6C339wyJ7U0%2FPGoGppQziM.gif?alt=media&amp;token=c7c4c6b8-51b5-49e3-a40e-ad35d34a18f8" alt=""><figcaption></figcaption></figure>

By default, the progression can run linearly from the beginning to the end, but the Curve can be reshaped using control points.

The Curve does not have to continuously move forward.

For example, it can:

* reach 50% Motion progress halfway through the Block
* then move back toward 0% before reaching the end

<figure><img src="https://1761958297-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FDcGqBEYUYkl2mQzGbOue%2Fuploads%2FdoIueLZMonm3oub2oXpl%2Fwzmt1CWtX5.gif?alt=media&amp;token=f95b00b6-e358-4c65-b0a8-9a673ef91c8d" alt=""><figcaption></figcaption></figure>

This makes it possible to create acceleration, deceleration, easing, or motions that partially or completely reverse during the same Block.

### Editing the Progress Curve

The Progress Curve can be edited directly in the Curve Editor.

#### Adding Control Points

Double-click anywhere on the Curve to add a new control point.

<div align="left"><figure><img src="https://1761958297-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FDcGqBEYUYkl2mQzGbOue%2Fuploads%2Fo87QSSkmdF5L3xS0nLvY%2FPowerToys_5XKxtlbkKl.gif?alt=media&amp;token=4d675952-ff36-4a90-8edc-12aefb9f46d5" alt="" width="368"><figcaption></figcaption></figure></div>

Additional points allow the Motion progression to be shaped at different positions throughout the Block.

#### Moving Control Points

Click and drag a control point to change its position in the graph.

<div align="left"><figure><img src="https://1761958297-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FDcGqBEYUYkl2mQzGbOue%2Fuploads%2FzEhNniOCNoYnm8zuCYKS%2FGEvlaoM8mZ.gif?alt=media&amp;token=1825ccf9-a68c-4f21-a1e5-410b5db2a4fc" alt="" width="368"><figcaption></figcaption></figure></div>

Moving a point horizontally changes **when** that progress value is reached, while moving it vertically changes **how much Motion progress** has been reached at that point.

#### Deleting Control Points

Select a control point in the Curve Editor and press <kbd>**DEL**</kbd> on the keyboard to remove it.

<div align="left"><figure><img src="https://1761958297-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FDcGqBEYUYkl2mQzGbOue%2Fuploads%2FkL8jEm84putkWOXruC9p%2F1ac6HjAHK2.gif?alt=media&amp;token=856c9bdc-57e9-489c-8aeb-98c93e6fedbe" alt="" width="368"><figcaption></figcaption></figure></div>

#### Changing the Curve Type

Right-click a Curve segment to open its context menu and change the Curve type.

<div align="left"><figure><img src="https://1761958297-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FDcGqBEYUYkl2mQzGbOue%2Fuploads%2FOb1unJI6LaxVOky6KKr3%2FH4tEDvatYX.gif?alt=media&amp;token=be9ff62a-cd95-477c-80aa-0b4ac514f821" alt="" width="368"><figcaption></figcaption></figure></div>

This allows the transition between control points to be changed from a simple linear progression to different interpolation or easing behaviors.
