Nubu
  • Features
  • How it works
  • Pricing
  • Integrations
  • FAQ
  • Contact
  • Docs
  • Blog
  • Log in
  • Log inSign up
    Nubu

    Creative automation for teams that ship campaigns, not busywork.

    Try for free
    Product
    FeaturesNubu MotionHow it worksPricingIntegrationsFAQ
    Company
    AboutContactDocsBlogLog in
    Legal
    Privacy policyTerms of serviceData deletion
    © 2026 Bear Studios · Nubu
    Introduction
    Templates overviewInstalling Nubu BuilderAdding template compsAdding propertiesAdding footageSetting defaultsExporting your templateUploading a template
    Flows overviewAvailable nodesAdding a nodeConnecting nodesWorking with dataTemplates and outputsUsing AI nodesBuilding a creative
    CampaignsTemplatesAssetsGlossariesRendersSettings
    Connecting Meta AdsConnecting Google AdsConnecting OpenAIConnecting Gemini AI StudioConnecting Anthropic
    AI Assistant overviewPrompt examplesAssistant settings and controls
    Nubu Motion scripts: the reference
    OverviewQuick startDifferences from After EffectsDeterminism
    JavaScript supportReferences and idsProject scriptsState and timeBudgets and errorsFormatting values
    GlobalTime conversionInterpolationVector mathsRandom and noiseColour conversionOther maths
    LayerCompPropertyKeyframePathGeometryProjectComponentConsoleComponentControlExpressionControl
    The property vocabularyAnimators propertiesAudio propertiesContent propertiesContents propertiesEffects propertiesExpression controls propertiesFills propertiesInstance controls propertiesLayer propertiesLayout propertiesMasks propertiesStrokes propertiesText style propertiesRig propertiesRigging propertiesRig controllers propertiesRigging weights propertiesRigging mesh propertiesRig items propertiesRig splines propertiesRig simulation propertiesRig properties propertiesRig drivers propertiesRig draw order propertiesTransform propertiesTrim path properties
    Error codesBudgets
    Changelog
    All docs
    Motion Scripting
    / Properties

    Rig splines properties

    A rig layer's spline points by spline id and point index: position, the in and out tangent offsets and the twist - the rail a spline IK chain follows.

    The rig splines family: a rig layer's spline points by spline id and point index - position (px in the spline's parent frame: a bone's tip, a controller, or rig space), in and out (px, the tangent offsets from the point) and twist (degrees, the ribbon twist a spline IK chain reads at that point). Only KEYED point members have rows (the focus rule); every pattern reads, keyframes AND drives: a script sweeping a point's position bends the rail, and the spline IK chains aligned along it follow, which is the scripted tail wave.

    Every pattern below is readable from scripts through prop() and layer.prop(); ids in a pattern (like <effect_id>) stand for the entity's real id. Every pattern here is in the drive set: scripts may WRITE each one with set() or a single-output return, per frame.

    PatternWire kindUnitsReadsWrites
    rig.splines.<spline_id>.points.<index>.inpoint2[x, y] px (a tangent OFFSET from the point)yesdrive set
    rig.splines.<spline_id>.points.<index>.outpoint2[x, y] px (a tangent OFFSET from the point)yesdrive set
    rig.splines.<spline_id>.points.<index>.positionpoint2[x, y] px (in the spline's parent frame: a bone's tip frame, a controller's frame, or rig space)yesdrive set
    rig.splines.<spline_id>.points.<index>.twistscalardegreesyesdrive set

    Worked examples#

    A rig layer's SPLINES are its rails (RIG-W5 DYNAMICS): each point is addressed by the spline's id and the point's index - rig.splines.<spline_id>.points.<index>.position (px in the spline's parent frame: a bone's tip, a controller, or rig space), .in / .out (px, the tangent offsets from the point) and .twist (degrees). Every member reads, keyframes AND drives - and the rig's spline IK chains align along a DRIVEN rail exactly as along a keyed one (the solve reads the points through the script overlay), so a script on one point reshapes every chain that follows the rail. The summary's points stay authored (the rows posture); a driven point shows in the evaluated sample and the echo.

    Worked example: Wave the tail rail#

    The scene. A Stage comp with a four-bone Tail rig at (240, 180) - Tail 1 to Tail 4 chained left to right, 40 px each - aligned along the three-point Tail rail spline by a spline IK item on Tail 4 (chain 4, the fit stretch), and four Segment solids rigidly bound to the bones, so the rail's shape IS the tail's shape.

    • The comp Stage: 640 by 360 at 25 fps, 100 frames (4 seconds).
    • Tail: a rig layer, at [240, 180].
      • The skeleton: Tail 1 (bone_1, a root) from [0, 0] at 0 degrees for 40 px; Tail 2 (bone_2, under Tail 1) at 0 degrees for 40 px; Tail 3 (bone_3, under Tail 2) at 0 degrees for 40 px; Tail 4 (bone_4, under Tail 3) at 0 degrees for 40 px.
      • The splines: Tail rail (spline_1, rig space): 3 points from [0, 0] to [160, 10].
      • The items: rigging_1 - a spline IK item on the Tail 4 aligned along the Tail rail spline (chain 4, fit).
    • Segment 1: a solid layer, at [240, 180], 40 by 12, filled #ff6b6b.
      • The rigging stack: rigging_2 - a rigid binding to the Tail rig's Tail 1.
    • Segment 2: a solid layer, at [280, 180], 40 by 12, filled #4ecdc4.
      • The rigging stack: rigging_3 - a rigid binding to the Tail rig's Tail 2.
    • Segment 3: a solid layer, at [320, 180], 40 by 12, filled #ffe66d.
      • The rigging stack: rigging_4 - a rigid binding to the Tail rig's Tail 3.
    • Segment 4: a solid layer, at [360, 180], 40 by 12, filled #a29bfe.
      • The rigging stack: rigging_5 - a rigid binding to the Tail rig's Tail 4.

    The script. Add a project script named Rail wave and paste:

    export const outputs = ["layer_1:rig.splines.spline_1.points.1.position"];
    
    export function frame() {
      return [80, linear(time, 0, 2, -30, 30)];
    }
    

    Line by line:

    • Line 1: One output: the POSITION of the Tail rail's middle point (index 1 - the points count from 0). A spline point is addressed by its spline's id and its index - rig.splines.<spline_id>.points.<index>.position - and reads in the spline's parent frame (rig space here), in pixels.
    • Line 4: The x stays 80; linear() maps the first two seconds onto the y from -30 up to 30 and holds 30 after that. The rail bends from an arch into a dip, and the Tail rig's spline IK item re-aligns all four bones along the driven rail every frame - the four Segment solids bound to the bones follow. The point's own authored value [80, -30] is dormant while the script drives: the summary still reports it (the rows posture), the evaluated sample and the echo report the driven point.

    What you see. The tail starts arched up over the middle of the rail, flattens through level at one second and ends dipped down from two seconds on, the four segments hugging the rail throughout - at one second the middle point reads [80, 0], from two seconds on [80, 30].

    The tail starts arched up over the middle of the rail, flattens through level at one second and ends dipped down from two seconds on, the four segments hugging the rail throughout - at one second the middle point reads [80, 0], from two seconds on [80, 30].