Skip to content

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:

  1. Where should it go? (the Target)
  2. Should anything modify the path? (Modifiers - add bounce, lock an axis, avoid walls, etc.)
  3. 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.

  1. Select DestinationPoint in the Hierarchy.
  2. In the AttachmentPoint Inspector, open the Attached tab.
  3. Find the Process field. It currently shows Held Attachable Transform Pipeline.
  4. 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?

  1. In the DirectTransformPipeline you just added, find the Target field.
  2. It should already default to Transform Target. If not, click the type selector and choose it.
  3. 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 duration
  • CurveTransformTarget - follow an animation curve path
  • BlendedTransformTarget - 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.

  1. In the DirectTransformPipeline, find the Modifiers list.
  2. Click + to add an entry.
  3. 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.

  1. In the Modifiers list, click + again.
  2. Choose Axis Lock (under the Constraints category).
  3. 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.

  1. Select DestinationPoint.
  2. In the Attached tab's Process field, click the type selector and choose Physics Transform Pipeline.
  3. 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.

  1. Switch back to Direct Transform Pipeline on DestinationPoint.
  2. In the Modifiers list, add a new entry.
  3. 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