Tutorial: Transform Pipelines¶
Control how objects move - add bounce, snap to a grid, avoid walls, or make objects feel heavy. Instead of just teleporting from A to B, you will make objects move with personality.
By the end of this tutorial you will have a cube that bounces toward its target with spring physics, locks to a horizontal plane, and slides around obstacles.
Prerequisites: Complete Your First Drag and Drop. You should have a working scene with a Cube that transfers between two attachment points.
How Movement Works in Octoputs¶
Every time an object attaches to a slot, something needs to move it into position. That "something" is a transform pipeline - a chain of small, focused steps:
- Where should it go? (the Target)
- Should anything modify the path? (Modifiers - add bounce, lock an axis, avoid walls, etc.)
- How should the final position be applied? (the Applier - set it directly, or use physics forces)
flowchart LR
T["Target"] --> M1["Modifier 1"] --> M2["Modifier 2"] --> M3["..."] --> A["Applier"]
Each piece is independent. You can swap the target without touching the modifiers, change from direct placement to physics forces without reconfiguring anything else, or stack as many modifiers as you like.
1. Swap the Default Pipeline¶
New attachment points ship with a built-in pipeline that "just works" but gives you limited control. Let us replace it with one you can fully customize.
- Select DestinationPoint in the Hierarchy.
- In the AttachmentPoint Inspector, open the Attached tab.
- Find the Process field. It currently shows
Held Attachable Transform Pipeline. - Click the type selector dropdown and choose Direct Transform Pipeline.
The Inspector now shows the pipeline's building blocks:
- Target Object - The object to move (leave empty for now; we will configure it in the next step).
- Target - Where to move toward.
- Modifiers - The modifier chain (empty by default).
- Completion Check - When the pipeline considers itself "done" (defaults to
NeverStop, which keeps it running indefinitely).
What changed?
The default pipeline (HeldAttachableTransformPipeline) resolves the held object automatically but is a black box. DirectTransformPipeline requires you to specify the target object explicitly, but in return you get full control over every stage.
2. Set the Destination¶
The target answers the question: where should the object end up?
- In the
DirectTransformPipelineyou just added, find the Target field. - It should already default to
Transform Target. If not, click the type selector and choose it. - Inside the Transform Target, assign DestinationPoint's Transform to the target reference field. This tells the pipeline "move the object to wherever DestinationPoint is."
Other ways to define a destination
Octoputs includes several target types for different scenarios:
RayHitTransformTarget- follow a raycast hit point (surface dragging)LerpedTransformTarget- smoothly interpolate from current position to a destination over a durationCurveTransformTarget- follow an animation curve pathBlendedTransformTarget- blend between two targets using a weight
See the API Reference for the full list.
Press Play and trigger a transfer. The Cube should snap to DestinationPoint's position, same as before. No visual difference yet - we need modifiers for that.
3. Add Bounce with a Spring Modifier¶
Modifiers sit between the target and the applier, adjusting the computed position before it gets applied. Let us make the object overshoot its target and bounce back with a spring.
- In the
DirectTransformPipeline, find the Modifiers list. - Click + to add an entry.
- From the type selector, choose Spring (under the Physics category).
The Spring modifier controls how the object chases its target:
| Field | Default | What it does |
|---|---|---|
| Spring Strength | 1200 | How aggressively the object is pulled toward the target. Higher = snappier. |
| Damping | 20 | How quickly oscillation dies out. Higher = less bounce. |
| Max Spring Range | Infinity | Maximum stretch distance. Beyond this the spring clamps. |
| Max Acceleration | Infinity | Cap on per-frame acceleration. |
| Max Velocity | Infinity | Cap on spring velocity. |
For a noticeable bouncy effect, try these values:
- Spring Strength:
300 - Damping:
8
Press Play and trigger a transfer. The Cube now overshoots DestinationPoint and bounces back before settling. Increase Damping to reduce the bounce, or decrease Spring Strength for a slower, lazier follow.
Tuning springs
A good starting point: set Spring Strength to roughly 10x the Damping for a visible bounce, or 60x the Damping for a tight follow with minimal oscillation.
4. Lock an Axis¶
Modifiers execute top to bottom. Each one receives the output of the previous modifier (or the raw target, if it is first). You can stack as many as you need.
Let us freeze the Y axis so the Cube slides horizontally but never moves up or down.
- In the Modifiers list, click + again.
- Choose Axis Lock (under the Constraints category).
- In the new entry, check Lock Y.
The modifier chain now looks like this:
flowchart LR
T["TransformTarget"] --> S["SpringModifier"] --> A["AxisLockModifier"] --> P["Applier (Direct)"]
Press Play. The Cube bounces toward the target on X and Z, but its Y position stays locked at its initial height.
Order matters
If you swap the order - AxisLock first, then Spring - the spring will still oscillate on Y because it runs after the lock. The lock freezes Y, but the spring reintroduces Y motion. Always place constraints after dynamic modifiers when you want the constraint to have the final word.
5. Use Physics Instead of Teleporting¶
So far the pipeline teleports the object each frame. For objects that need to push other things, respect gravity, or collide with the world, swap to a physics-based pipeline.
- Select DestinationPoint.
- In the Attached tab's Process field, click the type selector and choose Physics Transform Pipeline.
- Configure the Target Object and Target fields the same way as before (the Cube and DestinationPoint's transform).
Rigidbody required
The Cube must have a Rigidbody component. If it does not, add one now: select the Cube, then Add Component > Physics > Rigidbody.
The Physics pipeline exposes these key settings:
| Setting | Default | What it does |
|---|---|---|
| Use Velocity Based | true | When enabled, sets velocity directly. When disabled, applies forces. |
| Spring Strength | 50 | How strongly the object is pulled toward the target (velocity mode). |
| Spring Damper | 10 | How quickly velocity damps (velocity mode). |
| Movement Force | 500 | Force magnitude toward the target (force mode). |
| Max Velocity | 20 | Velocity cap to prevent runaway speeds. |
| Override Gravity | false | When enabled, disables gravity while the pipeline is running. |
| Freeze Rotation | false | When enabled, locks rotation during movement. |
Press Play. The Cube now moves toward the target using physics. It collides with other objects, responds to gravity (unless overridden), and other Rigidbodies react to it.
When to use which
Use Direct when you want pixel-perfect placement (inventory UIs, strategy games, editors). Use Physics when objects live in a physical world and need to push, collide, and interact (VR, physics puzzles, immersive sims).
6. Slide Around Obstacles¶
Physics pipelines handle collisions via the Rigidbody, but direct pipelines teleport through geometry. To prevent objects from passing through walls with a direct pipeline, add a collision avoidance modifier.
- Switch back to Direct Transform Pipeline on DestinationPoint.
- In the Modifiers list, add a new entry.
- Choose one of the collision modifiers:
| Modifier | How it works | Best for |
|---|---|---|
| Depenetration | Uses Physics.ComputePenetration to push the object out of overlaps |
General-purpose, physically correct push directions |
| Surface Slide | Sweeps the object's bounding box and slides along surfaces on contact | Smooth surface-following, feels natural for dragging |
For this tutorial, choose Surface Slide.
Place a few obstacles (cubes, walls) between the Cube's start position and DestinationPoint. Press Play and trigger a transfer. The Cube now slides around obstacles instead of passing through them.
Collision layers
Both collision modifiers use Layer Mask fields to control which layers are checked. By default they check all layers. Set the mask to only include obstacle layers for better performance.
Modifier Reference¶
Octoputs ships with 33+ modifiers organized into categories. Here is a quick reference - see the API Reference for full details.
Constraint and Snapping¶
| Modifier | What it does |
|---|---|
AxisLockModifier |
Lock movement on specific position/rotation axes. |
PositionConstraintModifier |
Clamp position within min/max bounds. |
RotationConstraintModifier |
Clamp rotation within angle limits. |
OrbitConstraintModifier |
Constrain movement to an orbital path around a center. |
HeightLockModifier |
Lock Y position to a fixed height. |
Snap2DGridModifier |
Snap position to a 2D grid. |
Snap3DGridModifier |
Snap position to a 3D grid. |
Physics and Dynamics¶
| Modifier | What it does |
|---|---|
SpringModifier |
Elastic, bouncy motion using spring-damper physics. |
ElasticBandModifier |
Rubber-band pull-back when stretched beyond a threshold. |
MomentumModifier |
Continue movement with inertia after release. |
KinematicsLimiterModifier |
Clamp velocity and acceleration to maximum values. |
Raycast and Collision¶
| Modifier | What it does |
|---|---|
DepenetrationModifier |
Push out of overlapping geometry using ComputePenetration. |
SurfaceSlideModifier |
Sweep-based avoidance that slides along surfaces. |
OBBCollisionAvoidanceModifier |
Collision avoidance using oriented bounding boxes. |
CameraRaycastOffsetModifier |
Offset position based on a camera raycast (3D). |
CameraRaycast2DOffsetModifier |
Offset position based on a camera raycast (2D). |
BoundingOffsetFromHitNormalModifier |
Offset from a surface using hit normal and object bounds. |
Alignment and Orientation¶
| Modifier | What it does |
|---|---|
SurfaceNormalAlignmentModifier |
Align rotation to match a surface normal. |
GravityAlignmentModifier |
Align rotation to the gravity direction. |
TiltByVelocityModifier |
Tilt in the direction of movement based on speed. |
LookAtModifier |
Rotate to face a target point or direction. |
Animation and Oscillation¶
| Modifier | What it does |
|---|---|
OscillatorTransformModifier |
Add oscillating bob/sway while held. |
NoiseOffsetModifier |
Apply Perlin noise for organic movement. |
PendulumSwingModifier |
Swing like a pendulum when picked up. |
Smoothing and Filtering¶
| Modifier | What it does |
|---|---|
SmoothPositionModifier |
Damped position follow over time. |
SmoothRotationModifier |
Damped rotation follow over time. |
AntiJitterModifier |
Suppress small jittery movements below a threshold. |
Specialized¶
| Modifier | What it does |
|---|---|
DragPivotModifier |
Apply a grab-point offset relative to the object center. |
POIInfluenceModifier |
Attract toward nearby Points of Interest with falloff. |
ScaleByDistanceModifier |
Scale based on distance from a reference point. |
ConditionalModifier |
Wraps another modifier and only applies it when a Condition is true. |
Next Steps¶
- Restrict which objects attach where with Tag-Based Filtering
- Automate grab-hold-drop workflows with AttachingAgent
- Browse all components in the API Reference