đź’€Motion Position
Slide a layer across the frame, smoothly
- Position
This is the S4Motion node you'll reach for first, because moving a layer is the most common animation you'll actually want - a logo sliding in, a character drifting across a backdrop, a card easing into place. đź’€Motion Position is the workhorse of the pack's eight effectors.
Like every effector node in S4Motion, it does nothing on its own. Its single output, Position (an S4_POSITION_EFFECTOR), has to plug into the position_effector socket on đź’€Motion Config. That's the node that renders the frames - this one just computes where the layer is on each frame. Connect it wrong (say, into rotation_effector) and Motion Config throws a clear "effector type mismatch" error, so at least the pack tells you.
The inputs are two keyframes and a curve:
- default_x / default_y - where the layer starts (in pixels, -4096 to 4096).
- target_x / target_y - where it ends up.
- duration - seconds the move takes.
- delay - seconds of pause before the move starts.
- motion_curve -
linear,ease_in,ease_out,ease_in_out. The easing ones are where the polish lives:ease_outfor a logo settling into place,ease_in_outfor anything you want to feel deliberate. The node uses CSS-standard bezier curves when thebezierlibrary is installed and falls back to smoothstep/cubic math if it isn't - the difference is subtle at typical durations, so don't sweat it. - inverse - play the move forward then back to the start (out and back).
- loop - repeat for the whole timeline.
One thing to internalize: effector positions add on top of Motion Config's static position_x/position_y. So a default of 0,0 in this node means "no offset from wherever Motion Config's base position is." If you set a base position of 100 in Config and a target of 50 here, the layer ends at 150.
Install
Same as the whole pack:
cd ComfyUI/custom_nodes/
git clone https://github.com/S4MUEL-404/ComfyUI-S4Motion.git
pip install -r ComfyUI-S4Motion/requirements.txt
or just search "S4Motion" in ComfyUI Manager and restart. Everything shows up under đź’€S4Motion.
Gotchas
- duration vs. total time:
durationis how long the move itself takes;timeon Motion Config is the whole timeline. If your move is shorter than the timeline andloopis off, the layer holds its end position for the leftover frames. That's usually what you want. - delay is in seconds, not frames - the node converts using Motion Config's fps.
- There's no reddit discussion of this pack at all, so if you're learning from examples, the
examples/Position.jsonworkflow in the repo is the reference wiring. It's a small node; once the effector pattern clicks, you've learned this one completely.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| default_x | FLOAT | 0-4096–4096 | — |
| default_y | FLOAT | 0-4096–4096 | — |
| target_x | FLOAT | 0-4096–4096 | — |
| target_y | FLOAT | 0-4096–4096 | — |
| duration | FLOAT | 1.000–30 | — |
| delay | FLOAT | 0.000–30 | — |
| motion_curve | COMBO | linear | 4 options: linear, ease_in_out, ease_in, ease_out |
| inverse | BOOLEAN | false | — |
| loop | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| Position | S4_POSITION_EFFECTOR | — |