Nodes/SaltAI-Open-Resources/Keyframing Perlin Settings
ComfyUI Node

Keyframing Perlin Settings

Bundle 8-axis Perlin noise into one keyframing settings dict

By get-salt-AI·Created 2 years ago·Updated 2 years ago· 84
Keyframing Perlin Settings
    • opac_perlin_settings
    zoom_octaves1
    zoom_persistence0.50
    zoom_lacunarity2.00
    zoom_repeat1024
    angle_octaves1
    angle_persistence0.50
    angle_lacunarity2.00
    angle_repeat1024
    trx_octaves1
    trx_persistence0.50
    trx_lacunarity2.00
    trx_repeat1024
    try_octaves1
    try_persistence0.50
    try_lacunarity2.00
    try_repeat1024
    trz_octaves1
    trz_persistence0.50
    trz_lacunarity2.00
    trz_repeat1024
    rotx_octaves1
    rotx_persistence0.50
    rotx_lacunarity2.00
    rotx_repeat1024
    roty_octaves1
    roty_persistence0.50
    roty_lacunarity2.00
    roty_repeat1024
    rotz_octaves1
    rotz_persistence0.50
    rotz_lacunarity2.00
    rotz_repeat1024

    This one doesn't touch an image, a mask, or even a list - it's a pure configuration node. Keyframing Perlin Settings exists to solve a UI problem: if you want independent organic noise on eight different motion axes (zoom, angle, three translation axes, three rotation axes), that's 32 separate parameters to wire up. This node bundles all 32 into one settings package so a downstream keyframing node only needs one input plug instead of thirty-two.

    How it works

    Each of the eight axes - zoom, angle, trx/try/trz (translation X/Y/Z), rotx/roty/rotz (rotation X/Y/Z) - gets its own complete Perlin fractal-noise stack: octaves, persistence, lacunarity, and repeat, the same four parameters you'd see on any Perlin-based node in this pack. Having a separate stack per axis is the point: it means the zoom can wobble on a different rhythm than the rotation, which is what actually reads as natural camera movement rather than everything jittering in perfect sync (which reads as fake, or worse, motion-sick).

    The inputs and outputs that matter

    All 32 fields are required, all follow the same pattern per axis - {axis}_octaves (default 1, 1–10), {axis}_persistence (default 0.5, 0.01–1), {axis}_lacunarity (default 2, 1–4), {axis}_repeat (default 1024, 256–4096). Realistically, you're not tuning all 32 on your first pass. Get a working camera motion first, then come back and nudge one axis group at a time - say, just angle_* for a subtle rotational tremor - rather than trying to reason about all eight simultaneously.

    Output is a single opac_perlin_settings (DICT). This only does anything wired into whatever downstream node in the OPAC family actually consumes per-axis Perlin noise for camera motion - a node outside the batch covered here, so if your graph doesn't have one, this node has nothing to attach to and won't affect your render on its own.

    How to install it

    Via ComfyUI Manager, search SaltAI-Open-Resources or SaltAI, install, restart. Or manually:

    cd ComfyUI/custom_nodes
    git clone https://github.com/get-salt-AI/SaltAI
    

    then restart. No external model, no heavy dependency - it's a settings object, nothing more.

    Common issues & troubleshooting

    You changed values and nothing happened. Check that the DICT output is actually wired to a compatible downstream node - this is the single most common mistake with a pure settings node like this one. It has no effect standalone.

    You edited the wrong axis. With 32 nearly-identical widget groups stacked in the node UI, it's easy to scroll to the wrong block and tweak rotx_octaves when you meant roty_octaves. Double-check the prefix before you go hunting for why a change didn't do what you expected.

    Overkill for a simple shot. If you only need noise on one or two axes, wiring this whole 32-field node in is more setup than the job needs - check whether the downstream node you're feeding also accepts simpler per-axis inputs directly before reaching for the full settings bundle.

    CategorySALT/Animation/Keyframing

    Inputs (32)

    NameTypeDefaultDescription
    zoom_octavesINT11–10
    zoom_persistenceFLOAT0.500.01–1
    zoom_lacunarityFLOAT2.001–4
    zoom_repeatINT1024256–4096
    angle_octavesINT11–10
    angle_persistenceFLOAT0.500.01–1
    angle_lacunarityFLOAT2.001–4
    angle_repeatINT1024256–4096
    trx_octavesINT11–10
    trx_persistenceFLOAT0.500.01–1
    trx_lacunarityFLOAT2.001–4
    trx_repeatINT1024256–4096
    try_octavesINT11–10
    try_persistenceFLOAT0.500.01–1
    try_lacunarityFLOAT2.001–4
    try_repeatINT1024256–4096
    trz_octavesINT11–10
    trz_persistenceFLOAT0.500.01–1
    trz_lacunarityFLOAT2.001–4
    trz_repeatINT1024256–4096
    rotx_octavesINT11–10
    rotx_persistenceFLOAT0.500.01–1
    rotx_lacunarityFLOAT2.001–4
    rotx_repeatINT1024256–4096
    roty_octavesINT11–10
    roty_persistenceFLOAT0.500.01–1
    roty_lacunarityFLOAT2.001–4
    roty_repeatINT1024256–4096
    rotz_octavesINT11–10
    rotz_persistenceFLOAT0.500.01–1
    rotz_lacunarityFLOAT2.001–4
    rotz_repeatINT1024256–4096

    Outputs (1)

    NameTypeDescription
    opac_perlin_settingsDICT